xref: /trueos/lib/libosxsupport/libproc.c (revision 1fc292baca4df228744b1cc8d04acdbfa9d58a2f)
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