remove suidregister
[comedilib.git] / lib / cmd.c
1
2 #include <stdio.h>
3 #include <comedilib.h>
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <sys/ioctl.h>
7 #include <errno.h>
8 #include <getopt.h>
9 #include <ctype.h>
10 #include <math.h>
11 #include <sys/time.h>
12 #include <string.h>
13
14 #include <libinternal.h>
15
16
17 int comedi_get_cmd_src_mask(comedi_t *it,unsigned int subd,comedi_cmd *cmd)
18 {
19         subdevice *s;
20         int ret;
21
22         if(!valid_subd(it,subd))return -1;
23
24         s=it->subdevices+subd;
25
26         if(s->cmd_mask_errno){
27                 errno = s->cmd_mask_errno;
28                 return -1;
29         }
30
31         if(!s->cmd_mask){
32                 comedi_cmd *mask;
33
34                 mask = malloc(sizeof(comedi_cmd));
35
36                 memset(mask,0,sizeof(*cmd));
37
38                 mask->subdev = subd;
39                 mask->flags = 0;
40                 mask->start_src = TRIG_ANY;
41                 mask->scan_begin_src = TRIG_ANY;
42                 mask->convert_src = TRIG_ANY;
43                 mask->scan_end_src = TRIG_ANY;
44                 mask->stop_src = TRIG_ANY;
45
46                 s->cmd_mask = mask;
47
48                 ret = comedi_command_test(it,mask);
49                 if(ret<0){
50                         s->cmd_mask_errno = errno;
51                         return -1;
52                 }
53         }
54         *cmd=*s->cmd_mask;
55         return 0;
56 }
57
58 static int __generic_timed(comedi_t *it,unsigned int s,
59         comedi_cmd *cmd, unsigned int ns)
60 {
61         int ret;
62
63         ret = comedi_get_cmd_src_mask(it,s,cmd);
64         if(ret<0)return ret;
65
66         __comedi_errno = ENOTSUPPORTED;
67
68         if(cmd->start_src&TRIG_NOW){
69                 cmd->start_src=TRIG_NOW;
70                 cmd->start_arg=0;
71         }else if(cmd->start_src&TRIG_FOLLOW){
72                 cmd->start_src=TRIG_FOLLOW;
73                 cmd->start_arg=0;
74         }else{
75                 DEBUG(3,"can't find good start_src\n");
76                 return -1;
77         }
78
79         /* Potential bug: there is a possibility that the source mask may
80          * have * TRIG_TIMER set for both convert_src and scan_begin_src,
81          * but they may not be supported together. */
82         if(cmd->convert_src&TRIG_TIMER){
83                 if(cmd->scan_begin_src&TRIG_FOLLOW){
84                         cmd->convert_src = TRIG_TIMER;
85                         cmd->convert_arg = ns;
86                         cmd->scan_begin_src = TRIG_FOLLOW;
87                         cmd->scan_begin_arg = 0;
88                 }else{
89                         cmd->convert_src = TRIG_TIMER;
90                         cmd->convert_arg = ns;
91                         cmd->scan_begin_src = TRIG_TIMER;
92                         cmd->scan_begin_arg = ns;
93                 }
94         }else if(cmd->convert_src & TRIG_NOW &&
95                 cmd->scan_begin_src & TRIG_TIMER)
96         {
97                 cmd->convert_src = TRIG_NOW;
98                 cmd->convert_arg = 0;
99                 cmd->scan_begin_src = TRIG_TIMER;
100                 cmd->scan_begin_arg = ns;
101         }else{
102                 DEBUG(3,"comedi_get_cmd_generic_timed: can't do timed?\n");
103                 return -1;
104         }
105
106         cmd->scan_end_src = TRIG_COUNT;
107         cmd->scan_end_arg = 1;
108
109         if(cmd->stop_src&TRIG_COUNT){
110                 cmd->stop_src=TRIG_COUNT;
111                 cmd->stop_arg=2;
112         }else if(cmd->stop_src&TRIG_NONE){
113                 cmd->stop_src=TRIG_NONE;
114                 cmd->stop_arg=0;
115         }else{
116                 DEBUG(3,"comedi_get_cmd_generic_timed: can't find a good stop_src\n");
117                 return -1;
118         }
119
120         cmd->chanlist_len = 1;
121
122         ret=comedi_command_test(it,cmd);
123         DEBUG(3,"comedi_get_cmd_generic_timed: test 1 returned %d\n",ret);
124         if(ret==3){
125                 /* good */
126                 ret=comedi_command_test(it,cmd);
127                 DEBUG(3,"comedi_get_cmd_generic_timed: test 2 returned %d\n",ret);
128         }
129         if(ret==4 || ret==0){
130                 __comedi_errno = 0;
131                 return 0;
132         }
133         return -1;
134 }
135
136 int comedi_get_cmd_generic_timed(comedi_t *it,unsigned int subd,comedi_cmd *cmd,
137         unsigned int ns)
138 {
139         subdevice *s;
140         int ret;
141
142         if(!valid_subd(it,subd))return -1;
143
144         s=it->subdevices+subd;
145
146         if(s->cmd_timed_errno){
147                 errno = s->cmd_mask_errno;
148                 return -1;
149         }
150
151         if(!s->cmd_timed){
152                 s->cmd_timed = malloc(sizeof(comedi_cmd));
153
154                 ret = __generic_timed(it,subd,s->cmd_timed,ns);
155                 if(ret<0){
156                         s->cmd_mask_errno = errno;
157                         return -1;
158                 }
159         }
160         *cmd=*s->cmd_timed;
161         return 0;
162 }
163