1 #include <sys/types.h>
2 #include <sys/errno.h>
3 #include <mach/boolean.h>
4 #include <libproc.h>
5
6
7 int __proc_info(int callnum, int pid, int flavor, uint64_t arg, void * buffer, int buffersize);
8
9 int
proc_listpids(uint32_t type,uint32_t typeinfo,void * buffer,int buffersize)10 proc_listpids(uint32_t type, uint32_t typeinfo, void *buffer, int buffersize)
11 {
12 int rv;
13
14 if ((type >= PROC_ALL_PIDS) || (type <= PROC_PPID_ONLY)) {
15 if ((rv = __proc_info(PROC_INFO_CALL_LISTPIDS, type, typeinfo, 0, buffer, buffersize)) == -1)
16 return (0);
17 } else {
18 errno = EINVAL;
19 rv = 0;
20 }
21 return (rv);
22 }
23
24 int
proc_listallpids(void * buffer,int buffersize)25 proc_listallpids(void * buffer, int buffersize)
26 {
27 int numpids;
28
29 numpids = proc_listpids(PROC_ALL_PIDS, 0, buffer, buffersize);
30 if (numpids == -1)
31 return (-1);
32 else
33 return (numpids/sizeof(int));
34 }
35
36 int
proc_listpgrppids(pid_t pgrpid,void * buffer,int buffersize)37 proc_listpgrppids(pid_t pgrpid, void * buffer, int buffersize)
38 {
39 int numpids;
40
41 numpids = proc_listpids(PROC_PGRP_ONLY, (uint32_t)pgrpid, buffer, buffersize);
42 if (numpids == -1)
43 return (-1);
44 else
45 return (numpids/sizeof(int));
46 }
47
48 int
proc_listchildpids(pid_t ppid,void * buffer,int buffersize)49 proc_listchildpids(pid_t ppid, void * buffer, int buffersize)
50 {
51 int numpids;
52
53 numpids = proc_listpids(PROC_PPID_ONLY, (uint32_t)ppid, buffer, buffersize);
54 if (numpids == -1)
55 return (-1);
56 else
57 return (numpids/sizeof(int));
58 }
59
60 int
proc_pidinfo(int pid,int flavor,uint64_t arg,void * buffer,int buffersize)61 proc_pidinfo(int pid, int flavor, uint64_t arg, void *buffer, int buffersize)
62 {
63 int rv;
64
65 if ((rv = __proc_info(PROC_INFO_CALL_PIDINFO, pid, flavor, arg, buffer, buffersize)) == -1)
66 return (0);
67
68 return (rv);
69 }
70
71 int
proc_setpcontrol(const int control __unused)72 proc_setpcontrol(const int control __unused)
73 {
74
75 return (ENOTSUP);
76 }
77
78 int
proc_track_dirty(pid_t pid __unused,uint32_t flags __unused)79 proc_track_dirty(pid_t pid __unused, uint32_t flags __unused)
80 {
81
82 return (ENOTSUP);
83 }
84
85 int
proc_set_dirty(pid_t pid __unused,bool dirty __unused)86 proc_set_dirty(pid_t pid __unused, bool dirty __unused)
87 {
88
89 return (ENOTSUP);
90 }
91
92 int
proc_get_dirty(pid_t pid __unused,uint32_t * flags __unused)93 proc_get_dirty(pid_t pid __unused, uint32_t *flags __unused)
94 {
95
96 return (ENOTSUP);
97 }
98
99 int
proc_terminate(pid_t pid,int * sig)100 proc_terminate(pid_t pid, int *sig)
101 {
102 int rv;
103
104 if (sig == NULL)
105 return (EINVAL);
106
107 if ((rv = __proc_info(PROC_INFO_CALL_TERMINATE, pid, 0, 0, NULL, 0)) == -1)
108 return (errno);
109
110 *sig = rv;
111 return (0);
112 }
113