diff options
author | Wincent Balin <wincent@rockbox.org> | 2010-06-03 00:39:13 +0000 |
---|---|---|
committer | Wincent Balin <wincent@rockbox.org> | 2010-06-03 00:39:13 +0000 |
commit | c1ae4414d4ac6504992434b949b252c30daf0c48 (patch) | |
tree | 696c5781e9a00cea694117eb3ef404d37f10930e /apps/plugins/pdbox/PDa/extra/shell.c | |
parent | 5edd8cf736232a240e2f4f47eb847e1901d18379 (diff) | |
download | rockbox-c1ae4414d4ac6504992434b949b252c30daf0c48.tar.gz rockbox-c1ae4414d4ac6504992434b949b252c30daf0c48.zip |
pdbox: Source cleanup. Removed unneeded files.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26497 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/pdbox/PDa/extra/shell.c')
-rw-r--r-- | apps/plugins/pdbox/PDa/extra/shell.c | 312 |
1 files changed, 0 insertions, 312 deletions
diff --git a/apps/plugins/pdbox/PDa/extra/shell.c b/apps/plugins/pdbox/PDa/extra/shell.c deleted file mode 100644 index 8653c63ff4..0000000000 --- a/apps/plugins/pdbox/PDa/extra/shell.c +++ /dev/null | |||
@@ -1,312 +0,0 @@ | |||
1 | /* (C) Guenter Geiger <geiger@epy.co.at> */ | ||
2 | |||
3 | #include "../src/m_pd.h" | ||
4 | #ifdef NT | ||
5 | #pragma warning( disable : 4244 ) | ||
6 | #pragma warning( disable : 4305 ) | ||
7 | #endif | ||
8 | |||
9 | #include <unistd.h> | ||
10 | #include <stdlib.h> | ||
11 | #include <string.h> | ||
12 | #include <stdio.h> | ||
13 | #include <sys/types.h> | ||
14 | #include <sys/wait.h> | ||
15 | #include <signal.h> | ||
16 | #include <sched.h> | ||
17 | |||
18 | void sys_rmpollfn(int fd); | ||
19 | void sys_addpollfn(int fd, void* fn, void *ptr); | ||
20 | |||
21 | /* ------------------------ shell ----------------------------- */ | ||
22 | |||
23 | #define INBUFSIZE 1024 | ||
24 | |||
25 | static t_class *shell_class; | ||
26 | |||
27 | |||
28 | static void drop_priority(void) | ||
29 | { | ||
30 | #ifdef _POSIX_PRIORITY_SCHEDULING | ||
31 | struct sched_param par; | ||
32 | int p1 ,p2, p3; | ||
33 | par.sched_priority = 0; | ||
34 | sched_setscheduler(0,SCHED_OTHER,&par); | ||
35 | #endif | ||
36 | } | ||
37 | |||
38 | |||
39 | typedef struct _shell | ||
40 | { | ||
41 | t_object x_obj; | ||
42 | int x_echo; | ||
43 | char *sr_inbuf; | ||
44 | int sr_inhead; | ||
45 | int sr_intail; | ||
46 | void* x_binbuf; | ||
47 | int fdpipe[2]; | ||
48 | int fdinpipe[2]; | ||
49 | int pid; | ||
50 | int x_del; | ||
51 | t_outlet* x_done; | ||
52 | t_clock* x_clock; | ||
53 | } t_shell; | ||
54 | |||
55 | static int shell_pid; | ||
56 | |||
57 | |||
58 | void shell_cleanup(t_shell* x) | ||
59 | { | ||
60 | sys_rmpollfn(x->fdpipe[0]); | ||
61 | |||
62 | if (x->fdpipe[0]>0) close(x->fdpipe[0]); | ||
63 | if (x->fdpipe[1]>0) close(x->fdpipe[1]); | ||
64 | if (x->fdinpipe[0]>0) close(x->fdinpipe[0]); | ||
65 | if (x->fdinpipe[1]>0) close(x->fdinpipe[1]); | ||
66 | |||
67 | x->fdpipe[0] = -1; | ||
68 | x->fdpipe[1] = -1; | ||
69 | x->fdinpipe[0] = -1; | ||
70 | x->fdinpipe[1] = -1; | ||
71 | clock_unset(x->x_clock); | ||
72 | } | ||
73 | |||
74 | void shell_check(t_shell* x) | ||
75 | { | ||
76 | int ret; | ||
77 | int status; | ||
78 | ret = waitpid(x->pid,&status,WNOHANG); | ||
79 | if (ret == x->pid) { | ||
80 | shell_cleanup(x); | ||
81 | if (WIFEXITED(status)) { | ||
82 | outlet_float(x->x_done,WEXITSTATUS(status)); | ||
83 | } | ||
84 | else outlet_float(x->x_done,0); | ||
85 | } | ||
86 | else { | ||
87 | if (x->x_del < 100) x->x_del+=2; /* increment poll times */ | ||
88 | clock_delay(x->x_clock,x->x_del); | ||
89 | } | ||
90 | } | ||
91 | |||
92 | |||
93 | void shell_bang(t_shell *x) | ||
94 | { | ||
95 | post("bang"); | ||
96 | } | ||
97 | |||
98 | /* snippet from pd's code */ | ||
99 | static void shell_doit(void *z, t_binbuf *b) | ||
100 | { | ||
101 | t_shell *x = (t_shell *)z; | ||
102 | int msg, natom = binbuf_getnatom(b); | ||
103 | t_atom *at = binbuf_getvec(b); | ||
104 | |||
105 | for (msg = 0; msg < natom;) | ||
106 | { | ||
107 | int emsg; | ||
108 | for (emsg = msg; emsg < natom && at[emsg].a_type != A_COMMA | ||
109 | && at[emsg].a_type != A_SEMI; emsg++) | ||
110 | ; | ||
111 | if (emsg > msg) | ||
112 | { | ||
113 | int i; | ||
114 | for (i = msg; i < emsg; i++) | ||
115 | if (at[i].a_type == A_DOLLAR || at[i].a_type == A_DOLLSYM) | ||
116 | { | ||
117 | pd_error(x, "netreceive: got dollar sign in message"); | ||
118 | goto nodice; | ||
119 | } | ||
120 | if (at[msg].a_type == A_FLOAT) | ||
121 | { | ||
122 | if (emsg > msg + 1) | ||
123 | outlet_list(x->x_obj.ob_outlet, 0, emsg-msg, at + msg); | ||
124 | else outlet_float(x->x_obj.ob_outlet, at[msg].a_w.w_float); | ||
125 | } | ||
126 | else if (at[msg].a_type == A_SYMBOL) | ||
127 | outlet_anything(x->x_obj.ob_outlet, at[msg].a_w.w_symbol, | ||
128 | emsg-msg-1, at + msg + 1); | ||
129 | } | ||
130 | nodice: | ||
131 | msg = emsg + 1; | ||
132 | } | ||
133 | } | ||
134 | |||
135 | |||
136 | void shell_read(t_shell *x, int fd) | ||
137 | { | ||
138 | char buf[INBUFSIZE]; | ||
139 | t_binbuf* bbuf = binbuf_new(); | ||
140 | int i; | ||
141 | int readto = | ||
142 | (x->sr_inhead >= x->sr_intail ? INBUFSIZE : x->sr_intail-1); | ||
143 | int ret; | ||
144 | |||
145 | ret = read(fd, buf,INBUFSIZE-1); | ||
146 | buf[ret] = '\0'; | ||
147 | |||
148 | for (i=0;i<ret;i++) | ||
149 | if (buf[i] == '\n') buf[i] = ';'; | ||
150 | if (ret < 0) | ||
151 | { | ||
152 | error("shell: pipe read error"); | ||
153 | sys_rmpollfn(fd); | ||
154 | x->fdpipe[0] = -1; | ||
155 | close(fd); | ||
156 | return; | ||
157 | } | ||
158 | else if (ret == 0) | ||
159 | { | ||
160 | post("EOF on socket %d\n", fd); | ||
161 | sys_rmpollfn(fd); | ||
162 | x->fdpipe[0] = -1; | ||
163 | close(fd); | ||
164 | return; | ||
165 | } | ||
166 | else | ||
167 | { | ||
168 | int natom; | ||
169 | t_atom *at; | ||
170 | binbuf_text(bbuf, buf, strlen(buf)); | ||
171 | |||
172 | natom = binbuf_getnatom(bbuf); | ||
173 | at = binbuf_getvec(bbuf); | ||
174 | shell_doit(x,bbuf); | ||
175 | } | ||
176 | binbuf_free(bbuf); | ||
177 | } | ||
178 | |||
179 | |||
180 | static void shell_send(t_shell *x, t_symbol *s,int ac, t_atom *at) | ||
181 | { | ||
182 | int i; | ||
183 | char tmp[MAXPDSTRING]; | ||
184 | int size = 0; | ||
185 | |||
186 | if (x->fdinpipe[0] == -1) return; /* nothing to send to */ | ||
187 | |||
188 | for (i=0;i<ac;i++) { | ||
189 | atom_string(at,tmp+size,MAXPDSTRING - size); | ||
190 | at++; | ||
191 | size=strlen(tmp); | ||
192 | tmp[size++] = ' '; | ||
193 | } | ||
194 | tmp[size-1] = '\0'; | ||
195 | post("sending %s",tmp); | ||
196 | write(x->fdinpipe[0],tmp,strlen(tmp)); | ||
197 | } | ||
198 | |||
199 | static void shell_anything(t_shell *x, t_symbol *s, int ac, t_atom *at) | ||
200 | { | ||
201 | int i; | ||
202 | char* argv[20]; | ||
203 | t_symbol* sym; | ||
204 | |||
205 | if (!strcmp(s->s_name,"send")) { | ||
206 | post("send"); | ||
207 | shell_send(x,s,ac,at); | ||
208 | return; | ||
209 | } | ||
210 | |||
211 | argv[0] = s->s_name; | ||
212 | |||
213 | if (x->fdpipe[0] != -1) { | ||
214 | post("shell: old process still running"); | ||
215 | kill(x->pid,SIGKILL); | ||
216 | shell_cleanup(x); | ||
217 | } | ||
218 | |||
219 | |||
220 | if (pipe(x->fdpipe) < 0) { | ||
221 | error("unable to create pipe"); | ||
222 | return; | ||
223 | } | ||
224 | |||
225 | if (pipe(x->fdinpipe) < 0) { | ||
226 | error("unable to create input pipe"); | ||
227 | return; | ||
228 | } | ||
229 | |||
230 | |||
231 | sys_addpollfn(x->fdpipe[0],shell_read,x); | ||
232 | |||
233 | if (!(x->pid = fork())) { | ||
234 | int status; | ||
235 | char* cmd = getbytes(1024); | ||
236 | char* tcmd = getbytes(1024); | ||
237 | strcpy(cmd,s->s_name); | ||
238 | |||
239 | #if 0 | ||
240 | for (i=1;i<=ac;i++) { | ||
241 | argv[i] = getbytes(255); | ||
242 | atom_string(at,argv[i],255); | ||
243 | /* post("argument %s",argv[i]); */ | ||
244 | at++; | ||
245 | } | ||
246 | argv[i] = 0; | ||
247 | #endif | ||
248 | for (i=1;i<=ac;i++) { | ||
249 | atom_string(at,tcmd,255); | ||
250 | strcat(cmd," "); | ||
251 | strcat(cmd,tcmd); | ||
252 | at++; | ||
253 | } | ||
254 | |||
255 | |||
256 | /* reassign stdout */ | ||
257 | dup2(x->fdpipe[1],1); | ||
258 | dup2(x->fdinpipe[1],0); | ||
259 | |||
260 | /* drop privileges */ | ||
261 | drop_priority(); | ||
262 | seteuid(getuid()); /* lose setuid priveliges */ | ||
263 | |||
264 | post("executing %s",cmd); | ||
265 | system(cmd); | ||
266 | // execvp(s->s_name,argv); | ||
267 | exit(0); | ||
268 | } | ||
269 | x->x_del = 4; | ||
270 | clock_delay(x->x_clock,x->x_del); | ||
271 | |||
272 | if (x->x_echo) | ||
273 | outlet_anything(x->x_obj.ob_outlet, s, ac, at); | ||
274 | } | ||
275 | |||
276 | |||
277 | |||
278 | void shell_free(t_shell* x) | ||
279 | { | ||
280 | binbuf_free(x->x_binbuf); | ||
281 | } | ||
282 | |||
283 | static void *shell_new(void) | ||
284 | { | ||
285 | t_shell *x = (t_shell *)pd_new(shell_class); | ||
286 | |||
287 | x->x_echo = 0; | ||
288 | x->fdpipe[0] = -1; | ||
289 | x->fdpipe[1] = -1; | ||
290 | x->fdinpipe[0] = -1; | ||
291 | x->fdinpipe[1] = -1; | ||
292 | |||
293 | x->sr_inhead = x->sr_intail = 0; | ||
294 | if (!(x->sr_inbuf = (char*) malloc(INBUFSIZE))) bug("t_shell");; | ||
295 | |||
296 | x->x_binbuf = binbuf_new(); | ||
297 | |||
298 | outlet_new(&x->x_obj, &s_list); | ||
299 | x->x_done = outlet_new(&x->x_obj, &s_bang); | ||
300 | x->x_clock = clock_new(x, (t_method) shell_check); | ||
301 | return (x); | ||
302 | } | ||
303 | |||
304 | void shell_setup(void) | ||
305 | { | ||
306 | shell_class = class_new(gensym("shell"), (t_newmethod)shell_new, | ||
307 | (t_method)shell_free,sizeof(t_shell), 0,0); | ||
308 | class_addbang(shell_class,shell_bang); | ||
309 | class_addanything(shell_class, shell_anything); | ||
310 | } | ||
311 | |||
312 | |||