Author: zhengda
(2008/08/16 14:58) Almost 4 years ago
Use the GNU coding style.
47
return p;
48
}
49
50
void task_clean_routine (void *port)
void
51
task_clean_routine (void *port)
{
52
vpstruct_t proc = port;
53
hurd_ihash_locp_remove (&proc_ht, proc->p_task_hashloc);
54
...
55
mach_port_deallocate (mach_task_self (), proc->task_id);
56
57
58
vpstruct_t create_task (task_t task)
59
vpstruct_t
60
create_task (task_t task)
61
vpstruct_t proc;
62
error_t err = ports_create_port (proc_class, proc_bucket,
63
69
return proc;
71
70
72
73
vpstruct_t find_task (task_t task)
74
75
find_task (task_t task)
76
return hurd_ihash_find (&proc_ht, task) ? : create_task (task);
77
78
79
int request_server (mach_msg_header_t *inp, mach_msg_header_t *outp)
80
int
81
request_server (mach_msg_header_t *inp, mach_msg_header_t *outp)
82
extern boolean_t process_server (mach_msg_header_t *, mach_msg_header_t *);
83
return process_server (inp, outp);
84
85
86
void print_cmd(int argc , char *argv[])
87
88
print_cmd (int argc, char *argv[])
89
int i;
90
for(i=0 ; i < argc ; i++){
91
for (i = 0; i < argc; i++)
debug("%s " , argv[i]);
92
93
debug ("%s ", argv[i]);
debug("\n");
94
95
debug ("\n");
96
97
int main (int argc, char *argv[])
98
99
main (int argc, char *argv[])
100
error_t err;
101
vpstruct_t child_proc;
102
pid_t child_pid;
107
task_t child_task;
108
109
103
if(argc <= 1){
110
if (argc <= 1)
104
fprintf(stderr , "%s command\n" , argv[0]);
111
error (1, 0, "%s command\n" , argv[0]);
105
exit(1);
106
if(pipe(pipe_fd1s) < 0){
perror("pipe");
exit(2);
if(pipe(pipe_fd2s) < 0){
112
113
114
115
116
err=mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_DEAD_NAME,
if (pipe (pipe_fd1s) < 0)
117
&proc_port);
error (2, errno, "pipe");
118
if(err != KERN_SUCCESS)
if (pipe (pipe_fd2s) < 0)
119
error (2 , err , "mach_port_allocate");
120
121
child_pid=fork();
err = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_DEAD_NAME,
122
if(child_pid < 0)
123
error(2 , errno , "fork");
if (err != KERN_SUCCESS)
124
else if(child_pid == 0){
error (2, err, "mach_port_allocate");
child_pid = fork ();
if (child_pid < 0)
125
error (2, errno, "fork");
126
else if (child_pid == 0)
127
/* generate a new process group for child process,
128
* it's needed to set the child process group to foreground */
129
setpgid(getpid() , getpid());
130
setpgid (getpid (), getpid ());
131
close(pipe_fd1s[1]);
132
close (pipe_fd1s[1]);
close(pipe_fd2s[0]);
133
close (pipe_fd2s[0]);
134
debug("child process starts\n");
135
debug ("child process starts\n");
read(pipe_fd1s[0] , &proc_port , sizeof(proc_port));
136
read (pipe_fd1s[0], &proc_port, sizeof (proc_port));
print_cmd(argc-1 , &argv[1]);
137
print_cmd (argc-1, &argv[1]);
write(pipe_fd2s[1] , &proc_port, sizeof(proc_port));
138
write (pipe_fd2s[1], &proc_port, sizeof (proc_port));
139
setproc(proc_port);
140
setproc (proc_port);
debug("child: current proc is %d\n" , getproc());
141
debug ("child: current proc is %d\n", getproc ());
if(execvp(argv[1] , &argv[1]) < 0)
142
if (execvp (argv[1], &argv[1]) < 0)
error(2 , errno , "execvp");
143
error (2, errno, "execvp");
144
145
debug("create a child process %d\n" , child_pid);
146
debug ("create a child process %d\n", child_pid);
147
/* Set the child process group as the foreground group. */
148
tcsetpgrp(fileno(stdout) , child_pid);
149
tcsetpgrp (fileno (stdout), child_pid);
150
close(pipe_fd1s[0]);
151
close (pipe_fd1s[0]);
close(pipe_fd2s[1]);
152
close (pipe_fd2s[1]);
153
proc_bucket = ports_create_bucket ();
154
proc_class = ports_create_class (task_clean_routine, 0);
155
156
/* Make the send right to the proc porxy in the child process. */
157
child_task=pid2task(child_pid);
158
child_task = pid2task (child_pid);
err=mach_port_destroy(child_task , proc_port);
159
err = mach_port_destroy (child_task, proc_port);
160
error (2 , err , "mach_port_destroy");
161
error (2, err, "mach_port_destroy");
child_proc = create_task (child_task);
162
receive_port = ports_get_right (child_proc);
163
err=mach_port_insert_right(child_task , proc_port , receive_port ,
164
err = mach_port_insert_right (child_task, proc_port, receive_port,
MACH_MSG_TYPE_MAKE_SEND);
165
166
error (2 , err , "mach_port_insert_right");
167
error (2, err, "mach_port_insert_right");
168
/* Tell the child the send right. */
169
write(pipe_fd1s[1] , &proc_port , sizeof(proc_port));
170
write (pipe_fd1s[1], &proc_port, sizeof(proc_port));
/* Synchronize. The child process should run first. */
171
read(pipe_fd2s[0] , &proc_port, sizeof(proc_port));
172
read (pipe_fd2s[0], &proc_port, sizeof(proc_port));
173
proc_task2proc (getproc(), child_task, &child_proc->proc);
174
175
while(1)
176
while (1)
177
int status;
178
int ret;
179
request_server, 500);
182
180
ret = waitpid (child_pid, &status, WNOHANG);
183
181
if (ret < 0)
184
error (1, errno, "waitpid");
185
186
/* if the child process exits */
187
if (ret == 1 && WIFEXITED (status))
188
break;
189
190
191
debug("proc proxy exits\n");
192
debug ("proc proxy exits\n");
193
return 0;
194
195
64
65
vpstruct_t reqport_find (mach_port_t port);
66
vpstruct_t find_task (task_t task);
67
mach_port_t my_get_reply_port(void);
mach_port_t my_get_reply_port (void);
68
#endif
21
22
#include "process_S.h"
23
24
kern_return_t p_proc_getprivports(vpstruct_t process, mach_port_t *host_priv,
kern_return_t
25
mach_port_t *device_master)
p_proc_getprivports (vpstruct_t process, mach_port_t *host_priv,
26
27
kern_return_t ret;
28
debug ("task id: %d\n", process->task_id);
29
37
return ret;
38
39
40
kern_return_t p_proc_getallpids (vpstruct_t process, pidarray_t *pidarray,
41
mach_msg_type_number_t *pidarrayCnt)
42
p_proc_getallpids (vpstruct_t process, pidarray_t *pidarray,
43
44
45
return proc_getallpids(getproc(), pidarray, pidarrayCnt);
46
return proc_getallpids (getproc (), pidarray, pidarrayCnt);
kern_return_t p_proc_setexecdata (vpstruct_t process, portarray_t ports,
mach_msg_type_number_t portsCnt, intarray_t ints,
p_proc_setexecdata (vpstruct_t process, portarray_t ports,
mach_msg_type_number_t intsCnt)
return proc_setexecdata(process->proc, ports , MACH_MSG_TYPE_COPY_SEND ,
return proc_setexecdata (process->proc, ports, MACH_MSG_TYPE_COPY_SEND,
portsCnt, ints, intsCnt);
kern_return_t p_proc_getexecdata (vpstruct_t process, portarray_t *ports,
mach_msg_type_name_t *portsPoly, mach_msg_type_number_t *portsCnt,
p_proc_getexecdata (vpstruct_t process, portarray_t *ports,
intarray_t *ints, mach_msg_type_number_t *intsCnt)
mach_msg_type_name_t *portsPoly,
mach_msg_type_number_t *portsCnt,
ret=proc_getexecdata(process->proc, ports, portsCnt, ints, intsCnt);
ret = proc_getexecdata (process->proc, ports, portsCnt, ints, intsCnt);
if(ret == 0)
if (ret == 0)
*portsPoly=MACH_MSG_TYPE_MOVE_SEND;
*portsPoly = MACH_MSG_TYPE_MOVE_SEND;
kern_return_t p_proc_execdata_notify (vpstruct_t process, mach_port_t notify)
p_proc_execdata_notify (vpstruct_t process, mach_port_t notify)
return proc_execdata_notify(process->proc, notify , MACH_MSG_TYPE_MOVE_SEND);
return proc_execdata_notify (process->proc, notify, MACH_MSG_TYPE_MOVE_SEND);
kern_return_t p_proc_uname (vpstruct_t process, utsname_t *uname)
p_proc_uname (vpstruct_t process, utsname_t *uname)
return proc_uname(process->proc, uname);
return proc_uname (process->proc, uname);
kern_return_t p_proc_register_version (vpstruct_t process, mach_port_t credential,
string_t name, string_t release, string_t version)
p_proc_register_version (vpstruct_t process, mach_port_t credential,
return proc_register_version(process->proc, credential, name, release, version);
return proc_register_version (process->proc, credential,
name, release, version);
kern_return_t p_proc_reauthenticate (vpstruct_t process, mach_port_t rendezvous2)
p_proc_reauthenticate (vpstruct_t process, mach_port_t rendezvous2)
return proc_reauthenticate(process->proc, rendezvous2 , MACH_MSG_TYPE_MOVE_SEND);
return proc_reauthenticate (process->proc, rendezvous2,
MACH_MSG_TYPE_MOVE_SEND);
kern_return_t p_proc_child (vpstruct_t process, mach_port_t child)
p_proc_child (vpstruct_t process, mach_port_t child)
debug ("task id: %d, child task: %d\n", process->task_id, child);
return proc_child(process->proc, child);
return proc_child (process->proc, child);
kern_return_t p_proc_setmsgport (vpstruct_t process, mach_port_t reply_port,
mach_msg_type_name_t reply_portPoly, mach_port_t newmsgport,
p_proc_setmsgport (vpstruct_t process, mach_port_t reply_port,
mach_port_t *oldmsgport, mach_msg_type_name_t *oldmsgportPoly)
kern_return_t ret=0;
ret=proc_setmsgport(process->proc, newmsgport, oldmsgport);
ret = proc_setmsgport (process->proc, newmsgport, oldmsgport);
if(ret == 0){
if (ret == 0){
*oldmsgportPoly=MACH_MSG_TYPE_MOVE_SEND;
*oldmsgportPoly = MACH_MSG_TYPE_MOVE_SEND;
debug("p_proc_setmsgport succeeds\n");
debug ("p_proc_setmsgport succeeds\n");
kern_return_t p_proc_getmsgport (vpstruct_t process, mach_port_t reply_port,
mach_msg_type_name_t reply_portPoly, pid_t pid, mach_port_t *msgport)
p_proc_getmsgport (vpstruct_t process, mach_port_t reply_port,
mach_msg_type_name_t reply_portPoly, pid_t pid,
mach_port_t *msgport)
return proc_getmsgport(getproc(), pid , msgport);
return proc_getmsgport (getproc(), pid, msgport);
kern_return_t p_proc_reassign (vpstruct_t process, mach_port_t newtask)
p_proc_reassign (vpstruct_t process, mach_port_t newtask)
return proc_reassign(process->proc , newtask);
return proc_reassign (process->proc, newtask);
kern_return_t p_proc_setowner (vpstruct_t process, uid_t owner, int clear)
p_proc_setowner (vpstruct_t process, uid_t owner, int clear)
return proc_setowner(process->proc, owner, clear);
return proc_setowner (process->proc, owner, clear);
kern_return_t p_proc_getpids (vpstruct_t process, pid_t *pid,
pid_t *ppid, int *orphaned)
p_proc_getpids (vpstruct_t process, pid_t *pid,
return proc_getpids(process->proc , pid , ppid , orphaned);
return proc_getpids (process->proc, pid, ppid, orphaned);
kern_return_t p_proc_set_arg_locations (vpstruct_t process, vm_address_t argv,
vm_address_t envp)
p_proc_set_arg_locations (vpstruct_t process, vm_address_t argv,
kern_return_t p_proc_get_arg_locations (vpstruct_t process, vm_address_t *argv,
vm_address_t *envp)
p_proc_get_arg_locations (vpstruct_t process, vm_address_t *argv,
return proc_get_arg_locations(process->proc , argv , envp);
return proc_get_arg_locations (process->proc, argv, envp);
kern_return_t p_proc_wait (vpstruct_t process, mach_port_t reply_port,
mach_msg_type_name_t reply_portPoly, pid_t pid, int options,
p_proc_wait (vpstruct_t process, mach_port_t reply_port,
int *status, int *sigcode, rusage_t *rusage, pid_t *pid_status)
return proc_wait(process->proc , pid , options , status , sigcode ,
return proc_wait (process->proc, pid, options, status, sigcode,
rusage , pid_status);
rusage, pid_status);
kern_return_t p_proc_dostop (vpstruct_t process, mach_port_t contthread)
p_proc_dostop (vpstruct_t process, mach_port_t contthread)
// process_t actual_proc;
// ret = proc_task2proc (getproc (), process->task_id, &actual_proc);
// if (ret)
// error (3, ret, "proc_task2proc");
196
ret = proc_dostop(process->proc /*actual_proc*/ , contthread);
197
ret = proc_dostop(process->proc /*actual_proc*/, contthread);
if (ret)
198
error (4, ret, "proc_dostop");
199
200
201
202
kern_return_t p_proc_handle_exceptions (vpstruct_t process, mach_port_t msgport,
203
mach_port_t forwardport, int flavor, thread_state_t new_state,
204
p_proc_handle_exceptions (vpstruct_t process, mach_port_t msgport,
mach_msg_type_number_t new_stateCnt)
205
mach_port_t forwardport, int flavor,
206
thread_state_t new_state,
207
208
209
return proc_handle_exceptions(process->proc , msgport , forwardport ,
210
return proc_handle_exceptions (process->proc, msgport, forwardport,
MACH_MSG_TYPE_MOVE_SEND , flavor , new_state , new_stateCnt);
211
MACH_MSG_TYPE_MOVE_SEND, flavor,
212
new_state, new_stateCnt);
213
214
kern_return_t p_proc_mark_stop (vpstruct_t process, int signo, int sigcode)
215
216
p_proc_mark_stop (vpstruct_t process, int signo, int sigcode)
217
218
return proc_mark_stop(process->proc , signo , sigcode);
219
return proc_mark_stop (process->proc, signo, sigcode);
220
221
kern_return_t p_proc_mark_cont (vpstruct_t process)
222
223
p_proc_mark_cont (vpstruct_t process)
224
225
return proc_mark_cont(process->proc);
226
return proc_mark_cont (process->proc);
227
228
kern_return_t p_proc_mark_exit (vpstruct_t process, int status, int sigcode)
229
230
p_proc_mark_exit (vpstruct_t process, int status, int sigcode)
231
232
return proc_mark_exit(process->proc , status , sigcode);
233
return proc_mark_exit (process->proc, status, sigcode);
234
235
kern_return_t p_proc_mark_traced (vpstruct_t process)
236
237
p_proc_mark_traced (vpstruct_t process)
238
239
return proc_mark_traced(process->proc);
240
return proc_mark_traced (process->proc);
241
242
kern_return_t p_proc_mark_exec (vpstruct_t process)
243
244
p_proc_mark_exec (vpstruct_t process)
245
246
return proc_mark_exec(process->proc);
247
return proc_mark_exec (process->proc);
248
249
kern_return_t p_proc_mod_stopchild (vpstruct_t process, int doit)
250
251
p_proc_mod_stopchild (vpstruct_t process, int doit)
252
253
return proc_mod_stopchild(process->proc , doit);
254
return proc_mod_stopchild (process->proc , doit);
255
256
kern_return_t p_proc_pid2task (vpstruct_t process, pid_t pid, mach_port_t *task)
257
258
p_proc_pid2task (vpstruct_t process, pid_t pid, mach_port_t *task)
259
260
ret = proc_pid2task(getproc() , pid , task);
261
ret = proc_pid2task (getproc (), pid, task);
debug("pid: %d, task: %d\n", pid, *task);
262
debug ("pid: %d, task: %d\n", pid, *task);
263
264
265
kern_return_t p_proc_task2pid (vpstruct_t process, mach_port_t task, pid_t *pid)
266
267
p_proc_task2pid (vpstruct_t process, mach_port_t task, pid_t *pid)
268
debug ("task id: %d\n", task);
269
return proc_task2pid(getproc() , task , pid);
270
return proc_task2pid (getproc (), task, pid);
271
272
kern_return_t p_proc_task2proc (vpstruct_t callerp, mach_port_t task,
273
mach_port_t *proc)
274
p_proc_task2proc (vpstruct_t callerp, mach_port_t task,
275
276
kern_return_t err;
277
process_t actual_proc;
278
*proc = ports_get_right (process);
282
283
/* Get the actuall port to the proc server. */
284
err = proc_task2proc (getproc(), task, &actual_proc);
285
err = proc_task2proc (getproc (), task, &actual_proc);
if (err)
286
error (3, err, "proc_task2proc");
287
process->proc = actual_proc;
288
292
293
294
kern_return_t p_proc_proc2task (vpstruct_t process, mach_port_t *task)
295
296
p_proc_proc2task (vpstruct_t process, mach_port_t *task)
297
298
*task = process->task_id;
299
300
301
302
kern_return_t p_proc_pid2proc (vpstruct_t process, pid_t pid, mach_port_t *proc)
303
304
p_proc_pid2proc (vpstruct_t process, pid_t pid, mach_port_t *proc)
305
debug ("pid id: %d\n", pid);
306
return proc_pid2proc(getproc() , pid , proc);
307
return proc_pid2proc (getproc (), pid, proc);
308
309
kern_return_t p_proc_getprocinfo (vpstruct_t process, pid_t which,
310
int *flags, procinfo_t *procinfo, mach_msg_type_number_t *procinfoCnt,
311
p_proc_getprocinfo (vpstruct_t process, pid_t which, int *flags,
data_t *threadwaits, mach_msg_type_number_t *threadwaitsCnt)
312
procinfo_t *procinfo, mach_msg_type_number_t *procinfoCnt,
313
314
279
debug ("pid id: %d\n", which);
315
280
return proc_getprocinfo(getproc() , which , flags , procinfo,
316
return proc_getprocinfo (getproc (), which, flags, procinfo,
281
procinfoCnt , threadwaits , threadwaitsCnt);
317
procinfoCnt, threadwaits, threadwaitsCnt);
318
319
kern_return_t p_proc_getprocargs (vpstruct_t process, pid_t which,
320
data_t *procargs, mach_msg_type_number_t *procargsCnt)
321
p_proc_getprocargs (vpstruct_t process, pid_t which,
322
323
324
return proc_getprocargs(getproc() , which , procargs , procargsCnt);
325
return proc_getprocargs (getproc (), which, procargs, procargsCnt);
289
326
290
327
291
kern_return_t p_proc_getprocenv (vpstruct_t process, pid_t which,
328
data_t *procenv, mach_msg_type_number_t *procenvCnt)
329
p_proc_getprocenv (vpstruct_t process, pid_t which,
330
331
332
return proc_getprocenv(getproc() , which , procenv , procenvCnt);
333
return proc_getprocenv (getproc (), which, procenv, procenvCnt);
334
335
kern_return_t p_proc_make_login_coll (vpstruct_t process)
336
337
p_proc_make_login_coll (vpstruct_t process)
338
339
return proc_make_login_coll(process->proc);
340
return proc_make_login_coll (process->proc);
341
342
kern_return_t p_proc_getloginid (vpstruct_t process, pid_t pid, pid_t *login_id)
343
344
p_proc_getloginid (vpstruct_t process, pid_t pid, pid_t *login_id)
345
346
return proc_getloginid(getproc() , pid , login_id);
347
return proc_getloginid (getproc (), pid, login_id);
348
349
kern_return_t p_proc_getloginpids (vpstruct_t process, pid_t id,
350
pidarray_t *pids, mach_msg_type_number_t *pidsCnt)
351
p_proc_getloginpids (vpstruct_t process, pid_t id,
352
353
debug ("pid id: %d\n", id);
354
return proc_getloginpids(getproc() , id , pids , pidsCnt);
355
return proc_getloginpids (getproc (), id, pids, pidsCnt);
356
357
kern_return_t p_proc_setlogin (vpstruct_t process, string_t logname)
358
359
p_proc_setlogin (vpstruct_t process, string_t logname)
360
361
return proc_setlogin(process->proc , logname);
362
return proc_setlogin (process->proc, logname);
363
364
kern_return_t p_proc_getlogin (vpstruct_t process, string_t logname)
365
366
p_proc_getlogin (vpstruct_t process, string_t logname)
367
368
return proc_getlogin(process->proc, logname);
369
return proc_getlogin (process->proc, logname);
370
371
kern_return_t p_proc_setsid (vpstruct_t process)
372
373
p_proc_setsid (vpstruct_t process)
374
375
return proc_setsid(process->proc);
376
return proc_setsid (process->proc);
377
378
kern_return_t p_proc_getsid (vpstruct_t process, pid_t pid, pid_t *sid)
379
380
p_proc_getsid (vpstruct_t process, pid_t pid, pid_t *sid)
381
382
return proc_getsid(getproc() , pid , sid);
383
return proc_getsid (getproc (), pid, sid);
384
385
kern_return_t p_proc_getsessionpgids (vpstruct_t process, pid_t sid,
386
pidarray_t *pgidset, mach_msg_type_number_t *pgidsetCnt)
387
p_proc_getsessionpgids (vpstruct_t process, pid_t sid,
388
389
debug ("pid id: %d\n", sid);
390
return proc_getsessionpgids(getproc() , sid , pgidset , pgidsetCnt);
391
return proc_getsessionpgids (getproc (), sid, pgidset, pgidsetCnt);
392
393
kern_return_t p_proc_getsessionpids (vpstruct_t process, pid_t sid,
394
pidarray_t *pidset, mach_msg_type_number_t *pidsetCnt)
395
p_proc_getsessionpids (vpstruct_t process, pid_t sid,
396
397
398
return proc_getsessionpids(getproc() , sid , pidset , pidsetCnt);
399
return proc_getsessionpids (getproc (), sid, pidset, pidsetCnt);
400
401
kern_return_t p_proc_getsidport (vpstruct_t process, mach_port_t *sessport,
402
mach_msg_type_name_t *sessportPoly)
403
p_proc_getsidport (vpstruct_t process, mach_port_t *sessport,
404
405
406
407
ret=proc_getsidport(process->proc, sessport);
408
ret = proc_getsidport (process->proc, sessport);
409
*sessportPoly = MACH_MSG_TYPE_MOVE_SEND;
410
411
412
413
kern_return_t p_proc_setpgrp (vpstruct_t process, pid_t pid, pid_t pgrp)
414
415
p_proc_setpgrp (vpstruct_t process, pid_t pid, pid_t pgrp)
416
417
return proc_setpgrp(getproc() , pid , pgrp);
418
return proc_setpgrp (getproc (), pid, pgrp);
419
420
kern_return_t p_proc_getpgrp (vpstruct_t process, pid_t pid, pid_t *pgrp)
421
422
p_proc_getpgrp (vpstruct_t process, pid_t pid, pid_t *pgrp)
423
424
425
ret = proc_getpgrp(getproc() , pid , pgrp);
426
ret = proc_getpgrp(getproc(), pid, pgrp);
427
error (0, ret, "proc_proxy: proc_getpgrp");
428
429
430
431
kern_return_t p_proc_getpgrppids (vpstruct_t process, pid_t pgrp,
432
433
p_proc_getpgrppids (vpstruct_t process, pid_t pgrp,
434
435
debug ("pgrp id: %d\n", pgrp);
436
return proc_getpgrppids(getproc() , pgrp , pidset , pidsetCnt);
437
return proc_getpgrppids (getproc (), pgrp, pidset, pidsetCnt);
438
439
kern_return_t p_proc_get_tty (vpstruct_t calling_process,
440
pid_t target_process, mach_port_t *tty, mach_msg_type_name_t *ttyPoly)
441
p_proc_get_tty (vpstruct_t calling_process, pid_t target_process,
442
mach_port_t *tty, mach_msg_type_name_t *ttyPoly)
443
444
debug ("");
445
ret=proc_get_tty(getproc() , target_process , tty);
446
ret = proc_get_tty (getproc (), target_process, tty);
447
*ttyPoly=MACH_MSG_TYPE_MOVE_SEND;
448
*ttyPoly = MACH_MSG_TYPE_MOVE_SEND;
449
450
void task_clean_routine (void *port)task_clean_routine (void *port){{vpstruct_t create_task (task_t task)create_task (task_t task){{vpstruct_t find_task (task_t task)find_task (task_t task){{int request_server (mach_msg_header_t *inp, mach_msg_header_t *outp)request_server (mach_msg_header_t *inp, mach_msg_header_t *outp){{void print_cmd(int argc , char *argv[])print_cmd (int argc, char *argv[]){{for(i=0 ; i < argc ; i++){for (i = 0; i < argc; i++)debug("%s " , argv[i]);{}debug ("%s ", argv[i]);debug("\n");}debug ("\n");int main (int argc, char *argv[])main (int argc, char *argv[]){{if(argc <= 1){if (argc <= 1)fprintf(stderr , "%s command\n" , argv[0]);error (1, 0, "%s command\n" , argv[0]);exit(1);}if(pipe(pipe_fd1s) < 0){perror("pipe");exit(2);}if(pipe(pipe_fd2s) < 0){perror("pipe");exit(2);}err=mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_DEAD_NAME,if (pipe (pipe_fd1s) < 0)&proc_port);error (2, errno, "pipe");if(err != KERN_SUCCESS)if (pipe (pipe_fd2s) < 0)error (2 , err , "mach_port_allocate");error (2, errno, "pipe");child_pid=fork();err = mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_DEAD_NAME,if(child_pid < 0)&proc_port);error(2 , errno , "fork");if (err != KERN_SUCCESS)else if(child_pid == 0){error (2, err, "mach_port_allocate");child_pid = fork ();if (child_pid < 0)error (2, errno, "fork");else if (child_pid == 0){setpgid(getpid() , getpid());setpgid (getpid (), getpid ());close (pipe_fd1s[1]);close (pipe_fd2s[0]);debug("child process starts\n");debug ("child process starts\n");read(pipe_fd1s[0] , &proc_port , sizeof(proc_port));read (pipe_fd1s[0], &proc_port, sizeof (proc_port));print_cmd(argc-1 , &argv[1]);print_cmd (argc-1, &argv[1]);write(pipe_fd2s[1] , &proc_port, sizeof(proc_port));write (pipe_fd2s[1], &proc_port, sizeof (proc_port));setproc (proc_port);debug("child: current proc is %d\n" , getproc());debug ("child: current proc is %d\n", getproc ());if(execvp(argv[1] , &argv[1]) < 0)if (execvp (argv[1], &argv[1]) < 0)error(2 , errno , "execvp");error (2, errno, "execvp");}debug("create a child process %d\n" , child_pid);debug ("create a child process %d\n", child_pid);tcsetpgrp(fileno(stdout) , child_pid);tcsetpgrp (fileno (stdout), child_pid);close (pipe_fd1s[0]);close (pipe_fd2s[1]);child_task=pid2task(child_pid);child_task = pid2task (child_pid);err=mach_port_destroy(child_task , proc_port);err = mach_port_destroy (child_task, proc_port);if (err != KERN_SUCCESS)error (2 , err , "mach_port_destroy");error (2, err, "mach_port_destroy");err=mach_port_insert_right(child_task , proc_port , receive_port ,err = mach_port_insert_right (child_task, proc_port, receive_port,MACH_MSG_TYPE_MAKE_SEND);MACH_MSG_TYPE_MAKE_SEND);if (err != KERN_SUCCESS)error (2 , err , "mach_port_insert_right");error (2, err, "mach_port_insert_right");write(pipe_fd1s[1] , &proc_port , sizeof(proc_port));write (pipe_fd1s[1], &proc_port, sizeof(proc_port));read(pipe_fd2s[0] , &proc_port, sizeof(proc_port));read (pipe_fd2s[0], &proc_port, sizeof(proc_port));while (1){{error (1, errno, "waitpid");debug("proc proxy exits\n");debug ("proc proxy exits\n");mach_port_t my_get_reply_port (void);kern_return_t p_proc_getprivports(vpstruct_t process, mach_port_t *host_priv,mach_port_t *device_master)p_proc_getprivports (vpstruct_t process, mach_port_t *host_priv,mach_port_t *device_master){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);kern_return_t p_proc_getallpids (vpstruct_t process, pidarray_t *pidarray,mach_msg_type_number_t *pidarrayCnt)p_proc_getallpids (vpstruct_t process, pidarray_t *pidarray,mach_msg_type_number_t *pidarrayCnt){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_getallpids(getproc(), pidarray, pidarrayCnt);return proc_getallpids (getproc (), pidarray, pidarrayCnt);kern_return_t p_proc_setexecdata (vpstruct_t process, portarray_t ports,mach_msg_type_number_t portsCnt, intarray_t ints,p_proc_setexecdata (vpstruct_t process, portarray_t ports,mach_msg_type_number_t intsCnt)mach_msg_type_number_t portsCnt, intarray_t ints,mach_msg_type_number_t intsCnt){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_setexecdata(process->proc, ports , MACH_MSG_TYPE_COPY_SEND ,return proc_setexecdata (process->proc, ports, MACH_MSG_TYPE_COPY_SEND,portsCnt, ints, intsCnt);kern_return_t p_proc_getexecdata (vpstruct_t process, portarray_t *ports,mach_msg_type_name_t *portsPoly, mach_msg_type_number_t *portsCnt,p_proc_getexecdata (vpstruct_t process, portarray_t *ports,intarray_t *ints, mach_msg_type_number_t *intsCnt)mach_msg_type_name_t *portsPoly,mach_msg_type_number_t *portsCnt,intarray_t *ints, mach_msg_type_number_t *intsCnt){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);ret=proc_getexecdata(process->proc, ports, portsCnt, ints, intsCnt);ret = proc_getexecdata (process->proc, ports, portsCnt, ints, intsCnt);if (ret == 0)*portsPoly=MACH_MSG_TYPE_MOVE_SEND;*portsPoly = MACH_MSG_TYPE_MOVE_SEND;kern_return_t p_proc_execdata_notify (vpstruct_t process, mach_port_t notify)p_proc_execdata_notify (vpstruct_t process, mach_port_t notify){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_execdata_notify(process->proc, notify , MACH_MSG_TYPE_MOVE_SEND);return proc_execdata_notify (process->proc, notify, MACH_MSG_TYPE_MOVE_SEND);kern_return_t p_proc_uname (vpstruct_t process, utsname_t *uname)p_proc_uname (vpstruct_t process, utsname_t *uname){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_uname (process->proc, uname);kern_return_t p_proc_register_version (vpstruct_t process, mach_port_t credential,string_t name, string_t release, string_t version)p_proc_register_version (vpstruct_t process, mach_port_t credential,string_t name, string_t release, string_t version){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_register_version(process->proc, credential, name, release, version);return proc_register_version (process->proc, credential,name, release, version);kern_return_t p_proc_reauthenticate (vpstruct_t process, mach_port_t rendezvous2)p_proc_reauthenticate (vpstruct_t process, mach_port_t rendezvous2){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_reauthenticate(process->proc, rendezvous2 , MACH_MSG_TYPE_MOVE_SEND);return proc_reauthenticate (process->proc, rendezvous2,MACH_MSG_TYPE_MOVE_SEND);kern_return_t p_proc_child (vpstruct_t process, mach_port_t child)p_proc_child (vpstruct_t process, mach_port_t child){{debug ("task id: %d, child task: %d\n", process->task_id, child);debug ("task id: %d, child task: %d\n", process->task_id, child);return proc_child (process->proc, child);kern_return_t p_proc_setmsgport (vpstruct_t process, mach_port_t reply_port,mach_msg_type_name_t reply_portPoly, mach_port_t newmsgport,p_proc_setmsgport (vpstruct_t process, mach_port_t reply_port,mach_port_t *oldmsgport, mach_msg_type_name_t *oldmsgportPoly)mach_msg_type_name_t reply_portPoly, mach_port_t newmsgport,mach_port_t *oldmsgport, mach_msg_type_name_t *oldmsgportPoly){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);ret=proc_setmsgport(process->proc, newmsgport, oldmsgport);ret = proc_setmsgport (process->proc, newmsgport, oldmsgport);if(ret == 0){if (ret == 0){*oldmsgportPoly=MACH_MSG_TYPE_MOVE_SEND;*oldmsgportPoly = MACH_MSG_TYPE_MOVE_SEND;debug("p_proc_setmsgport succeeds\n");debug ("p_proc_setmsgport succeeds\n");kern_return_t p_proc_getmsgport (vpstruct_t process, mach_port_t reply_port,mach_msg_type_name_t reply_portPoly, pid_t pid, mach_port_t *msgport)p_proc_getmsgport (vpstruct_t process, mach_port_t reply_port,mach_msg_type_name_t reply_portPoly, pid_t pid,mach_port_t *msgport){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_getmsgport(getproc(), pid , msgport);return proc_getmsgport (getproc(), pid, msgport);kern_return_t p_proc_reassign (vpstruct_t process, mach_port_t newtask)p_proc_reassign (vpstruct_t process, mach_port_t newtask){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_reassign(process->proc , newtask);return proc_reassign (process->proc, newtask);return 0;kern_return_t p_proc_setowner (vpstruct_t process, uid_t owner, int clear)p_proc_setowner (vpstruct_t process, uid_t owner, int clear){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_setowner (process->proc, owner, clear);kern_return_t p_proc_getpids (vpstruct_t process, pid_t *pid,pid_t *ppid, int *orphaned)p_proc_getpids (vpstruct_t process, pid_t *pid,pid_t *ppid, int *orphaned){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_getpids(process->proc , pid , ppid , orphaned);return proc_getpids (process->proc, pid, ppid, orphaned);kern_return_t p_proc_set_arg_locations (vpstruct_t process, vm_address_t argv,vm_address_t envp)p_proc_set_arg_locations (vpstruct_t process, vm_address_t argv,vm_address_t envp){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);kern_return_t p_proc_get_arg_locations (vpstruct_t process, vm_address_t *argv,vm_address_t *envp)p_proc_get_arg_locations (vpstruct_t process, vm_address_t *argv,vm_address_t *envp){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_get_arg_locations(process->proc , argv , envp);return proc_get_arg_locations (process->proc, argv, envp);kern_return_t p_proc_wait (vpstruct_t process, mach_port_t reply_port,mach_msg_type_name_t reply_portPoly, pid_t pid, int options,p_proc_wait (vpstruct_t process, mach_port_t reply_port,int *status, int *sigcode, rusage_t *rusage, pid_t *pid_status)mach_msg_type_name_t reply_portPoly, pid_t pid, int options,int *status, int *sigcode, rusage_t *rusage, pid_t *pid_status){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_wait(process->proc , pid , options , status , sigcode ,return proc_wait (process->proc, pid, options, status, sigcode,rusage , pid_status);rusage, pid_status);kern_return_t p_proc_dostop (vpstruct_t process, mach_port_t contthread)p_proc_dostop (vpstruct_t process, mach_port_t contthread){{// process_t actual_proc;// ret = proc_task2proc (getproc (), process->task_id, &actual_proc);// if (ret)// error (3, ret, "proc_task2proc");debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);ret = proc_dostop(process->proc /*actual_proc*/ , contthread);kern_return_t p_proc_handle_exceptions (vpstruct_t process, mach_port_t msgport,mach_port_t forwardport, int flavor, thread_state_t new_state,p_proc_handle_exceptions (vpstruct_t process, mach_port_t msgport,mach_msg_type_number_t new_stateCnt)mach_port_t forwardport, int flavor,thread_state_t new_state,mach_msg_type_number_t new_stateCnt){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_handle_exceptions(process->proc , msgport , forwardport ,return proc_handle_exceptions (process->proc, msgport, forwardport,MACH_MSG_TYPE_MOVE_SEND , flavor , new_state , new_stateCnt);MACH_MSG_TYPE_MOVE_SEND, flavor,new_state, new_stateCnt);kern_return_t p_proc_mark_stop (vpstruct_t process, int signo, int sigcode)p_proc_mark_stop (vpstruct_t process, int signo, int sigcode){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_mark_stop(process->proc , signo , sigcode);return proc_mark_stop (process->proc, signo, sigcode);kern_return_t p_proc_mark_cont (vpstruct_t process)p_proc_mark_cont (vpstruct_t process){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_mark_cont (process->proc);kern_return_t p_proc_mark_exit (vpstruct_t process, int status, int sigcode)p_proc_mark_exit (vpstruct_t process, int status, int sigcode){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_mark_exit(process->proc , status , sigcode);return proc_mark_exit (process->proc, status, sigcode);kern_return_t p_proc_mark_traced (vpstruct_t process)p_proc_mark_traced (vpstruct_t process){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_mark_traced (process->proc);kern_return_t p_proc_mark_exec (vpstruct_t process)p_proc_mark_exec (vpstruct_t process){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_mark_exec (process->proc);kern_return_t p_proc_mod_stopchild (vpstruct_t process, int doit)p_proc_mod_stopchild (vpstruct_t process, int doit){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_mod_stopchild (process->proc , doit);kern_return_t p_proc_pid2task (vpstruct_t process, pid_t pid, mach_port_t *task)p_proc_pid2task (vpstruct_t process, pid_t pid, mach_port_t *task){{ret = proc_pid2task(getproc() , pid , task);ret = proc_pid2task (getproc (), pid, task);debug("pid: %d, task: %d\n", pid, *task);debug ("pid: %d, task: %d\n", pid, *task);kern_return_t p_proc_task2pid (vpstruct_t process, mach_port_t task, pid_t *pid)p_proc_task2pid (vpstruct_t process, mach_port_t task, pid_t *pid){{debug ("task id: %d\n", task);debug ("task id: %d\n", task);return proc_task2pid(getproc() , task , pid);return proc_task2pid (getproc (), task, pid);kern_return_t p_proc_task2proc (vpstruct_t callerp, mach_port_t task,mach_port_t *proc)p_proc_task2proc (vpstruct_t callerp, mach_port_t task,mach_port_t *proc){{err = proc_task2proc (getproc (), task, &actual_proc);kern_return_t p_proc_proc2task (vpstruct_t process, mach_port_t *task)p_proc_proc2task (vpstruct_t process, mach_port_t *task){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);kern_return_t p_proc_pid2proc (vpstruct_t process, pid_t pid, mach_port_t *proc)p_proc_pid2proc (vpstruct_t process, pid_t pid, mach_port_t *proc){{debug ("pid id: %d\n", pid);debug ("pid id: %d\n", pid);return proc_pid2proc(getproc() , pid , proc);return proc_pid2proc (getproc (), pid, proc);kern_return_t p_proc_getprocinfo (vpstruct_t process, pid_t which,int *flags, procinfo_t *procinfo, mach_msg_type_number_t *procinfoCnt,p_proc_getprocinfo (vpstruct_t process, pid_t which, int *flags,data_t *threadwaits, mach_msg_type_number_t *threadwaitsCnt)procinfo_t *procinfo, mach_msg_type_number_t *procinfoCnt,data_t *threadwaits, mach_msg_type_number_t *threadwaitsCnt){{debug ("pid id: %d\n", which);debug ("pid id: %d\n", which);return proc_getprocinfo(getproc() , which , flags , procinfo,return proc_getprocinfo (getproc (), which, flags, procinfo,procinfoCnt , threadwaits , threadwaitsCnt);procinfoCnt, threadwaits, threadwaitsCnt);kern_return_t p_proc_getprocargs (vpstruct_t process, pid_t which,data_t *procargs, mach_msg_type_number_t *procargsCnt)p_proc_getprocargs (vpstruct_t process, pid_t which,data_t *procargs, mach_msg_type_number_t *procargsCnt){{debug ("pid id: %d\n", which);debug ("pid id: %d\n", which);return proc_getprocargs(getproc() , which , procargs , procargsCnt);return proc_getprocargs (getproc (), which, procargs, procargsCnt);kern_return_t p_proc_getprocenv (vpstruct_t process, pid_t which,data_t *procenv, mach_msg_type_number_t *procenvCnt)p_proc_getprocenv (vpstruct_t process, pid_t which,data_t *procenv, mach_msg_type_number_t *procenvCnt){{debug ("pid id: %d\n", which);debug ("pid id: %d\n", which);return proc_getprocenv(getproc() , which , procenv , procenvCnt);return proc_getprocenv (getproc (), which, procenv, procenvCnt);kern_return_t p_proc_make_login_coll (vpstruct_t process)p_proc_make_login_coll (vpstruct_t process){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_make_login_coll (process->proc);kern_return_t p_proc_getloginid (vpstruct_t process, pid_t pid, pid_t *login_id)p_proc_getloginid (vpstruct_t process, pid_t pid, pid_t *login_id){{debug ("pid id: %d\n", pid);debug ("pid id: %d\n", pid);return proc_getloginid(getproc() , pid , login_id);return proc_getloginid (getproc (), pid, login_id);kern_return_t p_proc_getloginpids (vpstruct_t process, pid_t id,pidarray_t *pids, mach_msg_type_number_t *pidsCnt)p_proc_getloginpids (vpstruct_t process, pid_t id,pidarray_t *pids, mach_msg_type_number_t *pidsCnt){{debug ("pid id: %d\n", id);debug ("pid id: %d\n", id);return proc_getloginpids(getproc() , id , pids , pidsCnt);return proc_getloginpids (getproc (), id, pids, pidsCnt);kern_return_t p_proc_setlogin (vpstruct_t process, string_t logname)p_proc_setlogin (vpstruct_t process, string_t logname){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_setlogin(process->proc , logname);return proc_setlogin (process->proc, logname);kern_return_t p_proc_getlogin (vpstruct_t process, string_t logname)p_proc_getlogin (vpstruct_t process, string_t logname){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_getlogin (process->proc, logname);kern_return_t p_proc_setsid (vpstruct_t process)p_proc_setsid (vpstruct_t process){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);return proc_setsid (process->proc);kern_return_t p_proc_getsid (vpstruct_t process, pid_t pid, pid_t *sid)p_proc_getsid (vpstruct_t process, pid_t pid, pid_t *sid){{debug ("pid id: %d\n", pid);debug ("pid id: %d\n", pid);return proc_getsid(getproc() , pid , sid);return proc_getsid (getproc (), pid, sid);kern_return_t p_proc_getsessionpgids (vpstruct_t process, pid_t sid,pidarray_t *pgidset, mach_msg_type_number_t *pgidsetCnt)p_proc_getsessionpgids (vpstruct_t process, pid_t sid,pidarray_t *pgidset, mach_msg_type_number_t *pgidsetCnt){{debug ("pid id: %d\n", sid);debug ("pid id: %d\n", sid);return proc_getsessionpgids(getproc() , sid , pgidset , pgidsetCnt);return proc_getsessionpgids (getproc (), sid, pgidset, pgidsetCnt);kern_return_t p_proc_getsessionpids (vpstruct_t process, pid_t sid,pidarray_t *pidset, mach_msg_type_number_t *pidsetCnt)p_proc_getsessionpids (vpstruct_t process, pid_t sid,pidarray_t *pidset, mach_msg_type_number_t *pidsetCnt){{debug ("pid id: %d\n", sid);debug ("pid id: %d\n", sid);return proc_getsessionpids(getproc() , sid , pidset , pidsetCnt);return proc_getsessionpids (getproc (), sid, pidset, pidsetCnt);kern_return_t p_proc_getsidport (vpstruct_t process, mach_port_t *sessport,mach_msg_type_name_t *sessportPoly)p_proc_getsidport (vpstruct_t process, mach_port_t *sessport,mach_msg_type_name_t *sessportPoly){{debug ("task id: %d\n", process->task_id);debug ("task id: %d\n", process->task_id);ret=proc_getsidport(process->proc, sessport);ret = proc_getsidport (process->proc, sessport);if (ret == 0)kern_return_t p_proc_setpgrp (vpstruct_t process, pid_t pid, pid_t pgrp)p_proc_setpgrp (vpstruct_t process, pid_t pid, pid_t pgrp){{debug ("pid id: %d\n", pid);debug ("pid id: %d\n", pid);return proc_setpgrp(getproc() , pid , pgrp);return proc_setpgrp (getproc (), pid, pgrp);kern_return_t p_proc_getpgrp (vpstruct_t process, pid_t pid, pid_t *pgrp)p_proc_getpgrp (vpstruct_t process, pid_t pid, pid_t *pgrp){{debug ("pid id: %d\n", pid);debug ("pid id: %d\n", pid);ret = proc_getpgrp(getproc() , pid , pgrp);ret = proc_getpgrp(getproc(), pid, pgrp);kern_return_t p_proc_getpgrppids (vpstruct_t process, pid_t pgrp,pidarray_t *pidset, mach_msg_type_number_t *pidsetCnt)p_proc_getpgrppids (vpstruct_t process, pid_t pgrp,pidarray_t *pidset, mach_msg_type_number_t *pidsetCnt){{debug ("pgrp id: %d\n", pgrp);debug ("pgrp id: %d\n", pgrp);return proc_getpgrppids(getproc() , pgrp , pidset , pidsetCnt);return proc_getpgrppids (getproc (), pgrp, pidset, pidsetCnt);kern_return_t p_proc_get_tty (vpstruct_t calling_process,pid_t target_process, mach_port_t *tty, mach_msg_type_name_t *ttyPoly)p_proc_get_tty (vpstruct_t calling_process, pid_t target_process,mach_port_t *tty, mach_msg_type_name_t *ttyPoly){{debug ("");debug ("");ret=proc_get_tty(getproc() , target_process , tty);ret = proc_get_tty (getproc (), target_process, tty);if (ret == 0)*ttyPoly=MACH_MSG_TYPE_MOVE_SEND;*ttyPoly = MACH_MSG_TYPE_MOVE_SEND;