xref: /xnu-11215.41.3/libsyscall/mach/port_descriptions.c (revision 33de042d024d46de5ff4e89f2471de6608e37fa4)
1 /*
2  * Copyright (c) 2018 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #include <errno.h>
30 #include <mach/host_special_ports.h>
31 #include <mach/task_special_ports.h>
32 #include <mach/thread_special_ports.h>
33 #include <mach/port_descriptions.h>
34 #include <stdlib.h>
35 #include <strings.h>
36 
37 const char *
mach_host_special_port_description(int port)38 mach_host_special_port_description(int port)
39 {
40 	int port_index = (int)port;
41 
42 	if (port_index < 0 || port_index > HOST_MAX_SPECIAL_PORT) {
43 		return NULL;
44 	}
45 
46 	static const char *hsp_descs[] = {
47 		[HOST_PORT] = "host (restricted)",
48 		[HOST_PRIV_PORT] = "host private (restricted)",
49 		[HOST_IO_MAIN_PORT] = "I/O main (restricted)",
50 
51 		[HOST_DYNAMIC_PAGER_PORT] = "dynamic pager",
52 		[HOST_AUDIT_CONTROL_PORT] = "audit control",
53 		[HOST_USER_NOTIFICATION_PORT] = "user notification",
54 		[HOST_AUTOMOUNTD_PORT] = "automounter",
55 		[HOST_LOCKD_PORT] = "lockd",
56 		[HOST_KTRACE_BACKGROUND_PORT] = "ktrace background notification",
57 		[HOST_SEATBELT_PORT] = "seatbelt",
58 		[HOST_KEXTD_PORT] = "kextd",
59 		[HOST_LAUNCHCTL_PORT] = "launchctl",
60 		[HOST_UNFREED_PORT] = "fairplay",
61 		[HOST_AMFID_PORT] = "amfi",
62 		[HOST_GSSD_PORT] = "gssd",
63 		[HOST_TELEMETRY_PORT] = "telemetry",
64 		[HOST_ATM_NOTIFICATION_PORT] = "atm notification",
65 		[HOST_COALITION_PORT] = "coalition notification",
66 		[HOST_SYSDIAGNOSE_PORT] = "sysdiagnose notification",
67 		[HOST_XPC_EXCEPTION_PORT] = "XPC exception",
68 		[HOST_CONTAINERD_PORT] = "container manager",
69 		[HOST_NODE_PORT] = "node",
70 		[HOST_RESOURCE_NOTIFY_PORT] = "resource notify",
71 		[HOST_CLOSURED_PORT] = "closured",
72 		[HOST_SYSPOLICYD_PORT] = "syspolicyd",
73 		[HOST_FILECOORDINATIOND_PORT] = "filecoordinationd",
74 		[HOST_FAIRPLAYD_PORT] = "fairplayd",
75 		[HOST_IOCOMPRESSIONSTATS_PORT] = "I/O compression stats",
76 		[HOST_MEMORY_ERROR_PORT] = "memory error stats",
77 		[HOST_MANAGEDAPPDISTD_PORT] = "managedappdistributiond",
78 		[HOST_DOUBLEAGENTD_PORT] = "doubleagentd",
79 	};
80 	_Static_assert(HOST_DOUBLEAGENTD_PORT == HOST_MAX_SPECIAL_PORT,
81 	    "all host special ports must have descriptions");
82 
83 	return hsp_descs[port_index];
84 }
85 
86 const char *
mach_task_special_port_description(int port)87 mach_task_special_port_description(int port)
88 {
89 	int port_index = (int)port;
90 
91 	if (port_index < 0 || port_index > TASK_MAX_SPECIAL_PORT) {
92 		return NULL;
93 	}
94 
95 	static const char *tsp_descs[] = {
96 		[TASK_KERNEL_PORT] = "kernel",
97 		[TASK_HOST_PORT] = "host",
98 		[TASK_NAME_PORT] = "name",
99 		[TASK_BOOTSTRAP_PORT] = "bootstrap",
100 		[TASK_INSPECT_PORT] = "inspect",
101 		[TASK_READ_PORT] = "read",
102 		[TASK_ACCESS_PORT] = "access",
103 		[TASK_DEBUG_CONTROL_PORT] = "debug control",
104 		[TASK_RESOURCE_NOTIFY_PORT] = "resource notify",
105 	};
106 	_Static_assert(TASK_RESOURCE_NOTIFY_PORT == TASK_MAX_SPECIAL_PORT,
107 	    "all task special ports must have descriptions");
108 
109 	return tsp_descs[port_index];
110 }
111 
112 const char *
mach_thread_special_port_description(int port)113 mach_thread_special_port_description(int port)
114 {
115 	int port_index = (int)port;
116 
117 	if (port_index < 0 || port_index > THREAD_MAX_SPECIAL_PORT) {
118 		return NULL;
119 	}
120 
121 	static const char *tsp_descs[] = {
122 		[THREAD_KERNEL_PORT] = "kernel",
123 		[THREAD_INSPECT_PORT] = "inspect",
124 		[THREAD_READ_PORT] = "read",
125 	};
126 	_Static_assert(THREAD_READ_PORT == THREAD_MAX_SPECIAL_PORT,
127 	    "all thread special ports must have descriptions");
128 
129 	return tsp_descs[port_index];
130 }
131 
132 static int
port_for_id_internal(const char * id,const char ** ids,int nids)133 port_for_id_internal(const char *id, const char **ids, int nids)
134 {
135 	if (!id) {
136 		errno = EINVAL;
137 		return -1;
138 	}
139 
140 	for (int i = 0; i < nids; i++) {
141 		if (ids[i] && strcmp(ids[i], id) == 0) {
142 			return i;
143 		}
144 	}
145 
146 	errno = ENOENT;
147 	return -1;
148 }
149 
150 int
mach_host_special_port_for_id(const char * id)151 mach_host_special_port_for_id(const char *id)
152 {
153 	static const char *hsp_ids[] = {
154 #define SP_ENTRY(id) [id] = #id
155 		SP_ENTRY(HOST_PORT),
156 		SP_ENTRY(HOST_PRIV_PORT),
157 		SP_ENTRY(HOST_IO_MAIN_PORT),
158 		SP_ENTRY(HOST_DYNAMIC_PAGER_PORT),
159 		SP_ENTRY(HOST_AUDIT_CONTROL_PORT),
160 		SP_ENTRY(HOST_USER_NOTIFICATION_PORT),
161 		SP_ENTRY(HOST_AUTOMOUNTD_PORT),
162 		SP_ENTRY(HOST_LOCKD_PORT),
163 		SP_ENTRY(HOST_KTRACE_BACKGROUND_PORT),
164 		SP_ENTRY(HOST_SEATBELT_PORT),
165 		SP_ENTRY(HOST_KEXTD_PORT),
166 		SP_ENTRY(HOST_LAUNCHCTL_PORT),
167 		SP_ENTRY(HOST_UNFREED_PORT),
168 		SP_ENTRY(HOST_AMFID_PORT),
169 		SP_ENTRY(HOST_GSSD_PORT),
170 		SP_ENTRY(HOST_TELEMETRY_PORT),
171 		SP_ENTRY(HOST_ATM_NOTIFICATION_PORT),
172 		SP_ENTRY(HOST_COALITION_PORT),
173 		SP_ENTRY(HOST_SYSDIAGNOSE_PORT),
174 		SP_ENTRY(HOST_XPC_EXCEPTION_PORT),
175 		SP_ENTRY(HOST_CONTAINERD_PORT),
176 		SP_ENTRY(HOST_NODE_PORT),
177 		SP_ENTRY(HOST_RESOURCE_NOTIFY_PORT),
178 		SP_ENTRY(HOST_CLOSURED_PORT),
179 		SP_ENTRY(HOST_SYSPOLICYD_PORT),
180 		SP_ENTRY(HOST_FILECOORDINATIOND_PORT),
181 	};
182 
183 	return port_for_id_internal(id, hsp_ids,
184 	           sizeof(hsp_ids) / sizeof(hsp_ids[0]));
185 }
186 
187 int
mach_task_special_port_for_id(const char * id)188 mach_task_special_port_for_id(const char *id)
189 {
190 	static const char *tsp_ids[] = {
191 		SP_ENTRY(TASK_KERNEL_PORT),
192 		SP_ENTRY(TASK_HOST_PORT),
193 		SP_ENTRY(TASK_NAME_PORT),
194 		SP_ENTRY(TASK_BOOTSTRAP_PORT),
195 		SP_ENTRY(TASK_INSPECT_PORT),
196 		SP_ENTRY(TASK_READ_PORT),
197 		SP_ENTRY(TASK_ACCESS_PORT),
198 		SP_ENTRY(TASK_DEBUG_CONTROL_PORT),
199 		SP_ENTRY(TASK_RESOURCE_NOTIFY_PORT),
200 	};
201 
202 	return port_for_id_internal(id, tsp_ids,
203 	           sizeof(tsp_ids) / sizeof(tsp_ids[0]));
204 }
205 
206 int
mach_thread_special_port_for_id(const char * id)207 mach_thread_special_port_for_id(const char *id)
208 {
209 	static const char *tsp_ids[] = {
210 		SP_ENTRY(THREAD_KERNEL_PORT),
211 		SP_ENTRY(THREAD_INSPECT_PORT),
212 		SP_ENTRY(THREAD_READ_PORT),
213 #undef SP_ENTRY
214 	};
215 
216 	return port_for_id_internal(id, tsp_ids,
217 	           sizeof(tsp_ids) / sizeof(tsp_ids[0]));
218 }
219