xref: /freebsd-13.1/lib/libsysdecode/flags.c (revision 9289f547)
1*9289f547SJohn Baldwin /*
2*9289f547SJohn Baldwin  * Copyright (c) 2006 "David Kirchner" <[email protected]>. All rights reserved.
3*9289f547SJohn Baldwin  *
4*9289f547SJohn Baldwin  * Redistribution and use in source and binary forms, with or without
5*9289f547SJohn Baldwin  * modification, are permitted provided that the following conditions
6*9289f547SJohn Baldwin  * are met:
7*9289f547SJohn Baldwin  * 1. Redistributions of source code must retain the above copyright
8*9289f547SJohn Baldwin  *    notice, this list of conditions and the following disclaimer.
9*9289f547SJohn Baldwin  * 2. Redistributions in binary form must reproduce the above copyright
10*9289f547SJohn Baldwin  *    notice, this list of conditions and the following disclaimer in the
11*9289f547SJohn Baldwin  *    documentation and/or other materials provided with the distribution.
12*9289f547SJohn Baldwin  *
13*9289f547SJohn Baldwin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14*9289f547SJohn Baldwin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15*9289f547SJohn Baldwin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16*9289f547SJohn Baldwin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17*9289f547SJohn Baldwin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18*9289f547SJohn Baldwin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19*9289f547SJohn Baldwin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20*9289f547SJohn Baldwin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21*9289f547SJohn Baldwin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22*9289f547SJohn Baldwin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23*9289f547SJohn Baldwin  * SUCH DAMAGE.
24*9289f547SJohn Baldwin  */
25*9289f547SJohn Baldwin 
26*9289f547SJohn Baldwin #include <sys/cdefs.h>
27*9289f547SJohn Baldwin __FBSDID("$FreeBSD$");
28*9289f547SJohn Baldwin 
29*9289f547SJohn Baldwin #define L2CAP_SOCKET_CHECKED
30*9289f547SJohn Baldwin 
31*9289f547SJohn Baldwin #include <sys/types.h>
32*9289f547SJohn Baldwin #include <sys/acl.h>
33*9289f547SJohn Baldwin #include <sys/capsicum.h>
34*9289f547SJohn Baldwin #include <sys/extattr.h>
35*9289f547SJohn Baldwin #include <sys/linker.h>
36*9289f547SJohn Baldwin #include <sys/mman.h>
37*9289f547SJohn Baldwin #include <sys/mount.h>
38*9289f547SJohn Baldwin #include <sys/procctl.h>
39*9289f547SJohn Baldwin #include <sys/ptrace.h>
40*9289f547SJohn Baldwin #include <sys/reboot.h>
41*9289f547SJohn Baldwin #include <sys/resource.h>
42*9289f547SJohn Baldwin #include <sys/rtprio.h>
43*9289f547SJohn Baldwin #include <sys/sem.h>
44*9289f547SJohn Baldwin #include <sys/shm.h>
45*9289f547SJohn Baldwin #include <sys/socket.h>
46*9289f547SJohn Baldwin #include <sys/stat.h>
47*9289f547SJohn Baldwin #include <sys/thr.h>
48*9289f547SJohn Baldwin #include <sys/umtx.h>
49*9289f547SJohn Baldwin #include <netinet/in.h>
50*9289f547SJohn Baldwin #include <netinet/tcp.h>
51*9289f547SJohn Baldwin #include <netinet/udp.h>
52*9289f547SJohn Baldwin #include <nfsserver/nfs.h>
53*9289f547SJohn Baldwin #include <ufs/ufs/quota.h>
54*9289f547SJohn Baldwin #include <vm/vm_param.h>
55*9289f547SJohn Baldwin #include <aio.h>
56*9289f547SJohn Baldwin #include <fcntl.h>
57*9289f547SJohn Baldwin #include <sched.h>
58*9289f547SJohn Baldwin #include <stdbool.h>
59*9289f547SJohn Baldwin #include <stdio.h>
60*9289f547SJohn Baldwin #include <stdlib.h>
61*9289f547SJohn Baldwin #include <strings.h>
62*9289f547SJohn Baldwin #include <sysdecode.h>
63*9289f547SJohn Baldwin #include <unistd.h>
64*9289f547SJohn Baldwin #include <sys/bitstring.h>
65*9289f547SJohn Baldwin #include <netgraph/bluetooth/include/ng_hci.h>
66*9289f547SJohn Baldwin #include <netgraph/bluetooth/include/ng_l2cap.h>
67*9289f547SJohn Baldwin #include <netgraph/bluetooth/include/ng_btsocket.h>
68*9289f547SJohn Baldwin 
69*9289f547SJohn Baldwin /*
70*9289f547SJohn Baldwin  * This is taken from the xlat tables originally in truss which were
71*9289f547SJohn Baldwin  * in turn taken from strace.
72*9289f547SJohn Baldwin  */
73*9289f547SJohn Baldwin struct name_table {
74*9289f547SJohn Baldwin 	uintmax_t val;
75*9289f547SJohn Baldwin 	const char *str;
76*9289f547SJohn Baldwin };
77*9289f547SJohn Baldwin 
78*9289f547SJohn Baldwin #define	X(a)	{ a, #a },
79*9289f547SJohn Baldwin #define	XEND	{ 0, NULL }
80*9289f547SJohn Baldwin 
81*9289f547SJohn Baldwin #define	TABLE_START(n)	static struct name_table n[] = {
82*9289f547SJohn Baldwin #define	TABLE_ENTRY	X
83*9289f547SJohn Baldwin #define	TABLE_END	XEND };
84*9289f547SJohn Baldwin 
85*9289f547SJohn Baldwin #include "tables.h"
86*9289f547SJohn Baldwin 
87*9289f547SJohn Baldwin #undef TABLE_START
88*9289f547SJohn Baldwin #undef TABLE_ENTRY
89*9289f547SJohn Baldwin #undef TABLE_END
90*9289f547SJohn Baldwin 
91*9289f547SJohn Baldwin /*
92*9289f547SJohn Baldwin  * These are simple support macros. print_or utilizes a variable
93*9289f547SJohn Baldwin  * defined in the calling function to track whether or not it should
94*9289f547SJohn Baldwin  * print a logical-OR character ('|') before a string. if_print_or
95*9289f547SJohn Baldwin  * simply handles the necessary "if" statement used in many lines
96*9289f547SJohn Baldwin  * of this file.
97*9289f547SJohn Baldwin  */
98*9289f547SJohn Baldwin #define print_or(fp,str,orflag) do {                     \
99*9289f547SJohn Baldwin 	if (orflag) fputc(fp, '|'); else orflag = true;  \
100*9289f547SJohn Baldwin 	fprintf(fp, str); }                              \
101*9289f547SJohn Baldwin 	while (0)
102*9289f547SJohn Baldwin #define if_print_or(fp,i,flag,orflag) do {         \
103*9289f547SJohn Baldwin 	if ((i & flag) == flag)                    \
104*9289f547SJohn Baldwin 	print_or(fp,#flag,orflag); }               \
105*9289f547SJohn Baldwin 	while (0)
106*9289f547SJohn Baldwin 
107*9289f547SJohn Baldwin static const char *
108*9289f547SJohn Baldwin lookup_value(struct name_table *table, uintmax_t val)
109*9289f547SJohn Baldwin {
110*9289f547SJohn Baldwin 
111*9289f547SJohn Baldwin 	for (; table->str != NULL; table++)
112*9289f547SJohn Baldwin 		if (table->val == val)
113*9289f547SJohn Baldwin 			return (table->str);
114*9289f547SJohn Baldwin 	return (NULL);
115*9289f547SJohn Baldwin }
116*9289f547SJohn Baldwin 
117*9289f547SJohn Baldwin /*
118*9289f547SJohn Baldwin  * Used when the value maps to a bitmask of #definition values in the
119*9289f547SJohn Baldwin  * table.  This is a helper routine which outputs a symbolic mask of
120*9289f547SJohn Baldwin  * matched masks.  Multiple masks are separated by a pipe ('|').
121*9289f547SJohn Baldwin  * The value is modified on return to only hold unmatched bits.
122*9289f547SJohn Baldwin  */
123*9289f547SJohn Baldwin static void
124*9289f547SJohn Baldwin print_mask_part(FILE *fp, struct name_table *table, uintmax_t *valp,
125*9289f547SJohn Baldwin     bool *printed)
126*9289f547SJohn Baldwin {
127*9289f547SJohn Baldwin 	uintmax_t rem;
128*9289f547SJohn Baldwin 
129*9289f547SJohn Baldwin 	rem = *valp;
130*9289f547SJohn Baldwin 	for (; table->str != NULL; table++) {
131*9289f547SJohn Baldwin 		if ((table->val & rem) == table->val) {
132*9289f547SJohn Baldwin 			/*
133*9289f547SJohn Baldwin 			 * Only print a zero mask if the raw value is
134*9289f547SJohn Baldwin 			 * zero.
135*9289f547SJohn Baldwin 			 */
136*9289f547SJohn Baldwin 			if (table->val == 0 && *valp != 0)
137*9289f547SJohn Baldwin 				continue;
138*9289f547SJohn Baldwin 			fprintf(fp, "%s%s", *printed ? "|" : "", table->str);
139*9289f547SJohn Baldwin 			*printed = true;
140*9289f547SJohn Baldwin 			rem &= ~table->val;
141*9289f547SJohn Baldwin 		}
142*9289f547SJohn Baldwin 	}
143*9289f547SJohn Baldwin 
144*9289f547SJohn Baldwin 	*valp = rem;
145*9289f547SJohn Baldwin }
146*9289f547SJohn Baldwin 
147*9289f547SJohn Baldwin /*
148*9289f547SJohn Baldwin  * Used when the value maps to a bitmask of #definition values in the
149*9289f547SJohn Baldwin  * table.  The return value is true if something was printed.  If
150*9289f547SJohn Baldwin  * rem is not NULL, *rem holds any bits not decoded if something was
151*9289f547SJohn Baldwin  * printed.  If nothing was printed and rem is not NULL, *rem holds
152*9289f547SJohn Baldwin  * the original value.
153*9289f547SJohn Baldwin  */
154*9289f547SJohn Baldwin static bool
155*9289f547SJohn Baldwin print_mask_int(FILE *fp, struct name_table *table, int ival, int *rem)
156*9289f547SJohn Baldwin {
157*9289f547SJohn Baldwin 	uintmax_t val;
158*9289f547SJohn Baldwin 	bool printed;
159*9289f547SJohn Baldwin 
160*9289f547SJohn Baldwin 	printed = false;
161*9289f547SJohn Baldwin 	val = (unsigned)ival;
162*9289f547SJohn Baldwin 	print_mask_part(fp, table, &val, &printed);
163*9289f547SJohn Baldwin 	if (rem != NULL)
164*9289f547SJohn Baldwin 		*rem = val;
165*9289f547SJohn Baldwin 	return (printed);
166*9289f547SJohn Baldwin }
167*9289f547SJohn Baldwin 
168*9289f547SJohn Baldwin /*
169*9289f547SJohn Baldwin  * Used for a mask of optional flags where a value of 0 is valid.
170*9289f547SJohn Baldwin  */
171*9289f547SJohn Baldwin static bool
172*9289f547SJohn Baldwin print_mask_0(FILE *fp, struct name_table *table, int val, int *rem)
173*9289f547SJohn Baldwin {
174*9289f547SJohn Baldwin 
175*9289f547SJohn Baldwin 	if (val == 0) {
176*9289f547SJohn Baldwin 		fputs("0", fp);
177*9289f547SJohn Baldwin 		if (rem != NULL)
178*9289f547SJohn Baldwin 			*rem = 0;
179*9289f547SJohn Baldwin 		return (true);
180*9289f547SJohn Baldwin 	}
181*9289f547SJohn Baldwin 	return (print_mask_int(fp, table, val, rem));
182*9289f547SJohn Baldwin }
183*9289f547SJohn Baldwin 
184*9289f547SJohn Baldwin /*
185*9289f547SJohn Baldwin  * Like print_mask_0 but for a unsigned long instead of an int.
186*9289f547SJohn Baldwin  */
187*9289f547SJohn Baldwin static bool
188*9289f547SJohn Baldwin print_mask_0ul(FILE *fp, struct name_table *table, u_long lval, u_long *rem)
189*9289f547SJohn Baldwin {
190*9289f547SJohn Baldwin 	uintmax_t val;
191*9289f547SJohn Baldwin 	bool printed;
192*9289f547SJohn Baldwin 
193*9289f547SJohn Baldwin 	if (lval == 0) {
194*9289f547SJohn Baldwin 		fputs("0", fp);
195*9289f547SJohn Baldwin 		if (rem != NULL)
196*9289f547SJohn Baldwin 			*rem = 0;
197*9289f547SJohn Baldwin 		return (true);
198*9289f547SJohn Baldwin 	}
199*9289f547SJohn Baldwin 
200*9289f547SJohn Baldwin 	printed = false;
201*9289f547SJohn Baldwin 	val = lval;
202*9289f547SJohn Baldwin 	print_mask_part(fp, table, &val, &printed);
203*9289f547SJohn Baldwin 	if (rem != NULL)
204*9289f547SJohn Baldwin 		*rem = val;
205*9289f547SJohn Baldwin 	return (printed);
206*9289f547SJohn Baldwin }
207*9289f547SJohn Baldwin 
208*9289f547SJohn Baldwin static void
209*9289f547SJohn Baldwin print_integer(FILE *fp, int val, int base)
210*9289f547SJohn Baldwin {
211*9289f547SJohn Baldwin 
212*9289f547SJohn Baldwin 	switch (base) {
213*9289f547SJohn Baldwin 	case 8:
214*9289f547SJohn Baldwin 		fprintf(fp, "0%o", val);
215*9289f547SJohn Baldwin 		break;
216*9289f547SJohn Baldwin 	case 10:
217*9289f547SJohn Baldwin 		fprintf(fp, "%d", val);
218*9289f547SJohn Baldwin 		break;
219*9289f547SJohn Baldwin 	case 16:
220*9289f547SJohn Baldwin 		fprintf(fp, "0x%x", val);
221*9289f547SJohn Baldwin 		break;
222*9289f547SJohn Baldwin 	default:
223*9289f547SJohn Baldwin 		abort2("bad base", 0, NULL);
224*9289f547SJohn Baldwin 		break;
225*9289f547SJohn Baldwin 	}
226*9289f547SJohn Baldwin }
227*9289f547SJohn Baldwin 
228*9289f547SJohn Baldwin static bool
229*9289f547SJohn Baldwin print_value(FILE *fp, struct name_table *table, uintmax_t val)
230*9289f547SJohn Baldwin {
231*9289f547SJohn Baldwin 	const char *str;
232*9289f547SJohn Baldwin 
233*9289f547SJohn Baldwin 	str = lookup_value(table, val);
234*9289f547SJohn Baldwin 	if (str != NULL) {
235*9289f547SJohn Baldwin 		fputs(str, fp);
236*9289f547SJohn Baldwin 		return (true);
237*9289f547SJohn Baldwin 	}
238*9289f547SJohn Baldwin 	return (false);
239*9289f547SJohn Baldwin }
240*9289f547SJohn Baldwin 
241*9289f547SJohn Baldwin const char *
242*9289f547SJohn Baldwin sysdecode_atfd(int fd)
243*9289f547SJohn Baldwin {
244*9289f547SJohn Baldwin 
245*9289f547SJohn Baldwin 	if (fd == AT_FDCWD)
246*9289f547SJohn Baldwin 		return ("AT_FDCWD");
247*9289f547SJohn Baldwin 	return (NULL);
248*9289f547SJohn Baldwin }
249*9289f547SJohn Baldwin 
250*9289f547SJohn Baldwin static struct name_table semctlops[] = {
251*9289f547SJohn Baldwin 	X(GETNCNT) X(GETPID) X(GETVAL) X(GETALL) X(GETZCNT) X(SETVAL) X(SETALL)
252*9289f547SJohn Baldwin 	X(IPC_RMID) X(IPC_SET) X(IPC_STAT) XEND
253*9289f547SJohn Baldwin };
254*9289f547SJohn Baldwin 
255*9289f547SJohn Baldwin const char *
256*9289f547SJohn Baldwin sysdecode_semctl_cmd(int cmd)
257*9289f547SJohn Baldwin {
258*9289f547SJohn Baldwin 
259*9289f547SJohn Baldwin 	return (lookup_value(semctlops, cmd));
260*9289f547SJohn Baldwin }
261*9289f547SJohn Baldwin 
262*9289f547SJohn Baldwin static struct name_table shmctlops[] = {
263*9289f547SJohn Baldwin 	X(IPC_RMID) X(IPC_SET) X(IPC_STAT) XEND
264*9289f547SJohn Baldwin };
265*9289f547SJohn Baldwin 
266*9289f547SJohn Baldwin const char *
267*9289f547SJohn Baldwin sysdecode_shmctl_cmd(int cmd)
268*9289f547SJohn Baldwin {
269*9289f547SJohn Baldwin 
270*9289f547SJohn Baldwin 	return (lookup_value(shmctlops, cmd));
271*9289f547SJohn Baldwin }
272*9289f547SJohn Baldwin 
273*9289f547SJohn Baldwin const char *
274*9289f547SJohn Baldwin sysdecode_msgctl_cmd(int cmd)
275*9289f547SJohn Baldwin {
276*9289f547SJohn Baldwin 
277*9289f547SJohn Baldwin 	return (sysdecode_shmctl_cmd(cmd));
278*9289f547SJohn Baldwin }
279*9289f547SJohn Baldwin 
280*9289f547SJohn Baldwin static struct name_table semgetflags[] = {
281*9289f547SJohn Baldwin 	X(IPC_CREAT) X(IPC_EXCL) X(SEM_R) X(SEM_A) X((SEM_R>>3)) X((SEM_A>>3))
282*9289f547SJohn Baldwin 	X((SEM_R>>6)) X((SEM_A>>6)) XEND
283*9289f547SJohn Baldwin };
284*9289f547SJohn Baldwin 
285*9289f547SJohn Baldwin bool
286*9289f547SJohn Baldwin sysdecode_semget_flags(FILE *fp, int flag, int *rem)
287*9289f547SJohn Baldwin {
288*9289f547SJohn Baldwin 
289*9289f547SJohn Baldwin 	return (print_mask_int(fp, semgetflags, flag, rem));
290*9289f547SJohn Baldwin }
291*9289f547SJohn Baldwin 
292*9289f547SJohn Baldwin static struct name_table idtypes[] = {
293*9289f547SJohn Baldwin 	X(P_PID) X(P_PPID) X(P_PGID) X(P_SID) X(P_CID) X(P_UID) X(P_GID)
294*9289f547SJohn Baldwin 	X(P_ALL) X(P_LWPID) X(P_TASKID) X(P_PROJID) X(P_POOLID) X(P_JAILID)
295*9289f547SJohn Baldwin 	X(P_CTID) X(P_CPUID) X(P_PSETID) XEND
296*9289f547SJohn Baldwin };
297*9289f547SJohn Baldwin 
298*9289f547SJohn Baldwin /* XXX: idtype is really an idtype_t */
299*9289f547SJohn Baldwin const char *
300*9289f547SJohn Baldwin sysdecode_idtype(int idtype)
301*9289f547SJohn Baldwin {
302*9289f547SJohn Baldwin 
303*9289f547SJohn Baldwin 	return (lookup_value(idtypes, idtype));
304*9289f547SJohn Baldwin }
305*9289f547SJohn Baldwin 
306*9289f547SJohn Baldwin /*
307*9289f547SJohn Baldwin  * [g|s]etsockopt's level argument can either be SOL_SOCKET or a
308*9289f547SJohn Baldwin  * protocol-specific value.
309*9289f547SJohn Baldwin  */
310*9289f547SJohn Baldwin const char *
311*9289f547SJohn Baldwin sysdecode_sockopt_level(int level)
312*9289f547SJohn Baldwin {
313*9289f547SJohn Baldwin 	const char *str;
314*9289f547SJohn Baldwin 
315*9289f547SJohn Baldwin 	if (level == SOL_SOCKET)
316*9289f547SJohn Baldwin 		return ("SOL_SOCKET");
317*9289f547SJohn Baldwin 
318*9289f547SJohn Baldwin 	/* SOL_* constants for Bluetooth sockets. */
319*9289f547SJohn Baldwin 	str = lookup_value(ngbtsolevel, level);
320*9289f547SJohn Baldwin 	if (str != NULL)
321*9289f547SJohn Baldwin 		return (str);
322*9289f547SJohn Baldwin 
323*9289f547SJohn Baldwin 	/*
324*9289f547SJohn Baldwin 	 * IP and Infiniband sockets use IP protocols as levels.  Not all
325*9289f547SJohn Baldwin 	 * protocols are valid but it is simpler to just allow all of them.
326*9289f547SJohn Baldwin 	 *
327*9289f547SJohn Baldwin 	 * XXX: IPPROTO_IP == 0, but UNIX domain sockets use a level of 0
328*9289f547SJohn Baldwin 	 * for private options.
329*9289f547SJohn Baldwin 	 */
330*9289f547SJohn Baldwin 	str = sysdecode_ipproto(level);
331*9289f547SJohn Baldwin 	if (str != NULL)
332*9289f547SJohn Baldwin 		return (str);
333*9289f547SJohn Baldwin 
334*9289f547SJohn Baldwin 	return (NULL);
335*9289f547SJohn Baldwin }
336*9289f547SJohn Baldwin 
337*9289f547SJohn Baldwin bool
338*9289f547SJohn Baldwin sysdecode_vmprot(FILE *fp, int type, int *rem)
339*9289f547SJohn Baldwin {
340*9289f547SJohn Baldwin 
341*9289f547SJohn Baldwin 	return (print_mask_int(fp, vmprot, type, rem));
342*9289f547SJohn Baldwin }
343*9289f547SJohn Baldwin 
344*9289f547SJohn Baldwin static struct name_table sockflags[] = {
345*9289f547SJohn Baldwin 	X(SOCK_CLOEXEC) X(SOCK_NONBLOCK) XEND
346*9289f547SJohn Baldwin };
347*9289f547SJohn Baldwin 
348*9289f547SJohn Baldwin bool
349*9289f547SJohn Baldwin sysdecode_socket_type(FILE *fp, int type, int *rem)
350*9289f547SJohn Baldwin {
351*9289f547SJohn Baldwin 	const char *str;
352*9289f547SJohn Baldwin 	uintmax_t val;
353*9289f547SJohn Baldwin 	bool printed;
354*9289f547SJohn Baldwin 
355*9289f547SJohn Baldwin 	str = lookup_value(socktype, type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK));
356*9289f547SJohn Baldwin 	if (str != NULL) {
357*9289f547SJohn Baldwin 		fputs(str, fp);
358*9289f547SJohn Baldwin 		*rem = 0;
359*9289f547SJohn Baldwin 		printed = true;
360*9289f547SJohn Baldwin 	} else {
361*9289f547SJohn Baldwin 		*rem = type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK);
362*9289f547SJohn Baldwin 		printed = false;
363*9289f547SJohn Baldwin 	}
364*9289f547SJohn Baldwin 	val = type & (SOCK_CLOEXEC | SOCK_NONBLOCK);
365*9289f547SJohn Baldwin 	print_mask_part(fp, sockflags, &val, &printed);
366*9289f547SJohn Baldwin 	return (printed);
367*9289f547SJohn Baldwin }
368*9289f547SJohn Baldwin 
369*9289f547SJohn Baldwin bool
370*9289f547SJohn Baldwin sysdecode_access_mode(FILE *fp, int mode, int *rem)
371*9289f547SJohn Baldwin {
372*9289f547SJohn Baldwin 
373*9289f547SJohn Baldwin 	return (print_mask_int(fp, accessmode, mode, rem));
374*9289f547SJohn Baldwin }
375*9289f547SJohn Baldwin 
376*9289f547SJohn Baldwin /* XXX: 'type' is really an acl_type_t. */
377*9289f547SJohn Baldwin const char *
378*9289f547SJohn Baldwin sysdecode_acltype(int type)
379*9289f547SJohn Baldwin {
380*9289f547SJohn Baldwin 
381*9289f547SJohn Baldwin 	return (lookup_value(acltype, type));
382*9289f547SJohn Baldwin }
383*9289f547SJohn Baldwin 
384*9289f547SJohn Baldwin bool
385*9289f547SJohn Baldwin sysdecode_cap_fcntlrights(FILE *fp, uint32_t rights, uint32_t *rem)
386*9289f547SJohn Baldwin {
387*9289f547SJohn Baldwin 
388*9289f547SJohn Baldwin 	return (print_mask_int(fp, capfcntl, rights, rem));
389*9289f547SJohn Baldwin }
390*9289f547SJohn Baldwin 
391*9289f547SJohn Baldwin const char *
392*9289f547SJohn Baldwin sysdecode_extattrnamespace(int namespace)
393*9289f547SJohn Baldwin {
394*9289f547SJohn Baldwin 
395*9289f547SJohn Baldwin 	return (lookup_value(extattrns, namespace));
396*9289f547SJohn Baldwin }
397*9289f547SJohn Baldwin 
398*9289f547SJohn Baldwin const char *
399*9289f547SJohn Baldwin sysdecode_fadvice(int advice)
400*9289f547SJohn Baldwin {
401*9289f547SJohn Baldwin 
402*9289f547SJohn Baldwin 	return (lookup_value(fadvisebehav, advice));
403*9289f547SJohn Baldwin }
404*9289f547SJohn Baldwin 
405*9289f547SJohn Baldwin bool
406*9289f547SJohn Baldwin sysdecode_open_flags(FILE *fp, int flags, int *rem)
407*9289f547SJohn Baldwin {
408*9289f547SJohn Baldwin 	bool printed;
409*9289f547SJohn Baldwin 	int mode;
410*9289f547SJohn Baldwin 	uintmax_t val;
411*9289f547SJohn Baldwin 
412*9289f547SJohn Baldwin 	mode = flags & O_ACCMODE;
413*9289f547SJohn Baldwin 	flags &= ~O_ACCMODE;
414*9289f547SJohn Baldwin 	switch (mode) {
415*9289f547SJohn Baldwin 	case O_RDONLY:
416*9289f547SJohn Baldwin 		if (flags & O_EXEC) {
417*9289f547SJohn Baldwin 			flags &= ~O_EXEC;
418*9289f547SJohn Baldwin 			fputs("O_EXEC", fp);
419*9289f547SJohn Baldwin 		} else
420*9289f547SJohn Baldwin 			fputs("O_RDONLY", fp);
421*9289f547SJohn Baldwin 		printed = true;
422*9289f547SJohn Baldwin 		mode = 0;
423*9289f547SJohn Baldwin 		break;
424*9289f547SJohn Baldwin 	case O_WRONLY:
425*9289f547SJohn Baldwin 		fputs("O_WRONLY", fp);
426*9289f547SJohn Baldwin 		printed = true;
427*9289f547SJohn Baldwin 		mode = 0;
428*9289f547SJohn Baldwin 		break;
429*9289f547SJohn Baldwin 	case O_RDWR:
430*9289f547SJohn Baldwin 		fputs("O_RDWR", fp);
431*9289f547SJohn Baldwin 		printed = true;
432*9289f547SJohn Baldwin 		mode = 0;
433*9289f547SJohn Baldwin 		break;
434*9289f547SJohn Baldwin 	default:
435*9289f547SJohn Baldwin 		printed = false;
436*9289f547SJohn Baldwin 	}
437*9289f547SJohn Baldwin 	val = (unsigned)flags;
438*9289f547SJohn Baldwin 	print_mask_part(fp, openflags, &val, &printed);
439*9289f547SJohn Baldwin 	if (rem != NULL)
440*9289f547SJohn Baldwin 		*rem = val | mode;
441*9289f547SJohn Baldwin 	return (printed);
442*9289f547SJohn Baldwin }
443*9289f547SJohn Baldwin 
444*9289f547SJohn Baldwin bool
445*9289f547SJohn Baldwin sysdecode_fcntl_fileflags(FILE *fp, int flags, int *rem)
446*9289f547SJohn Baldwin {
447*9289f547SJohn Baldwin 	bool printed;
448*9289f547SJohn Baldwin 	int oflags;
449*9289f547SJohn Baldwin 
450*9289f547SJohn Baldwin 	/*
451*9289f547SJohn Baldwin 	 * The file flags used with F_GETFL/F_SETFL mostly match the
452*9289f547SJohn Baldwin 	 * flags passed to open(2).  However, a few open-only flag
453*9289f547SJohn Baldwin 	 * bits have been repurposed for fcntl-only flags.
454*9289f547SJohn Baldwin 	 */
455*9289f547SJohn Baldwin 	oflags = flags & ~(O_NOFOLLOW | FRDAHEAD);
456*9289f547SJohn Baldwin 	printed = sysdecode_open_flags(fp, oflags, rem);
457*9289f547SJohn Baldwin 	if (flags & O_NOFOLLOW) {
458*9289f547SJohn Baldwin 		fprintf(fp, "%sFPOIXSHM", printed ? "|" : "");
459*9289f547SJohn Baldwin 		printed = true;
460*9289f547SJohn Baldwin 	}
461*9289f547SJohn Baldwin 	if (flags & FRDAHEAD) {
462*9289f547SJohn Baldwin 		fprintf(fp, "%sFRDAHEAD", printed ? "|" : "");
463*9289f547SJohn Baldwin 		printed = true;
464*9289f547SJohn Baldwin 	}
465*9289f547SJohn Baldwin 	return (printed);
466*9289f547SJohn Baldwin }
467*9289f547SJohn Baldwin 
468*9289f547SJohn Baldwin bool
469*9289f547SJohn Baldwin sysdecode_flock_operation(FILE *fp, int operation, int *rem)
470*9289f547SJohn Baldwin {
471*9289f547SJohn Baldwin 
472*9289f547SJohn Baldwin 	return (print_mask_int(fp, flockops, operation, rem));
473*9289f547SJohn Baldwin }
474*9289f547SJohn Baldwin 
475*9289f547SJohn Baldwin bool
476*9289f547SJohn Baldwin sysdecode_getfsstat_flags(FILE *fp, int flags, int *rem)
477*9289f547SJohn Baldwin {
478*9289f547SJohn Baldwin 
479*9289f547SJohn Baldwin 	return (print_mask_int(fp, getfsstatflags, flags, rem));
480*9289f547SJohn Baldwin }
481*9289f547SJohn Baldwin 
482*9289f547SJohn Baldwin const char *
483*9289f547SJohn Baldwin sysdecode_kldsym_cmd(int cmd)
484*9289f547SJohn Baldwin {
485*9289f547SJohn Baldwin 
486*9289f547SJohn Baldwin 	return (lookup_value(kldsymcmd, cmd));
487*9289f547SJohn Baldwin }
488*9289f547SJohn Baldwin 
489*9289f547SJohn Baldwin const char *
490*9289f547SJohn Baldwin sysdecode_kldunload_flags(int flags)
491*9289f547SJohn Baldwin {
492*9289f547SJohn Baldwin 
493*9289f547SJohn Baldwin 	return (lookup_value(kldunloadfflags, flags));
494*9289f547SJohn Baldwin }
495*9289f547SJohn Baldwin 
496*9289f547SJohn Baldwin const char *
497*9289f547SJohn Baldwin sysdecode_lio_listio_mode(int mode)
498*9289f547SJohn Baldwin {
499*9289f547SJohn Baldwin 
500*9289f547SJohn Baldwin 	return (lookup_value(lio_listiomodes, mode));
501*9289f547SJohn Baldwin }
502*9289f547SJohn Baldwin 
503*9289f547SJohn Baldwin const char *
504*9289f547SJohn Baldwin sysdecode_madvice(int advice)
505*9289f547SJohn Baldwin {
506*9289f547SJohn Baldwin 
507*9289f547SJohn Baldwin 	return (lookup_value(madvisebehav, advice));
508*9289f547SJohn Baldwin }
509*9289f547SJohn Baldwin 
510*9289f547SJohn Baldwin const char *
511*9289f547SJohn Baldwin sysdecode_minherit_inherit(int inherit)
512*9289f547SJohn Baldwin {
513*9289f547SJohn Baldwin 
514*9289f547SJohn Baldwin 	return (lookup_value(minheritflags, inherit));
515*9289f547SJohn Baldwin }
516*9289f547SJohn Baldwin 
517*9289f547SJohn Baldwin bool
518*9289f547SJohn Baldwin sysdecode_mlockall_flags(FILE *fp, int flags, int *rem)
519*9289f547SJohn Baldwin {
520*9289f547SJohn Baldwin 
521*9289f547SJohn Baldwin 	return (print_mask_int(fp, mlockallflags, flags, rem));
522*9289f547SJohn Baldwin }
523*9289f547SJohn Baldwin 
524*9289f547SJohn Baldwin bool
525*9289f547SJohn Baldwin sysdecode_mmap_prot(FILE *fp, int prot, int *rem)
526*9289f547SJohn Baldwin {
527*9289f547SJohn Baldwin 
528*9289f547SJohn Baldwin 	return (print_mask_int(fp, mmapprot, prot, rem));
529*9289f547SJohn Baldwin }
530*9289f547SJohn Baldwin 
531*9289f547SJohn Baldwin bool
532*9289f547SJohn Baldwin sysdecode_fileflags(FILE *fp, fflags_t flags, fflags_t *rem)
533*9289f547SJohn Baldwin {
534*9289f547SJohn Baldwin 
535*9289f547SJohn Baldwin 	return (print_mask_0(fp, fileflags, flags, rem));
536*9289f547SJohn Baldwin }
537*9289f547SJohn Baldwin 
538*9289f547SJohn Baldwin bool
539*9289f547SJohn Baldwin sysdecode_filemode(FILE *fp, int mode, int *rem)
540*9289f547SJohn Baldwin {
541*9289f547SJohn Baldwin 
542*9289f547SJohn Baldwin 	return (print_mask_0(fp, filemode, mode, rem));
543*9289f547SJohn Baldwin }
544*9289f547SJohn Baldwin 
545*9289f547SJohn Baldwin bool
546*9289f547SJohn Baldwin sysdecode_mount_flags(FILE *fp, int flags, int *rem)
547*9289f547SJohn Baldwin {
548*9289f547SJohn Baldwin 
549*9289f547SJohn Baldwin 	return (print_mask_int(fp, mountflags, flags, rem));
550*9289f547SJohn Baldwin }
551*9289f547SJohn Baldwin 
552*9289f547SJohn Baldwin bool
553*9289f547SJohn Baldwin sysdecode_msync_flags(FILE *fp, int flags, int *rem)
554*9289f547SJohn Baldwin {
555*9289f547SJohn Baldwin 
556*9289f547SJohn Baldwin 	return (print_mask_int(fp, msyncflags, flags, rem));
557*9289f547SJohn Baldwin }
558*9289f547SJohn Baldwin 
559*9289f547SJohn Baldwin const char *
560*9289f547SJohn Baldwin sysdecode_nfssvc_flags(int flags)
561*9289f547SJohn Baldwin {
562*9289f547SJohn Baldwin 
563*9289f547SJohn Baldwin 	return (lookup_value(nfssvcflags, flags));
564*9289f547SJohn Baldwin }
565*9289f547SJohn Baldwin 
566*9289f547SJohn Baldwin static struct name_table pipe2flags[] = {
567*9289f547SJohn Baldwin 	X(O_CLOEXEC) X(O_NONBLOCK) XEND
568*9289f547SJohn Baldwin };
569*9289f547SJohn Baldwin 
570*9289f547SJohn Baldwin bool
571*9289f547SJohn Baldwin sysdecode_pipe2_flags(FILE *fp, int flags, int *rem)
572*9289f547SJohn Baldwin {
573*9289f547SJohn Baldwin 
574*9289f547SJohn Baldwin 	return (print_mask_0(fp, pipe2flags, flags, rem));
575*9289f547SJohn Baldwin }
576*9289f547SJohn Baldwin 
577*9289f547SJohn Baldwin const char *
578*9289f547SJohn Baldwin sysdecode_prio_which(int which)
579*9289f547SJohn Baldwin {
580*9289f547SJohn Baldwin 
581*9289f547SJohn Baldwin 	return (lookup_value(prio, which));
582*9289f547SJohn Baldwin }
583*9289f547SJohn Baldwin 
584*9289f547SJohn Baldwin const char *
585*9289f547SJohn Baldwin sysdecode_procctl_cmd(int cmd)
586*9289f547SJohn Baldwin {
587*9289f547SJohn Baldwin 
588*9289f547SJohn Baldwin 	return (lookup_value(procctlcmd, cmd));
589*9289f547SJohn Baldwin }
590*9289f547SJohn Baldwin 
591*9289f547SJohn Baldwin const char *
592*9289f547SJohn Baldwin sysdecode_ptrace_request(int request)
593*9289f547SJohn Baldwin {
594*9289f547SJohn Baldwin 
595*9289f547SJohn Baldwin 	return (lookup_value(ptraceop, request));
596*9289f547SJohn Baldwin }
597*9289f547SJohn Baldwin 
598*9289f547SJohn Baldwin static struct name_table quotatypes[] = {
599*9289f547SJohn Baldwin 	X(GRPQUOTA) X(USRQUOTA) XEND
600*9289f547SJohn Baldwin };
601*9289f547SJohn Baldwin 
602*9289f547SJohn Baldwin bool
603*9289f547SJohn Baldwin sysdecode_quotactl_cmd(FILE *fp, int cmd)
604*9289f547SJohn Baldwin {
605*9289f547SJohn Baldwin 	const char *primary, *type;
606*9289f547SJohn Baldwin 
607*9289f547SJohn Baldwin 	primary = lookup_value(quotactlcmds, cmd >> SUBCMDSHIFT);
608*9289f547SJohn Baldwin 	if (primary == NULL)
609*9289f547SJohn Baldwin 		return (false);
610*9289f547SJohn Baldwin 	fprintf(fp, "QCMD(%s,", primary);
611*9289f547SJohn Baldwin 	type = lookup_value(quotatypes, cmd & SUBCMDMASK);
612*9289f547SJohn Baldwin 	if (type != NULL)
613*9289f547SJohn Baldwin 		fprintf(fp, "%s", type);
614*9289f547SJohn Baldwin 	else
615*9289f547SJohn Baldwin 		fprintf(fp, "%#x", cmd & SUBCMDMASK);
616*9289f547SJohn Baldwin 	fprintf(fp, ")");
617*9289f547SJohn Baldwin 	return (true);
618*9289f547SJohn Baldwin }
619*9289f547SJohn Baldwin 
620*9289f547SJohn Baldwin bool
621*9289f547SJohn Baldwin sysdecode_reboot_howto(FILE *fp, int howto, int *rem)
622*9289f547SJohn Baldwin {
623*9289f547SJohn Baldwin 
624*9289f547SJohn Baldwin 	return (print_mask_int(fp, rebootopt, howto, rem));
625*9289f547SJohn Baldwin }
626*9289f547SJohn Baldwin 
627*9289f547SJohn Baldwin bool
628*9289f547SJohn Baldwin sysdecode_rfork_flags(FILE *fp, int flags, int *rem)
629*9289f547SJohn Baldwin {
630*9289f547SJohn Baldwin 
631*9289f547SJohn Baldwin 	return (print_mask_int(fp, rforkflags, flags, rem));
632*9289f547SJohn Baldwin }
633*9289f547SJohn Baldwin 
634*9289f547SJohn Baldwin const char *
635*9289f547SJohn Baldwin sysdecode_rlimit(int resource)
636*9289f547SJohn Baldwin {
637*9289f547SJohn Baldwin 
638*9289f547SJohn Baldwin 	return (lookup_value(rlimit, resource));
639*9289f547SJohn Baldwin }
640*9289f547SJohn Baldwin 
641*9289f547SJohn Baldwin const char *
642*9289f547SJohn Baldwin sysdecode_scheduler_policy(int policy)
643*9289f547SJohn Baldwin {
644*9289f547SJohn Baldwin 
645*9289f547SJohn Baldwin 	return (lookup_value(schedpolicy, policy));
646*9289f547SJohn Baldwin }
647*9289f547SJohn Baldwin 
648*9289f547SJohn Baldwin bool
649*9289f547SJohn Baldwin sysdecode_sendfile_flags(FILE *fp, int flags, int *rem)
650*9289f547SJohn Baldwin {
651*9289f547SJohn Baldwin 
652*9289f547SJohn Baldwin 	return (print_mask_int(fp, sendfileflags, flags, rem));
653*9289f547SJohn Baldwin }
654*9289f547SJohn Baldwin 
655*9289f547SJohn Baldwin bool
656*9289f547SJohn Baldwin sysdecode_shmat_flags(FILE *fp, int flags, int *rem)
657*9289f547SJohn Baldwin {
658*9289f547SJohn Baldwin 
659*9289f547SJohn Baldwin 	return (print_mask_int(fp, shmatflags, flags, rem));
660*9289f547SJohn Baldwin }
661*9289f547SJohn Baldwin 
662*9289f547SJohn Baldwin const char *
663*9289f547SJohn Baldwin sysdecode_shutdown_how(int how)
664*9289f547SJohn Baldwin {
665*9289f547SJohn Baldwin 
666*9289f547SJohn Baldwin 	return (lookup_value(shutdownhow, how));
667*9289f547SJohn Baldwin }
668*9289f547SJohn Baldwin 
669*9289f547SJohn Baldwin const char *
670*9289f547SJohn Baldwin sysdecode_sigbus_code(int si_code)
671*9289f547SJohn Baldwin {
672*9289f547SJohn Baldwin 
673*9289f547SJohn Baldwin 	return (lookup_value(sigbuscode, si_code));
674*9289f547SJohn Baldwin }
675*9289f547SJohn Baldwin 
676*9289f547SJohn Baldwin const char *
677*9289f547SJohn Baldwin sysdecode_sigchld_code(int si_code)
678*9289f547SJohn Baldwin {
679*9289f547SJohn Baldwin 
680*9289f547SJohn Baldwin 	return (lookup_value(sigchldcode, si_code));
681*9289f547SJohn Baldwin }
682*9289f547SJohn Baldwin 
683*9289f547SJohn Baldwin const char *
684*9289f547SJohn Baldwin sysdecode_sigfpe_code(int si_code)
685*9289f547SJohn Baldwin {
686*9289f547SJohn Baldwin 
687*9289f547SJohn Baldwin 	return (lookup_value(sigfpecode, si_code));
688*9289f547SJohn Baldwin }
689*9289f547SJohn Baldwin 
690*9289f547SJohn Baldwin const char *
691*9289f547SJohn Baldwin sysdecode_sigill_code(int si_code)
692*9289f547SJohn Baldwin {
693*9289f547SJohn Baldwin 
694*9289f547SJohn Baldwin 	return (lookup_value(sigillcode, si_code));
695*9289f547SJohn Baldwin }
696*9289f547SJohn Baldwin 
697*9289f547SJohn Baldwin const char *
698*9289f547SJohn Baldwin sysdecode_sigsegv_code(int si_code)
699*9289f547SJohn Baldwin {
700*9289f547SJohn Baldwin 
701*9289f547SJohn Baldwin 	return (lookup_value(sigsegvcode, si_code));
702*9289f547SJohn Baldwin }
703*9289f547SJohn Baldwin 
704*9289f547SJohn Baldwin const char *
705*9289f547SJohn Baldwin sysdecode_sigtrap_code(int si_code)
706*9289f547SJohn Baldwin {
707*9289f547SJohn Baldwin 
708*9289f547SJohn Baldwin 	return (lookup_value(sigtrapcode, si_code));
709*9289f547SJohn Baldwin }
710*9289f547SJohn Baldwin 
711*9289f547SJohn Baldwin const char *
712*9289f547SJohn Baldwin sysdecode_sigprocmask_how(int how)
713*9289f547SJohn Baldwin {
714*9289f547SJohn Baldwin 
715*9289f547SJohn Baldwin 	return (lookup_value(sigprocmaskhow, how));
716*9289f547SJohn Baldwin }
717*9289f547SJohn Baldwin 
718*9289f547SJohn Baldwin const char *
719*9289f547SJohn Baldwin sysdecode_socketdomain(int domain)
720*9289f547SJohn Baldwin {
721*9289f547SJohn Baldwin 
722*9289f547SJohn Baldwin 	return (lookup_value(sockdomain, domain));
723*9289f547SJohn Baldwin }
724*9289f547SJohn Baldwin 
725*9289f547SJohn Baldwin const char *
726*9289f547SJohn Baldwin sysdecode_sockaddr_family(int sa_family)
727*9289f547SJohn Baldwin {
728*9289f547SJohn Baldwin 
729*9289f547SJohn Baldwin 	return (lookup_value(sockfamily, sa_family));
730*9289f547SJohn Baldwin }
731*9289f547SJohn Baldwin 
732*9289f547SJohn Baldwin const char *
733*9289f547SJohn Baldwin sysdecode_ipproto(int protocol)
734*9289f547SJohn Baldwin {
735*9289f547SJohn Baldwin 
736*9289f547SJohn Baldwin 	return (lookup_value(sockipproto, protocol));
737*9289f547SJohn Baldwin }
738*9289f547SJohn Baldwin 
739*9289f547SJohn Baldwin const char *
740*9289f547SJohn Baldwin sysdecode_sockopt_name(int level, int optname)
741*9289f547SJohn Baldwin {
742*9289f547SJohn Baldwin 
743*9289f547SJohn Baldwin 	if (level == SOL_SOCKET)
744*9289f547SJohn Baldwin 		return (lookup_value(sockopt, optname));
745*9289f547SJohn Baldwin 	if (level == IPPROTO_IP)
746*9289f547SJohn Baldwin 		/* XXX: UNIX domain socket options use a level of 0 also. */
747*9289f547SJohn Baldwin 		return (lookup_value(sockoptip, optname));
748*9289f547SJohn Baldwin 	if (level == IPPROTO_TCP)
749*9289f547SJohn Baldwin 		return (lookup_value(sockopttcp, optname));
750*9289f547SJohn Baldwin 	if (level == IPPROTO_UDP)
751*9289f547SJohn Baldwin 		return (lookup_value(sockoptudp, optname));
752*9289f547SJohn Baldwin 	return (NULL);
753*9289f547SJohn Baldwin }
754*9289f547SJohn Baldwin 
755*9289f547SJohn Baldwin bool
756*9289f547SJohn Baldwin sysdecode_thr_create_flags(FILE *fp, int flags, int *rem)
757*9289f547SJohn Baldwin {
758*9289f547SJohn Baldwin 
759*9289f547SJohn Baldwin 	return (print_mask_int(fp, thrcreateflags, flags, rem));
760*9289f547SJohn Baldwin }
761*9289f547SJohn Baldwin 
762*9289f547SJohn Baldwin const char *
763*9289f547SJohn Baldwin sysdecode_umtx_op(int op)
764*9289f547SJohn Baldwin {
765*9289f547SJohn Baldwin 
766*9289f547SJohn Baldwin 	return (lookup_value(umtxop, op));
767*9289f547SJohn Baldwin }
768*9289f547SJohn Baldwin 
769*9289f547SJohn Baldwin const char *
770*9289f547SJohn Baldwin sysdecode_vmresult(int result)
771*9289f547SJohn Baldwin {
772*9289f547SJohn Baldwin 
773*9289f547SJohn Baldwin 	return (lookup_value(vmresult, result));
774*9289f547SJohn Baldwin }
775*9289f547SJohn Baldwin 
776*9289f547SJohn Baldwin bool
777*9289f547SJohn Baldwin sysdecode_wait4_options(FILE *fp, int options, int *rem)
778*9289f547SJohn Baldwin {
779*9289f547SJohn Baldwin 	bool printed;
780*9289f547SJohn Baldwin 	int opt6;
781*9289f547SJohn Baldwin 
782*9289f547SJohn Baldwin 	/* A flags value of 0 is normal. */
783*9289f547SJohn Baldwin 	if (options == 0) {
784*9289f547SJohn Baldwin 		fputs("0", fp);
785*9289f547SJohn Baldwin 		if (rem != NULL)
786*9289f547SJohn Baldwin 			*rem = 0;
787*9289f547SJohn Baldwin 		return (true);
788*9289f547SJohn Baldwin 	}
789*9289f547SJohn Baldwin 
790*9289f547SJohn Baldwin 	/*
791*9289f547SJohn Baldwin 	 * These flags are implicit and aren't valid flags for wait4()
792*9289f547SJohn Baldwin 	 * directly (though they don't fail with EINVAL).
793*9289f547SJohn Baldwin 	 */
794*9289f547SJohn Baldwin 	opt6 = options & (WEXITED | WTRAPPED);
795*9289f547SJohn Baldwin 	options &= ~opt6;
796*9289f547SJohn Baldwin 	printed = print_mask_int(fp, wait6opt, options, rem);
797*9289f547SJohn Baldwin 	if (rem != NULL)
798*9289f547SJohn Baldwin 		*rem |= opt6;
799*9289f547SJohn Baldwin 	return (printed);
800*9289f547SJohn Baldwin }
801*9289f547SJohn Baldwin 
802*9289f547SJohn Baldwin bool
803*9289f547SJohn Baldwin sysdecode_wait6_options(FILE *fp, int options, int *rem)
804*9289f547SJohn Baldwin {
805*9289f547SJohn Baldwin 
806*9289f547SJohn Baldwin 	return (print_mask_int(fp, wait6opt, options, rem));
807*9289f547SJohn Baldwin }
808*9289f547SJohn Baldwin 
809*9289f547SJohn Baldwin const char *
810*9289f547SJohn Baldwin sysdecode_whence(int whence)
811*9289f547SJohn Baldwin {
812*9289f547SJohn Baldwin 
813*9289f547SJohn Baldwin 	return (lookup_value(seekwhence, whence));
814*9289f547SJohn Baldwin }
815*9289f547SJohn Baldwin 
816*9289f547SJohn Baldwin const char *
817*9289f547SJohn Baldwin sysdecode_fcntl_cmd(int cmd)
818*9289f547SJohn Baldwin {
819*9289f547SJohn Baldwin 
820*9289f547SJohn Baldwin 	return (lookup_value(fcntlcmd, cmd));
821*9289f547SJohn Baldwin }
822*9289f547SJohn Baldwin 
823*9289f547SJohn Baldwin static struct name_table fcntl_fd_arg[] = {
824*9289f547SJohn Baldwin 	X(FD_CLOEXEC) X(0) XEND
825*9289f547SJohn Baldwin };
826*9289f547SJohn Baldwin 
827*9289f547SJohn Baldwin bool
828*9289f547SJohn Baldwin sysdecode_fcntl_arg_p(int cmd)
829*9289f547SJohn Baldwin {
830*9289f547SJohn Baldwin 
831*9289f547SJohn Baldwin 	switch (cmd) {
832*9289f547SJohn Baldwin 	case F_GETFD:
833*9289f547SJohn Baldwin 	case F_GETFL:
834*9289f547SJohn Baldwin 	case F_GETOWN:
835*9289f547SJohn Baldwin 		return (false);
836*9289f547SJohn Baldwin 	default:
837*9289f547SJohn Baldwin 		return (true);
838*9289f547SJohn Baldwin 	}
839*9289f547SJohn Baldwin }
840*9289f547SJohn Baldwin 
841*9289f547SJohn Baldwin void
842*9289f547SJohn Baldwin sysdecode_fcntl_arg(FILE *fp, int cmd, uintptr_t arg, int base)
843*9289f547SJohn Baldwin {
844*9289f547SJohn Baldwin 	int rem;
845*9289f547SJohn Baldwin 
846*9289f547SJohn Baldwin 	switch (cmd) {
847*9289f547SJohn Baldwin 	case F_SETFD:
848*9289f547SJohn Baldwin 		if (!print_value(fp, fcntl_fd_arg, arg))
849*9289f547SJohn Baldwin 		    print_integer(fp, arg, base);
850*9289f547SJohn Baldwin 		break;
851*9289f547SJohn Baldwin 	case F_SETFL:
852*9289f547SJohn Baldwin 		if (!sysdecode_fcntl_fileflags(fp, arg, &rem))
853*9289f547SJohn Baldwin 			fprintf(fp, "%#x", rem);
854*9289f547SJohn Baldwin 		else if (rem != 0)
855*9289f547SJohn Baldwin 			fprintf(fp, "|%#x", rem);
856*9289f547SJohn Baldwin 		break;
857*9289f547SJohn Baldwin 	case F_GETLK:
858*9289f547SJohn Baldwin 	case F_SETLK:
859*9289f547SJohn Baldwin 	case F_SETLKW:
860*9289f547SJohn Baldwin 		fprintf(fp, "%p", (void *)arg);
861*9289f547SJohn Baldwin 		break;
862*9289f547SJohn Baldwin 	default:
863*9289f547SJohn Baldwin 		print_integer(fp, arg, base);
864*9289f547SJohn Baldwin 		break;
865*9289f547SJohn Baldwin 	}
866*9289f547SJohn Baldwin }
867*9289f547SJohn Baldwin 
868*9289f547SJohn Baldwin bool
869*9289f547SJohn Baldwin sysdecode_mmap_flags(FILE *fp, int flags, int *rem)
870*9289f547SJohn Baldwin {
871*9289f547SJohn Baldwin 	uintmax_t val;
872*9289f547SJohn Baldwin 	bool printed;
873*9289f547SJohn Baldwin 	int align;
874*9289f547SJohn Baldwin 
875*9289f547SJohn Baldwin 	/*
876*9289f547SJohn Baldwin 	 * MAP_ALIGNED can't be handled directly by print_mask_int().
877*9289f547SJohn Baldwin 	 * MAP_32BIT is also problematic since it isn't defined for
878*9289f547SJohn Baldwin 	 * all platforms.
879*9289f547SJohn Baldwin 	 */
880*9289f547SJohn Baldwin 	printed = false;
881*9289f547SJohn Baldwin 	align = flags & MAP_ALIGNMENT_MASK;
882*9289f547SJohn Baldwin 	val = (unsigned)flags & ~MAP_ALIGNMENT_MASK;
883*9289f547SJohn Baldwin 	print_mask_part(fp, mmapflags, &val, &printed);
884*9289f547SJohn Baldwin #ifdef MAP_32BIT
885*9289f547SJohn Baldwin 	if (val & MAP_32BIT) {
886*9289f547SJohn Baldwin 		fprintf(fp, "%sMAP_32BIT", printed ? "|" : "");
887*9289f547SJohn Baldwin 		printed = true;
888*9289f547SJohn Baldwin 		val &= ~MAP_32BIT;
889*9289f547SJohn Baldwin 	}
890*9289f547SJohn Baldwin #endif
891*9289f547SJohn Baldwin 	if (align != 0) {
892*9289f547SJohn Baldwin 		if (printed)
893*9289f547SJohn Baldwin 			fputc('|', fp);
894*9289f547SJohn Baldwin 		if (align == MAP_ALIGNED_SUPER)
895*9289f547SJohn Baldwin 			fputs("MAP_ALIGNED_SUPER", fp);
896*9289f547SJohn Baldwin 		else
897*9289f547SJohn Baldwin 			fprintf(fp, "MAP_ALIGNED(%d)",
898*9289f547SJohn Baldwin 			    align >> MAP_ALIGNMENT_SHIFT);
899*9289f547SJohn Baldwin 		printed = true;
900*9289f547SJohn Baldwin 	}
901*9289f547SJohn Baldwin 	if (rem != NULL)
902*9289f547SJohn Baldwin 		*rem = val;
903*9289f547SJohn Baldwin 	return (printed);
904*9289f547SJohn Baldwin }
905*9289f547SJohn Baldwin 
906*9289f547SJohn Baldwin const char *
907*9289f547SJohn Baldwin sysdecode_rtprio_function(int function)
908*9289f547SJohn Baldwin {
909*9289f547SJohn Baldwin 
910*9289f547SJohn Baldwin 	return (lookup_value(rtpriofuncs, function));
911*9289f547SJohn Baldwin }
912*9289f547SJohn Baldwin 
913*9289f547SJohn Baldwin bool
914*9289f547SJohn Baldwin sysdecode_msg_flags(FILE *fp, int flags, int *rem)
915*9289f547SJohn Baldwin {
916*9289f547SJohn Baldwin 
917*9289f547SJohn Baldwin 	return (print_mask_0(fp, msgflags, flags, rem));
918*9289f547SJohn Baldwin }
919*9289f547SJohn Baldwin 
920*9289f547SJohn Baldwin const char *
921*9289f547SJohn Baldwin sysdecode_sigcode(int sig, int si_code)
922*9289f547SJohn Baldwin {
923*9289f547SJohn Baldwin 	const char *str;
924*9289f547SJohn Baldwin 
925*9289f547SJohn Baldwin 	str = lookup_value(sigcode, si_code);
926*9289f547SJohn Baldwin 	if (str != NULL)
927*9289f547SJohn Baldwin 		return (str);
928*9289f547SJohn Baldwin 
929*9289f547SJohn Baldwin 	switch (sig) {
930*9289f547SJohn Baldwin 	case SIGILL:
931*9289f547SJohn Baldwin 		return (sysdecode_sigill_code(si_code));
932*9289f547SJohn Baldwin 	case SIGBUS:
933*9289f547SJohn Baldwin 		return (sysdecode_sigbus_code(si_code));
934*9289f547SJohn Baldwin 	case SIGSEGV:
935*9289f547SJohn Baldwin 		return (sysdecode_sigsegv_code(si_code));
936*9289f547SJohn Baldwin 	case SIGFPE:
937*9289f547SJohn Baldwin 		return (sysdecode_sigfpe_code(si_code));
938*9289f547SJohn Baldwin 	case SIGTRAP:
939*9289f547SJohn Baldwin 		return (sysdecode_sigtrap_code(si_code));
940*9289f547SJohn Baldwin 	case SIGCHLD:
941*9289f547SJohn Baldwin 		return (sysdecode_sigchld_code(si_code));
942*9289f547SJohn Baldwin 	default:
943*9289f547SJohn Baldwin 		return (NULL);
944*9289f547SJohn Baldwin 	}
945*9289f547SJohn Baldwin }
946*9289f547SJohn Baldwin 
947*9289f547SJohn Baldwin bool
948*9289f547SJohn Baldwin sysdecode_umtx_cvwait_flags(FILE *fp, u_long flags, u_long *rem)
949*9289f547SJohn Baldwin {
950*9289f547SJohn Baldwin 
951*9289f547SJohn Baldwin 	return (print_mask_0ul(fp, umtxcvwaitflags, flags, rem));
952*9289f547SJohn Baldwin }
953*9289f547SJohn Baldwin 
954*9289f547SJohn Baldwin bool
955*9289f547SJohn Baldwin sysdecode_umtx_rwlock_flags(FILE *fp, u_long flags, u_long *rem)
956*9289f547SJohn Baldwin {
957*9289f547SJohn Baldwin 
958*9289f547SJohn Baldwin 	return (print_mask_0ul(fp, umtxrwlockflags, flags, rem));
959*9289f547SJohn Baldwin }
960*9289f547SJohn Baldwin 
961*9289f547SJohn Baldwin /* XXX: This should be in <sys/capsicum.h> */
962*9289f547SJohn Baldwin #define	CAPMASK(right)	((right) && (((uint64_t)1 << 57) - 1))
963*9289f547SJohn Baldwin 
964*9289f547SJohn Baldwin void
965*9289f547SJohn Baldwin sysdecode_cap_rights(FILE *fp, cap_rights_t *rightsp)
966*9289f547SJohn Baldwin {
967*9289f547SJohn Baldwin 	struct name_table *t;
968*9289f547SJohn Baldwin 	int idx;
969*9289f547SJohn Baldwin 	bool comma;
970*9289f547SJohn Baldwin 
971*9289f547SJohn Baldwin 	comma = false;
972*9289f547SJohn Baldwin 	for (t = caprights; t->str != NULL; t++) {
973*9289f547SJohn Baldwin 		idx = ffs(CAPIDXBIT(t->val)) - 1;
974*9289f547SJohn Baldwin 		if (CAPARSIZE(rightsp) < idx)
975*9289f547SJohn Baldwin 			continue;
976*9289f547SJohn Baldwin 		if ((rightsp->cr_rights[CAPIDXBIT(t->val)] & CAPMASK(t->val)) ==
977*9289f547SJohn Baldwin 		    CAPMASK(t->val)) {
978*9289f547SJohn Baldwin 			fprintf(fp, "%s%s", comma ? "," : "", t->str);
979*9289f547SJohn Baldwin 			comma = true;
980*9289f547SJohn Baldwin 		}
981*9289f547SJohn Baldwin 	}
982*9289f547SJohn Baldwin }
983