aboutsummaryrefslogtreecommitdiff
path: root/lib/libsysdecode
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libsysdecode')
-rw-r--r--lib/libsysdecode/Makefile87
-rw-r--r--lib/libsysdecode/errno.c3
-rw-r--r--lib/libsysdecode/flags.c982
-rw-r--r--lib/libsysdecode/mkioctls1
-rw-r--r--lib/libsysdecode/mktables144
-rw-r--r--lib/libsysdecode/signal.c143
-rw-r--r--lib/libsysdecode/syscallnames.c3
-rw-r--r--lib/libsysdecode/sysdecode.313
-rw-r--r--lib/libsysdecode/sysdecode.h70
-rw-r--r--lib/libsysdecode/sysdecode_abi_to_freebsd_errno.35
-rw-r--r--lib/libsysdecode/sysdecode_cap_rights.350
-rw-r--r--lib/libsysdecode/sysdecode_enum.3235
-rw-r--r--lib/libsysdecode/sysdecode_fcntl_arg.3121
-rw-r--r--lib/libsysdecode/sysdecode_ioctlname.35
-rw-r--r--lib/libsysdecode/sysdecode_mask.3216
-rw-r--r--lib/libsysdecode/sysdecode_quotactl_cmd.393
-rw-r--r--lib/libsysdecode/sysdecode_sigcode.383
-rw-r--r--lib/libsysdecode/sysdecode_sockopt_name.361
-rw-r--r--lib/libsysdecode/sysdecode_syscallnames.35
-rw-r--r--lib/libsysdecode/sysdecode_utrace.35
-rw-r--r--lib/libsysdecode/utrace.c1
21 files changed, 2316 insertions, 10 deletions
diff --git a/lib/libsysdecode/Makefile b/lib/libsysdecode/Makefile
index 123ea49ca572..5e0590e912f8 100644
--- a/lib/libsysdecode/Makefile
+++ b/lib/libsysdecode/Makefile
@@ -5,20 +5,94 @@
PACKAGE=lib${LIB}
LIB= sysdecode
-SRCS= errno.c ioctl.c syscallnames.c utrace.c
+SRCS= errno.c flags.c ioctl.c signal.c syscallnames.c utrace.c
INCS= sysdecode.h
+CFLAGS+= -I${.OBJDIR}
CFLAGS+= -I${.CURDIR}/../../sys
CFLAGS+= -I${.CURDIR}/../../libexec/rtld-elf
-MAN+= sysdecode.3 \
+MAN= sysdecode.3 \
sysdecode_abi_to_freebsd_errno.3 \
+ sysdecode_cap_rights.3 \
+ sysdecode_enum.3 \
+ sysdecode_fcntl_arg.3 \
sysdecode_ioctlname.3 \
+ sysdecode_mask.3 \
+ sysdecode_quotactl_cmd.3 \
+ sysdecode_sigcode.3 \
+ sysdecode_sockopt_name.3 \
sysdecode_syscallnames.3 \
sysdecode_utrace.3
-MLINKS+= sysdecode_abi_to_freebsd_errno.3 sysdecode_freebsd_to_abi_errno.3
+MLINKS= sysdecode_abi_to_freebsd_errno.3 sysdecode_freebsd_to_abi_errno.3
+MLINKS+=sysdecode_enum.3 sysdecode_acltype.3 \
+ sysdecode_enum.3 sysdecode_atfd.3 \
+ sysdecode_enum.3 sysdecode_extattrnamespace.3 \
+ sysdecode_enum.3 sysdecode_fadvice.3 \
+ sysdecode_enum.3 sysdecode_fcntl_cmd.3 \
+ sysdecode_enum.3 sysdecode_idtype.3 \
+ sysdecode_enum.3 sysdecode_ipproto.3 \
+ sysdecode_enum.3 sysdecode_kldsym_cmd.3 \
+ sysdecode_enum.3 sysdecode_kldunload_flags.3 \
+ sysdecode_enum.3 sysdecode_lio_listio_mode.3 \
+ sysdecode_enum.3 sysdecode_madvice.3 \
+ sysdecode_enum.3 sysdecode_minherit_flags.3 \
+ sysdecode_enum.3 sysdecode_msgctl_cmd.3 \
+ sysdecode_enum.3 sysdecode_nfssvc_flags.3 \
+ sysdecode_enum.3 sysdecode_prio_which.3 \
+ sysdecode_enum.3 sysdecode_procctl_cmd.3 \
+ sysdecode_enum.3 sysdecode_ptrace_request.3 \
+ sysdecode_enum.3 sysdecode_rlimit.3 \
+ sysdecode_enum.3 sysdecode_rtprio_function.3 \
+ sysdecode_enum.3 sysdecode_scheduler_policy.3 \
+ sysdecode_enum.3 sysdecode_semctl_cmd.3 \
+ sysdecode_enum.3 sysdecode_shmctl_cmd.3 \
+ sysdecode_enum.3 sysdecode_shutdown_how.3 \
+ sysdecode_enum.3 sysdecode_sigbus_code.3 \
+ sysdecode_enum.3 sysdecode_sigchld_code.3 \
+ sysdecode_enum.3 sysdecode_sigfpe_code.3 \
+ sysdecode_enum.3 sysdecode_sigill_code.3 \
+ sysdecode_enum.3 sysdecode_signal.3 \
+ sysdecode_enum.3 sysdecode_sigprocmask_how.3 \
+ sysdecode_enum.3 sysdecode_sigsegv_code.3 \
+ sysdecode_enum.3 sysdecode_sigtrap_code.3 \
+ sysdecode_enum.3 sysdecode_sockaddr_family.3 \
+ sysdecode_enum.3 sysdecode_socketdomain.3 \
+ sysdecode_enum.3 sysdecode_sockettype.3 \
+ sysdecode_enum.3 sysdecode_sockopt_level.3 \
+ sysdecode_enum.3 sysdecode_umtx_op.3 \
+ sysdecode_enum.3 sysdecode_vmresult.3 \
+ sysdecode_enum.3 sysdecode_whence.3
+MLINKS+=sysdecode_fcntl_arg.3 sysdecode_fcntl_arg_p.3
+MLINKS+=sysdecode_mask.3 sysdecode_accessmode.3 \
+ sysdecode_mask.3 sysdecode_capfcntlrights.3 \
+ sysdecode_mask.3 sysdecode_fcntl_fileflags.3 \
+ sysdecode_mask.3 sysdecode_fileflags.3 \
+ sysdecode_mask.3 sysdecode_filemode.3 \
+ sysdecode_mask.3 sysdecode_flock_operation.3 \
+ sysdecode_mask.3 sysdecode_getfsstat_flags.3 \
+ sysdecode_mask.3 sysdecode_mlockall_flags.3 \
+ sysdecode_mask.3 sysdecode_mmap_flags.3 \
+ sysdecode_mask.3 sysdecode_mmap_prot.3 \
+ sysdecode_mask.3 sysdecode_mount_flags.3 \
+ sysdecode_mask.3 sysdecode_msg_flags.3 \
+ sysdecode_mask.3 sysdecode_msync_flags.3 \
+ sysdecode_mask.3 sysdecode_open_flags.3 \
+ sysdecode_mask.3 sysdecode_pipe2_flags.3 \
+ sysdecode_mask.3 sysdecode_reboot_howto.3 \
+ sysdecode_mask.3 sysdecode_rfork_flags.3 \
+ sysdecode_mask.3 sysdecode_semget_flags.3 \
+ sysdecode_mask.3 sysdecode_sendfile_flags.3 \
+ sysdecode_mask.3 sysdecode_shmat_flags.3 \
+ sysdecode_mask.3 sysdecode_socket_type.3 \
+ sysdecode_mask.3 sysdecode_thr_create_flags.3 \
+ sysdecode_mask.3 sysdecode_umtx_cvwait_flags.3 \
+ sysdecode_mask.3 sysdecode_umtx_rwlock_flags.3 \
+ sysdecode_mask.3 sysdecode_vmprot.3 \
+ sysdecode_mask.3 sysdecode_wait4_options.3 \
+ sysdecode_mask.3 sysdecode_wait6_options.3
-CLEANFILES= ioctl.c
+CLEANFILES= ioctl.c tables.h
.if defined(COMPAT_32BIT)
CPP+= -m32
@@ -36,10 +110,13 @@ CFLAGS.gcc.ioctl.c+= -Wno-unused
CFLAGS.gcc+= ${CFLAGS.gcc.${.IMPSRC}}
+tables.h: mktables
+ sh ${.CURDIR}/mktables ${DESTDIR}${INCLUDEDIR} > ${.TARGET}
+
ioctl.c: mkioctls
env MACHINE=${MACHINE} CPP="${CPP}" \
/bin/sh ${.CURDIR}/mkioctls ${DESTDIR}${INCLUDEDIR} > ${.TARGET}
-beforedepend: ioctl.c
+beforedepend: ioctl.c tables.h
.include <bsd.lib.mk>
diff --git a/lib/libsysdecode/errno.c b/lib/libsysdecode/errno.c
index c21d21616ba3..9f404e0af0b2 100644
--- a/lib/libsysdecode/errno.c
+++ b/lib/libsysdecode/errno.c
@@ -28,8 +28,11 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
+#include <sys/acl.h>
+#include <sys/wait.h>
#include <errno.h>
#include <limits.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/lib/libsysdecode/flags.c b/lib/libsysdecode/flags.c
new file mode 100644
index 000000000000..3a705c7e9c5f
--- /dev/null
+++ b/lib/libsysdecode/flags.c
@@ -0,0 +1,982 @@
+/*
+ * Copyright (c) 2006 "David Kirchner" <dpk@dpk.net>. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define L2CAP_SOCKET_CHECKED
+
+#include <sys/types.h>
+#include <sys/acl.h>
+#include <sys/capsicum.h>
+#include <sys/extattr.h>
+#include <sys/linker.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/procctl.h>
+#include <sys/ptrace.h>
+#include <sys/reboot.h>
+#include <sys/resource.h>
+#include <sys/rtprio.h>
+#include <sys/sem.h>
+#include <sys/shm.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/thr.h>
+#include <sys/umtx.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <nfsserver/nfs.h>
+#include <ufs/ufs/quota.h>
+#include <vm/vm_param.h>
+#include <aio.h>
+#include <fcntl.h>
+#include <sched.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <strings.h>
+#include <sysdecode.h>
+#include <unistd.h>
+#include <sys/bitstring.h>
+#include <netgraph/bluetooth/include/ng_hci.h>
+#include <netgraph/bluetooth/include/ng_l2cap.h>
+#include <netgraph/bluetooth/include/ng_btsocket.h>
+
+/*
+ * This is taken from the xlat tables originally in truss which were
+ * in turn taken from strace.
+ */
+struct name_table {
+ uintmax_t val;
+ const char *str;
+};
+
+#define X(a) { a, #a },
+#define XEND { 0, NULL }
+
+#define TABLE_START(n) static struct name_table n[] = {
+#define TABLE_ENTRY X
+#define TABLE_END XEND };
+
+#include "tables.h"
+
+#undef TABLE_START
+#undef TABLE_ENTRY
+#undef TABLE_END
+
+/*
+ * These are simple support macros. print_or utilizes a variable
+ * defined in the calling function to track whether or not it should
+ * print a logical-OR character ('|') before a string. if_print_or
+ * simply handles the necessary "if" statement used in many lines
+ * of this file.
+ */
+#define print_or(fp,str,orflag) do { \
+ if (orflag) fputc(fp, '|'); else orflag = true; \
+ fprintf(fp, str); } \
+ while (0)
+#define if_print_or(fp,i,flag,orflag) do { \
+ if ((i & flag) == flag) \
+ print_or(fp,#flag,orflag); } \
+ while (0)
+
+static const char *
+lookup_value(struct name_table *table, uintmax_t val)
+{
+
+ for (; table->str != NULL; table++)
+ if (table->val == val)
+ return (table->str);
+ return (NULL);
+}
+
+/*
+ * Used when the value maps to a bitmask of #definition values in the
+ * table. This is a helper routine which outputs a symbolic mask of
+ * matched masks. Multiple masks are separated by a pipe ('|').
+ * The value is modified on return to only hold unmatched bits.
+ */
+static void
+print_mask_part(FILE *fp, struct name_table *table, uintmax_t *valp,
+ bool *printed)
+{
+ uintmax_t rem;
+
+ rem = *valp;
+ for (; table->str != NULL; table++) {
+ if ((table->val & rem) == table->val) {
+ /*
+ * Only print a zero mask if the raw value is
+ * zero.
+ */
+ if (table->val == 0 && *valp != 0)
+ continue;
+ fprintf(fp, "%s%s", *printed ? "|" : "", table->str);
+ *printed = true;
+ rem &= ~table->val;
+ }
+ }
+
+ *valp = rem;
+}
+
+/*
+ * Used when the value maps to a bitmask of #definition values in the
+ * table. The return value is true if something was printed. If
+ * rem is not NULL, *rem holds any bits not decoded if something was
+ * printed. If nothing was printed and rem is not NULL, *rem holds
+ * the original value.
+ */
+static bool
+print_mask_int(FILE *fp, struct name_table *table, int ival, int *rem)
+{
+ uintmax_t val;
+ bool printed;
+
+ printed = false;
+ val = (unsigned)ival;
+ print_mask_part(fp, table, &val, &printed);
+ if (rem != NULL)
+ *rem = val;
+ return (printed);
+}
+
+/*
+ * Used for a mask of optional flags where a value of 0 is valid.
+ */
+static bool
+print_mask_0(FILE *fp, struct name_table *table, int val, int *rem)
+{
+
+ if (val == 0) {
+ fputs("0", fp);
+ if (rem != NULL)
+ *rem = 0;
+ return (true);
+ }
+ return (print_mask_int(fp, table, val, rem));
+}
+
+/*
+ * Like print_mask_0 but for a unsigned long instead of an int.
+ */
+static bool
+print_mask_0ul(FILE *fp, struct name_table *table, u_long lval, u_long *rem)
+{
+ uintmax_t val;
+ bool printed;
+
+ if (lval == 0) {
+ fputs("0", fp);
+ if (rem != NULL)
+ *rem = 0;
+ return (true);
+ }
+
+ printed = false;
+ val = lval;
+ print_mask_part(fp, table, &val, &printed);
+ if (rem != NULL)
+ *rem = val;
+ return (printed);
+}
+
+static void
+print_integer(FILE *fp, int val, int base)
+{
+
+ switch (base) {
+ case 8:
+ fprintf(fp, "0%o", val);
+ break;
+ case 10:
+ fprintf(fp, "%d", val);
+ break;
+ case 16:
+ fprintf(fp, "0x%x", val);
+ break;
+ default:
+ abort2("bad base", 0, NULL);
+ break;
+ }
+}
+
+static bool
+print_value(FILE *fp, struct name_table *table, uintmax_t val)
+{
+ const char *str;
+
+ str = lookup_value(table, val);
+ if (str != NULL) {
+ fputs(str, fp);
+ return (true);
+ }
+ return (false);
+}
+
+const char *
+sysdecode_atfd(int fd)
+{
+
+ if (fd == AT_FDCWD)
+ return ("AT_FDCWD");
+ return (NULL);
+}
+
+static struct name_table semctlops[] = {
+ X(GETNCNT) X(GETPID) X(GETVAL) X(GETALL) X(GETZCNT) X(SETVAL) X(SETALL)
+ X(IPC_RMID) X(IPC_SET) X(IPC_STAT) XEND
+};
+
+const char *
+sysdecode_semctl_cmd(int cmd)
+{
+
+ return (lookup_value(semctlops, cmd));
+}
+
+static struct name_table shmctlops[] = {
+ X(IPC_RMID) X(IPC_SET) X(IPC_STAT) XEND
+};
+
+const char *
+sysdecode_shmctl_cmd(int cmd)
+{
+
+ return (lookup_value(shmctlops, cmd));
+}
+
+const char *
+sysdecode_msgctl_cmd(int cmd)
+{
+
+ return (sysdecode_shmctl_cmd(cmd));
+}
+
+static struct name_table semgetflags[] = {
+ X(IPC_CREAT) X(IPC_EXCL) X(SEM_R) X(SEM_A) X((SEM_R>>3)) X((SEM_A>>3))
+ X((SEM_R>>6)) X((SEM_A>>6)) XEND
+};
+
+bool
+sysdecode_semget_flags(FILE *fp, int flag, int *rem)
+{
+
+ return (print_mask_int(fp, semgetflags, flag, rem));
+}
+
+static struct name_table idtypes[] = {
+ X(P_PID) X(P_PPID) X(P_PGID) X(P_SID) X(P_CID) X(P_UID) X(P_GID)
+ X(P_ALL) X(P_LWPID) X(P_TASKID) X(P_PROJID) X(P_POOLID) X(P_JAILID)
+ X(P_CTID) X(P_CPUID) X(P_PSETID) XEND
+};
+
+/* XXX: idtype is really an idtype_t */
+const char *
+sysdecode_idtype(int idtype)
+{
+
+ return (lookup_value(idtypes, idtype));
+}
+
+/*
+ * [g|s]etsockopt's level argument can either be SOL_SOCKET or a
+ * protocol-specific value.
+ */
+const char *
+sysdecode_sockopt_level(int level)
+{
+ const char *str;
+
+ if (level == SOL_SOCKET)
+ return ("SOL_SOCKET");
+
+ /* SOL_* constants for Bluetooth sockets. */
+ str = lookup_value(ngbtsolevel, level);
+ if (str != NULL)
+ return (str);
+
+ /*
+ * IP and Infiniband sockets use IP protocols as levels. Not all
+ * protocols are valid but it is simpler to just allow all of them.
+ *
+ * XXX: IPPROTO_IP == 0, but UNIX domain sockets use a level of 0
+ * for private options.
+ */
+ str = sysdecode_ipproto(level);
+ if (str != NULL)
+ return (str);
+
+ return (NULL);
+}
+
+bool
+sysdecode_vmprot(FILE *fp, int type, int *rem)
+{
+
+ return (print_mask_int(fp, vmprot, type, rem));
+}
+
+static struct name_table sockflags[] = {
+ X(SOCK_CLOEXEC) X(SOCK_NONBLOCK) XEND
+};
+
+bool
+sysdecode_socket_type(FILE *fp, int type, int *rem)
+{
+ const char *str;
+ uintmax_t val;
+ bool printed;
+
+ str = lookup_value(socktype, type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK));
+ if (str != NULL) {
+ fputs(str, fp);
+ *rem = 0;
+ printed = true;
+ } else {
+ *rem = type & ~(SOCK_CLOEXEC | SOCK_NONBLOCK);
+ printed = false;
+ }
+ val = type & (SOCK_CLOEXEC | SOCK_NONBLOCK);
+ print_mask_part(fp, sockflags, &val, &printed);
+ return (printed);
+}
+
+bool
+sysdecode_access_mode(FILE *fp, int mode, int *rem)
+{
+
+ return (print_mask_int(fp, accessmode, mode, rem));
+}
+
+/* XXX: 'type' is really an acl_type_t. */
+const char *
+sysdecode_acltype(int type)
+{
+
+ return (lookup_value(acltype, type));
+}
+
+bool
+sysdecode_cap_fcntlrights(FILE *fp, uint32_t rights, uint32_t *rem)
+{
+
+ return (print_mask_int(fp, capfcntl, rights, rem));
+}
+
+const char *
+sysdecode_extattrnamespace(int namespace)
+{
+
+ return (lookup_value(extattrns, namespace));
+}
+
+const char *
+sysdecode_fadvice(int advice)
+{
+
+ return (lookup_value(fadvisebehav, advice));
+}
+
+bool
+sysdecode_open_flags(FILE *fp, int flags, int *rem)
+{
+ bool printed;
+ int mode;
+ uintmax_t val;
+
+ mode = flags & O_ACCMODE;
+ flags &= ~O_ACCMODE;
+ switch (mode) {
+ case O_RDONLY:
+ if (flags & O_EXEC) {
+ flags &= ~O_EXEC;
+ fputs("O_EXEC", fp);
+ } else
+ fputs("O_RDONLY", fp);
+ printed = true;
+ mode = 0;
+ break;
+ case O_WRONLY:
+ fputs("O_WRONLY", fp);
+ printed = true;
+ mode = 0;
+ break;
+ case O_RDWR:
+ fputs("O_RDWR", fp);
+ printed = true;
+ mode = 0;
+ break;
+ default:
+ printed = false;
+ }
+ val = (unsigned)flags;
+ print_mask_part(fp, openflags, &val, &printed);
+ if (rem != NULL)
+ *rem = val | mode;
+ return (printed);
+}
+
+bool
+sysdecode_fcntl_fileflags(FILE *fp, int flags, int *rem)
+{
+ bool printed;
+ int oflags;
+
+ /*
+ * The file flags used with F_GETFL/F_SETFL mostly match the
+ * flags passed to open(2). However, a few open-only flag
+ * bits have been repurposed for fcntl-only flags.
+ */
+ oflags = flags & ~(O_NOFOLLOW | FRDAHEAD);
+ printed = sysdecode_open_flags(fp, oflags, rem);
+ if (flags & O_NOFOLLOW) {
+ fprintf(fp, "%sFPOIXSHM", printed ? "|" : "");
+ printed = true;
+ }
+ if (flags & FRDAHEAD) {
+ fprintf(fp, "%sFRDAHEAD", printed ? "|" : "");
+ printed = true;
+ }
+ return (printed);
+}
+
+bool
+sysdecode_flock_operation(FILE *fp, int operation, int *rem)
+{
+
+ return (print_mask_int(fp, flockops, operation, rem));
+}
+
+bool
+sysdecode_getfsstat_flags(FILE *fp, int flags, int *rem)
+{
+
+ return (print_mask_int(fp, getfsstatflags, flags, rem));
+}
+
+const char *
+sysdecode_kldsym_cmd(int cmd)
+{
+
+ return (lookup_value(kldsymcmd, cmd));
+}
+
+const char *
+sysdecode_kldunload_flags(int flags)
+{
+
+ return (lookup_value(kldunloadfflags, flags));
+}
+
+const char *
+sysdecode_lio_listio_mode(int mode)
+{
+
+ return (lookup_value(lio_listiomodes, mode));
+}
+
+const char *
+sysdecode_madvice(int advice)
+{
+
+ return (lookup_value(madvisebehav, advice));
+}
+
+const char *
+sysdecode_minherit_inherit(int inherit)
+{
+
+ return (lookup_value(minheritflags, inherit));
+}
+
+bool
+sysdecode_mlockall_flags(FILE *fp, int flags, int *rem)
+{
+
+ return (print_mask_int(fp, mlockallflags, flags, rem));
+}
+
+bool
+sysdecode_mmap_prot(FILE *fp, int prot, int *rem)
+{
+
+ return (print_mask_int(fp, mmapprot, prot, rem));
+}
+
+bool
+sysdecode_fileflags(FILE *fp, fflags_t flags, fflags_t *rem)
+{
+
+ return (print_mask_0(fp, fileflags, flags, rem));
+}
+
+bool
+sysdecode_filemode(FILE *fp, int mode, int *rem)
+{
+
+ return (print_mask_0(fp, filemode, mode, rem));
+}
+
+bool
+sysdecode_mount_flags(FILE *fp, int flags, int *rem)
+{
+
+ return (print_mask_int(fp, mountflags, flags, rem));
+}
+
+bool
+sysdecode_msync_flags(FILE *fp, int flags, int *rem)
+{
+
+ return (print_mask_int(fp, msyncflags, flags, rem));
+}
+
+const char *
+sysdecode_nfssvc_flags(int flags)
+{
+
+ return (lookup_value(nfssvcflags, flags));
+}
+
+static struct name_table pipe2flags[] = {
+ X(O_CLOEXEC) X(O_NONBLOCK) XEND
+};
+
+bool
+sysdecode_pipe2_flags(FILE *fp, int flags, int *rem)
+{
+
+ return (print_mask_0(fp, pipe2flags, flags, rem));
+}
+
+const char *
+sysdecode_prio_which(int which)
+{
+
+ return (lookup_value(prio, which));
+}
+
+const char *
+sysdecode_procctl_cmd(int cmd)
+{
+
+ return (lookup_value(procctlcmd, cmd));
+}
+
+const char *
+sysdecode_ptrace_request(int request)
+{
+
+ return (lookup_value(ptraceop, request));
+}
+
+static struct name_table quotatypes[] = {
+ X(GRPQUOTA) X(USRQUOTA) XEND
+};
+
+bool
+sysdecode_quotactl_cmd(FILE *fp, int cmd)
+{
+ const char *primary, *type;
+
+ primary = lookup_value(quotactlcmds, cmd >> SUBCMDSHIFT);
+ if (primary == NULL)
+ return (false);
+ fprintf(fp, "QCMD(%s,", primary);
+ type = lookup_value(quotatypes, cmd & SUBCMDMASK);
+ if (type != NULL)
+ fprintf(fp, "%s", type);
+ else
+ fprintf(fp, "%#x", cmd & SUBCMDMASK);
+ fprintf(fp, ")");
+ return (true);
+}
+
+bool
+sysdecode_reboot_howto(FILE *fp, int howto, int *rem)
+{
+
+ return (print_mask_int(fp, rebootopt, howto, rem));
+}
+
+bool
+sysdecode_rfork_flags(FILE *fp, int flags, int *rem)
+{
+
+ return (print_mask_int(fp, rforkflags, flags, rem));
+}
+
+const char *
+sysdecode_rlimit(int resource)
+{
+
+ return (lookup_value(rlimit, resource));
+}
+
+const char *
+sysdecode_scheduler_policy(int policy)
+{
+
+ return (lookup_value(schedpolicy, policy));
+}
+
+bool
+sysdecode_sendfile_flags(FILE *fp, int flags, int *rem)
+{
+
+ return (print_mask_int(fp, sendfileflags, flags, rem));
+}
+
+bool
+sysdecode_shmat_flags(FILE *fp, int flags, int *rem)
+{
+
+ return (print_mask_int(fp, shmatflags, flags, rem));
+}
+
+const char *
+sysdecode_shutdown_how(int how)
+{
+
+ return (lookup_value(shutdownhow, how));
+}
+
+const char *
+sysdecode_sigbus_code(int si_code)
+{
+
+ return (lookup_value(sigbuscode, si_code));
+}
+
+const char *
+sysdecode_sigchld_code(int si_code)
+{
+
+ return (lookup_value(sigchldcode, si_code));
+}
+
+const char *
+sysdecode_sigfpe_code(int si_code)
+{
+
+ return (lookup_value(sigfpecode, si_code));
+}
+
+const char *
+sysdecode_sigill_code(int si_code)
+{
+
+ return (lookup_value(sigillcode, si_code));
+}
+
+const char *
+sysdecode_sigsegv_code(int si_code)
+{
+
+ return (lookup_value(sigsegvcode, si_code));
+}
+
+const char *
+sysdecode_sigtrap_code(int si_code)
+{
+
+ return (lookup_value(sigtrapcode, si_code));
+}
+
+const char *
+sysdecode_sigprocmask_how(int how)
+{
+
+ return (lookup_value(sigprocmaskhow, how));
+}
+
+const char *
+sysdecode_socketdomain(int domain)
+{
+
+ return (lookup_value(sockdomain, domain));
+}
+
+const char *
+sysdecode_sockaddr_family(int sa_family)
+{
+
+ return (lookup_value(sockfamily, sa_family));
+}
+
+const char *
+sysdecode_ipproto(int protocol)
+{
+
+ return (lookup_value(sockipproto, protocol));
+}
+
+const char *
+sysdecode_sockopt_name(int level, int optname)
+{
+
+ if (level == SOL_SOCKET)
+ return (lookup_value(sockopt, optname));
+ if (level == IPPROTO_IP)
+ /* XXX: UNIX domain socket options use a level of 0 also. */
+ return (lookup_value(sockoptip, optname));
+ if (level == IPPROTO_TCP)
+ return (lookup_value(sockopttcp, optname));
+ if (level == IPPROTO_UDP)
+ return (lookup_value(sockoptudp, optname));
+ return (NULL);
+}
+
+bool
+sysdecode_thr_create_flags(FILE *fp, int flags, int *rem)
+{
+
+ return (print_mask_int(fp, thrcreateflags, flags, rem));
+}
+
+const char *
+sysdecode_umtx_op(int op)
+{
+
+ return (lookup_value(umtxop, op));
+}
+
+const char *
+sysdecode_vmresult(int result)
+{
+
+ return (lookup_value(vmresult, result));
+}
+
+bool
+sysdecode_wait4_options(FILE *fp, int options, int *rem)
+{
+ bool printed;
+ int opt6;
+
+ /* A flags value of 0 is normal. */
+ if (options == 0) {
+ fputs("0", fp);
+ if (rem != NULL)
+ *rem = 0;
+ return (true);
+ }
+
+ /*
+ * These flags are implicit and aren't valid flags for wait4()
+ * directly (though they don't fail with EINVAL).
+ */
+ opt6 = options & (WEXITED | WTRAPPED);
+ options &= ~opt6;
+ printed = print_mask_int(fp, wait6opt, options, rem);
+ if (rem != NULL)
+ *rem |= opt6;
+ return (printed);
+}
+
+bool
+sysdecode_wait6_options(FILE *fp, int options, int *rem)
+{
+
+ return (print_mask_int(fp, wait6opt, options, rem));
+}
+
+const char *
+sysdecode_whence(int whence)
+{
+
+ return (lookup_value(seekwhence, whence));
+}
+
+const char *
+sysdecode_fcntl_cmd(int cmd)
+{
+
+ return (lookup_value(fcntlcmd, cmd));
+}
+
+static struct name_table fcntl_fd_arg[] = {
+ X(FD_CLOEXEC) X(0) XEND
+};
+
+bool
+sysdecode_fcntl_arg_p(int cmd)
+{
+
+ switch (cmd) {
+ case F_GETFD:
+ case F_GETFL:
+ case F_GETOWN:
+ return (false);
+ default:
+ return (true);
+ }
+}
+
+void
+sysdecode_fcntl_arg(FILE *fp, int cmd, uintptr_t arg, int base)
+{
+ int rem;
+
+ switch (cmd) {
+ case F_SETFD:
+ if (!print_value(fp, fcntl_fd_arg, arg))
+ print_integer(fp, arg, base);
+ break;
+ case F_SETFL:
+ if (!sysdecode_fcntl_fileflags(fp, arg, &rem))
+ fprintf(fp, "%#x", rem);
+ else if (rem != 0)
+ fprintf(fp, "|%#x", rem);
+ break;
+ case F_GETLK:
+ case F_SETLK:
+ case F_SETLKW:
+ fprintf(fp, "%p", (void *)arg);
+ break;
+ default:
+ print_integer(fp, arg, base);
+ break;
+ }
+}
+
+bool
+sysdecode_mmap_flags(FILE *fp, int flags, int *rem)
+{
+ uintmax_t val;
+ bool printed;
+ int align;
+
+ /*
+ * MAP_ALIGNED can't be handled directly by print_mask_int().
+ * MAP_32BIT is also problematic since it isn't defined for
+ * all platforms.
+ */
+ printed = false;
+ align = flags & MAP_ALIGNMENT_MASK;
+ val = (unsigned)flags & ~MAP_ALIGNMENT_MASK;
+ print_mask_part(fp, mmapflags, &val, &printed);
+#ifdef MAP_32BIT
+ if (val & MAP_32BIT) {
+ fprintf(fp, "%sMAP_32BIT", printed ? "|" : "");
+ printed = true;
+ val &= ~MAP_32BIT;
+ }
+#endif
+ if (align != 0) {
+ if (printed)
+ fputc('|', fp);
+ if (align == MAP_ALIGNED_SUPER)
+ fputs("MAP_ALIGNED_SUPER", fp);
+ else
+ fprintf(fp, "MAP_ALIGNED(%d)",
+ align >> MAP_ALIGNMENT_SHIFT);
+ printed = true;
+ }
+ if (rem != NULL)
+ *rem = val;
+ return (printed);
+}
+
+const char *
+sysdecode_rtprio_function(int function)
+{
+
+ return (lookup_value(rtpriofuncs, function));
+}
+
+bool
+sysdecode_msg_flags(FILE *fp, int flags, int *rem)
+{
+
+ return (print_mask_0(fp, msgflags, flags, rem));
+}
+
+const char *
+sysdecode_sigcode(int sig, int si_code)
+{
+ const char *str;
+
+ str = lookup_value(sigcode, si_code);
+ if (str != NULL)
+ return (str);
+
+ switch (sig) {
+ case SIGILL:
+ return (sysdecode_sigill_code(si_code));
+ case SIGBUS:
+ return (sysdecode_sigbus_code(si_code));
+ case SIGSEGV:
+ return (sysdecode_sigsegv_code(si_code));
+ case SIGFPE:
+ return (sysdecode_sigfpe_code(si_code));
+ case SIGTRAP:
+ return (sysdecode_sigtrap_code(si_code));
+ case SIGCHLD:
+ return (sysdecode_sigchld_code(si_code));
+ default:
+ return (NULL);
+ }
+}
+
+bool
+sysdecode_umtx_cvwait_flags(FILE *fp, u_long flags, u_long *rem)
+{
+
+ return (print_mask_0ul(fp, umtxcvwaitflags, flags, rem));
+}
+
+bool
+sysdecode_umtx_rwlock_flags(FILE *fp, u_long flags, u_long *rem)
+{
+
+ return (print_mask_0ul(fp, umtxrwlockflags, flags, rem));
+}
+
+/* XXX: This should be in <sys/capsicum.h> */
+#define CAPMASK(right) ((right) && (((uint64_t)1 << 57) - 1))
+
+void
+sysdecode_cap_rights(FILE *fp, cap_rights_t *rightsp)
+{
+ struct name_table *t;
+ int idx;
+ bool comma;
+
+ comma = false;
+ for (t = caprights; t->str != NULL; t++) {
+ idx = ffs(CAPIDXBIT(t->val)) - 1;
+ if (CAPARSIZE(rightsp) < idx)
+ continue;
+ if ((rightsp->cr_rights[CAPIDXBIT(t->val)] & CAPMASK(t->val)) ==
+ CAPMASK(t->val)) {
+ fprintf(fp, "%s%s", comma ? "," : "", t->str);
+ comma = true;
+ }
+ }
+}
diff --git a/lib/libsysdecode/mkioctls b/lib/libsysdecode/mkioctls
index e174d30928bd..b99ff19f2486 100644
--- a/lib/libsysdecode/mkioctls
+++ b/lib/libsysdecode/mkioctls
@@ -62,6 +62,7 @@ BEGIN {
print "#include <netinet6/ip6_mroute.h>"
print "#include <stdio.h>"
print "#include <cam/cam.h>"
+ print "#include <stdbool.h>"
print "#include <stddef.h>"
print "#include <stdint.h>"
print "#include <sysdecode.h>"
diff --git a/lib/libsysdecode/mktables b/lib/libsysdecode/mktables
new file mode 100644
index 000000000000..0cc2ff3dc770
--- /dev/null
+++ b/lib/libsysdecode/mktables
@@ -0,0 +1,144 @@
+#!/bin/sh
+#
+# Copyright (c) 2006 "David Kirchner" <dpk@dpk.net>. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# $FreeBSD$
+#
+# Generates tables.h
+#
+# Originally this script was 'mksubr' for kdump which generated a complete
+# C file along with function definitions. Now this script generates tables
+# of constants and names extracted from header files.
+
+set -e
+
+LC_ALL=C; export LC_ALL
+
+if [ -z "$1" ]
+then
+ echo "usage: sh $0 include-dir"
+ exit 1
+fi
+include_dir=$1
+
+#
+# Generate a table C #definitions. The including file can define the
+# TABLE_NAME(n), TABLE_ENTRY(x), and TABLE_END macros to define what
+# the tables map to.
+#
+gen_table()
+{
+ local name grep file excl filter
+ name=$1
+ grep=$2
+ file=$3
+ excl=$4
+
+ if [ -z "$excl" ]; then
+ filter="cat"
+ else
+ filter="egrep -v"
+ fi
+ cat <<_EOF_
+TABLE_START(${name})
+_EOF_
+ egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \
+ $include_dir/$file | ${filter} ${excl} | \
+ awk '{ for (i = 1; i <= NF; i++) \
+ if ($i ~ /define/) \
+ break; \
+ ++i; \
+ printf "TABLE_ENTRY(%s)\n", $i }'
+cat <<_EOF_
+TABLE_END
+
+_EOF_
+}
+
+cat <<_EOF_
+/* This file is auto-generated. */
+
+_EOF_
+
+gen_table "accessmode" "[A-Z]_OK[[:space:]]+0?x?[0-9A-Fa-f]+" "sys/unistd.h"
+gen_table "acltype" "ACL_TYPE_[A-Z4_]+[[:space:]]+0x[0-9]+" "sys/acl.h"
+gen_table "capfcntl" "CAP_FCNTL_[A-Z]+[[:space:]]+\(1" "sys/capsicum.h"
+gen_table "extattrns" "EXTATTR_NAMESPACE_[A-Z]+[[:space:]]+0x[0-9]+" "sys/extattr.h"
+gen_table "fadvisebehav" "POSIX_FADV_[A-Z]+[[:space:]]+[0-9]+" "sys/fcntl.h"
+gen_table "openflags" "O_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/fcntl.h" "O_RDONLY|O_RDWR|O_WRONLY"
+gen_table "flockops" "LOCK_[A-Z]+[[:space:]]+0x[0-9]+" "sys/fcntl.h"
+gen_table "getfsstatflags" "MNT_[A-Z]+[[:space:]]+[1-9][0-9]*" "sys/mount.h"
+gen_table "kldsymcmd" "KLDSYM_[A-Z]+[[:space:]]+[0-9]+" "sys/linker.h"
+gen_table "kldunloadfflags" "LINKER_UNLOAD_[A-Z]+[[:space:]]+[0-9]+" "sys/linker.h"
+gen_table "lio_listiomodes" "LIO_(NO)?WAIT[[:space:]]+[0-9]+" "aio.h"
+gen_table "madvisebehav" "_?MADV_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h"
+gen_table "minheritflags" "INHERIT_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h"
+gen_table "mlockallflags" "MCL_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mman.h"
+gen_table "mmapprot" "PROT_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/mman.h"
+gen_table "ngbtsolevel" "SOL_[A-Z0-9]+[[:space:]]+0x[0-9A-Fa-f]+" "netgraph/bluetooth/include/ng_btsocket.h"
+gen_table "fileflags" "[SU]F_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/stat.h" "UF_COMPRESSED|UF_TRACKED|UF_SETTABLE|SF_SETTABLE"
+gen_table "filemode" "S_[A-Z]+[[:space:]]+[0-6]{7}" "sys/stat.h"
+gen_table "mountflags" "MNT_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mount.h"
+gen_table "msyncflags" "MS_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mman.h"
+gen_table "nfssvcflags" "NFSSVC_[A-Z0-9]+[[:space:]]+0x[0-9]+" "nfs/nfssvc.h"
+gen_table "prio" "PRIO_[A-Z]+[[:space:]]+[0-9]" "sys/resource.h"
+gen_table "procctlcmd" "PROC_[A-Z_]+[[:space:]]+[0-9]" "sys/procctl.h" "PROC_TRACE_CTL_"
+gen_table "ptraceop" "PT_[[:alnum:]_]+[[:space:]]+[0-9]+" "sys/ptrace.h"
+gen_table "quotactlcmds" "Q_[A-Z]+[[:space:]]+0x[0-9]+" "ufs/ufs/quota.h"
+gen_table "rebootopt" "RB_[A-Z]+[[:space:]]+0x[0-9]+" "sys/reboot.h"
+gen_table "rforkflags" "RF[A-Z]+[[:space:]]+\([0-9]+<<[0-9]+\)" "sys/unistd.h"
+gen_table "rlimit" "RLIMIT_[A-Z]+[[:space:]]+[0-9]+" "sys/resource.h"
+gen_table "schedpolicy" "SCHED_[A-Z]+[[:space:]]+[0-9]+" "sched.h"
+gen_table "sendfileflags" "SF_[A-Z]+[[:space:]]+[0-9]+" "sys/socket.h"
+gen_table "shmatflags" "SHM_[A-Z]+[[:space:]]+[0-9]{6}+" "sys/shm.h"
+gen_table "shutdownhow" "SHUT_[A-Z]+[[:space:]]+[0-9]+" "sys/socket.h"
+gen_table "sigbuscode" "BUS_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+gen_table "sigchldcode" "CLD_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+gen_table "sigfpecode" "FPE_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+gen_table "sigprocmaskhow" "SIG_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+gen_table "sigillcode" "ILL_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+gen_table "sigsegvcode" "SEGV_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+gen_table "sigtrapcode" "TRAP_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
+gen_table "sockdomain" "PF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
+gen_table "sockfamily" "AF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
+gen_table "sockipproto" "IPPROTO_[[:alnum:]]+[[:space:]]+" "netinet/in.h"
+gen_table "sockopt" "SO_[A-Z]+[[:space:]]+0x[0-9]+" "sys/socket.h"
+gen_table "sockoptip" "(IP_[[:alnum:]_]+|MCAST_[[:alnum:]_]+_GROUP)[[:space:]]+" "netinet/in.h" "IP_DEFAULT|IP_MIN|IP_MAX|IP_PORTRANGE"
+gen_table "sockopttcp" "TCP_[[:alnum:]_]+[[:space:]]+[0-9]+" "netinet/tcp.h" "TCP_MIN|TCP_MAX[^S]|TCP_MSS|TCP_[[:alnum:]_]+_MAX"
+gen_table "sockoptudp" "UDP_[[:alnum:]]+[[:space:]]+[0-9]+" "netinet/udp.h" "UDP_ENCAP_"
+gen_table "socktype" "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*" "sys/socket.h"
+gen_table "thrcreateflags" "THR_[A-Z]+[[:space:]]+0x[0-9]+" "sys/thr.h"
+gen_table "umtxop" "UMTX_OP_[[:alnum:]_]+[[:space:]]+[0-9]+" "sys/umtx.h"
+gen_table "vmprot" "VM_PROT_[A-Z]+[[:space:]]+\(\(vm_prot_t\)\)" "vm/vm.h"
+gen_table "vmresult" "KERN_[A-Z]+[[:space:]]+[0-9]+" "vm/vm_param.h"
+gen_table "wait6opt" "W[A-Z]+[[:space:]]+[0-9]+" "sys/wait.h"
+gen_table "seekwhence" "SEEK_[A-Z]+[[:space:]]+[0-9]+" "sys/unistd.h"
+gen_table "fcntlcmd" "F_[A-Z0-9_]+[[:space:]]+[0-9]+[[:space:]]+" "sys/fcntl.h" "F_CANCEL|F_..LCK"
+gen_table "mmapflags" "MAP_[A-Z_]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/mman.h"
+gen_table "rtpriofuncs" "RTP_[A-Z]+[[:space:]]+[0-9]+" "sys/rtprio.h"
+gen_table "msgflags" "MSG_[A-Z]+[[:space:]]+0x[0-9]+" "sys/socket.h" "MSG_SOCALLBCK"
+gen_table "sigcode" "SI_[A-Z]+[[:space:]]+0(x[0-9abcdef]+)?" "sys/signal.h"
+gen_table "umtxcvwaitflags" "CVWAIT_[A-Z_]+[[:space:]]+0x[0-9]+" "sys/umtx.h"
+gen_table "umtxrwlockflags" "URWLOCK_PREFER_READER[[:space:]]+0x[0-9]+" "sys/umtx.h"
+gen_table "caprights" "CAP_[A-Z_]+[[:space:]]+CAPRIGHT\([0-9],[[:space:]]+0x[0-9]{16}ULL\)" "sys/capsicum.h"
diff --git a/lib/libsysdecode/signal.c b/lib/libsysdecode/signal.c
new file mode 100644
index 000000000000..e764a5a35155
--- /dev/null
+++ b/lib/libsysdecode/signal.c
@@ -0,0 +1,143 @@
+/*-
+ * Copyright (c) 2016 John H. Baldwin <jhb@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <sysdecode.h>
+
+static const char *signames[] = {
+ [SIGHUP] = "SIGHUP",
+ [SIGINT] = "SIGINT",
+ [SIGQUIT] = "SIGQUIT",
+ [SIGILL] = "SIGILL",
+ [SIGTRAP] = "SIGTRAP",
+ [SIGABRT] = "SIGABRT",
+ [SIGEMT] = "SIGEMT",
+ [SIGFPE] = "SIGFPE",
+ [SIGKILL] = "SIGKILL",
+ [SIGBUS] = "SIGBUS",
+ [SIGSEGV] = "SIGSEGV",
+ [SIGSYS] = "SIGSYS",
+ [SIGPIPE] = "SIGPIPE",
+ [SIGALRM] = "SIGALRM",
+ [SIGTERM] = "SIGTERM",
+ [SIGURG] = "SIGURG",
+ [SIGSTOP] = "SIGSTOP",
+ [SIGTSTP] = "SIGTSTP",
+ [SIGCONT] = "SIGCONT",
+ [SIGCHLD] = "SIGCHLD",
+ [SIGTTIN] = "SIGTTIN",
+ [SIGTTOU] = "SIGTTOU",
+ [SIGIO] = "SIGIO",
+ [SIGXCPU] = "SIGXCPU",
+ [SIGXFSZ] = "SIGXFSZ",
+ [SIGVTALRM] = "SIGVTALRM",
+ [SIGPROF] = "SIGPROF",
+ [SIGWINCH] = "SIGWINCH",
+ [SIGINFO] = "SIGINFO",
+ [SIGUSR1] = "SIGUSR1",
+ [SIGUSR2] = "SIGUSR2",
+ [SIGTHR] = "SIGTHR",
+ [SIGLIBRT] = "SIGLIBRT",
+
+ /* XXX: Solaris uses SIGRTMIN, SIGRTMIN+<x>...SIGRTMAX-<x>, SIGRTMAX */
+ [SIGRTMIN] = "SIGRT0",
+ [SIGRTMIN + 1] = "SIGRT1",
+ [SIGRTMIN + 2] = "SIGRT2",
+ [SIGRTMIN + 3] = "SIGRT3",
+ [SIGRTMIN + 4] = "SIGRT4",
+ [SIGRTMIN + 5] = "SIGRT5",
+ [SIGRTMIN + 6] = "SIGRT6",
+ [SIGRTMIN + 7] = "SIGRT7",
+ [SIGRTMIN + 8] = "SIGRT8",
+ [SIGRTMIN + 9] = "SIGRT9",
+ [SIGRTMIN + 10] = "SIGRT10",
+ [SIGRTMIN + 11] = "SIGRT11",
+ [SIGRTMIN + 12] = "SIGRT12",
+ [SIGRTMIN + 13] = "SIGRT13",
+ [SIGRTMIN + 14] = "SIGRT14",
+ [SIGRTMIN + 15] = "SIGRT15",
+ [SIGRTMIN + 16] = "SIGRT16",
+ [SIGRTMIN + 17] = "SIGRT17",
+ [SIGRTMIN + 18] = "SIGRT18",
+ [SIGRTMIN + 19] = "SIGRT19",
+ [SIGRTMIN + 20] = "SIGRT20",
+ [SIGRTMIN + 21] = "SIGRT21",
+ [SIGRTMIN + 22] = "SIGRT22",
+ [SIGRTMIN + 23] = "SIGRT23",
+ [SIGRTMIN + 24] = "SIGRT24",
+ [SIGRTMIN + 25] = "SIGRT25",
+ [SIGRTMIN + 26] = "SIGRT26",
+ [SIGRTMIN + 27] = "SIGRT27",
+ [SIGRTMIN + 28] = "SIGRT28",
+ [SIGRTMIN + 29] = "SIGRT29",
+ [SIGRTMIN + 30] = "SIGRT30",
+ [SIGRTMIN + 31] = "SIGRT31",
+ [SIGRTMIN + 32] = "SIGRT32",
+ [SIGRTMIN + 33] = "SIGRT33",
+ [SIGRTMIN + 34] = "SIGRT34",
+ [SIGRTMIN + 35] = "SIGRT35",
+ [SIGRTMIN + 36] = "SIGRT36",
+ [SIGRTMIN + 37] = "SIGRT37",
+ [SIGRTMIN + 38] = "SIGRT38",
+ [SIGRTMIN + 39] = "SIGRT39",
+ [SIGRTMIN + 40] = "SIGRT40",
+ [SIGRTMIN + 41] = "SIGRT41",
+ [SIGRTMIN + 42] = "SIGRT42",
+ [SIGRTMIN + 43] = "SIGRT43",
+ [SIGRTMIN + 44] = "SIGRT44",
+ [SIGRTMIN + 45] = "SIGRT45",
+ [SIGRTMIN + 46] = "SIGRT46",
+ [SIGRTMIN + 47] = "SIGRT47",
+ [SIGRTMIN + 48] = "SIGRT48",
+ [SIGRTMIN + 49] = "SIGRT49",
+ [SIGRTMIN + 50] = "SIGRT50",
+ [SIGRTMIN + 51] = "SIGRT51",
+ [SIGRTMIN + 52] = "SIGRT52",
+ [SIGRTMIN + 53] = "SIGRT53",
+ [SIGRTMIN + 54] = "SIGRT54",
+ [SIGRTMIN + 55] = "SIGRT55",
+ [SIGRTMIN + 56] = "SIGRT56",
+ [SIGRTMIN + 57] = "SIGRT57",
+ [SIGRTMIN + 58] = "SIGRT58",
+ [SIGRTMIN + 59] = "SIGRT59",
+ [SIGRTMIN + 60] = "SIGRT60",
+ [SIGRTMIN + 61] = "SIGRT61",
+};
+
+const char *
+sysdecode_signal(int sig)
+{
+
+ if ((unsigned)sig < nitems(signames))
+ return (signames[sig]);
+ return (NULL);
+}
diff --git a/lib/libsysdecode/syscallnames.c b/lib/libsysdecode/syscallnames.c
index 4ec2cd76ac73..df588c257663 100644
--- a/lib/libsysdecode/syscallnames.c
+++ b/lib/libsysdecode/syscallnames.c
@@ -35,6 +35,9 @@ __FBSDID("$FreeBSD$");
*/
#include <sys/param.h>
+#include <sys/acl.h>
+#include <sys/wait.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/lib/libsysdecode/sysdecode.3 b/lib/libsysdecode/sysdecode.3
index ab7e972b2f93..b5ed3c1471a8 100644
--- a/lib/libsysdecode/sysdecode.3
+++ b/lib/libsysdecode/sysdecode.3
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 29, 2016
+.Dd October 17, 2016
.Dt SYSDECODE 3
.Os
.Sh NAME
@@ -33,6 +33,10 @@
.Nd system argument decoding library
.Sh LIBRARY
.Lb libsysdecode
+.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
.Sh DESCRIPTION
The
.Nm
@@ -65,7 +69,14 @@ A placeholder for use when the ABI is not known.
.El
.Sh SEE ALSO
.Xr sysdecode_abi_to_freebsd_errno 3 ,
+.Xr sysdecode_cap_rights 3 ,
+.Xr sysdecode_enum 3 ,
+.Xr sysdecode_fcntl_arg 3 ,
.Xr sysdecode_ioctlname 3 ,
+.Xr sysdecode_mask 3 ,
+.Xr sysdecode_quotactl_cmd 3 ,
+.Xr sysdecode_sigcode 3 ,
+.Xr sysdecode_sockopt_name 3 ,
.Xr sysdecode_syscallnames 3 ,
.Xr sysdecode_utrace 3
.Sh HISTORY
diff --git a/lib/libsysdecode/sysdecode.h b/lib/libsysdecode/sysdecode.h
index 8a30206f66fb..5bdb30a45741 100644
--- a/lib/libsysdecode/sysdecode.h
+++ b/lib/libsysdecode/sysdecode.h
@@ -39,9 +39,79 @@ enum sysdecode_abi {
};
int sysdecode_abi_to_freebsd_errno(enum sysdecode_abi _abi, int _error);
+bool sysdecode_access_mode(FILE *_fp, int _mode, int *_rem);
+const char *sysdecode_acltype(int _type);
+const char *sysdecode_atfd(int _fd);
+bool sysdecode_cap_fcntlrights(FILE *_fp, uint32_t _rights, uint32_t *_rem);
+void sysdecode_cap_rights(FILE *_fp, cap_rights_t *_rightsp);
+const char *sysdecode_extattrnamespace(int _namespace);
+const char *sysdecode_fadvice(int _advice);
+void sysdecode_fcntl_arg(FILE *_fp, int _cmd, uintptr_t _arg, int _base);
+bool sysdecode_fcntl_arg_p(int _cmd);
+const char *sysdecode_fcntl_cmd(int _cmd);
+bool sysdecode_fcntl_fileflags(FILE *_fp, int _flags, int *_rem);
+bool sysdecode_fileflags(FILE *_fp, fflags_t _flags, fflags_t *_rem);
+bool sysdecode_filemode(FILE *_fp, int _mode, int *_rem);
+bool sysdecode_flock_operation(FILE *_fp, int _operation, int *_rem);
int sysdecode_freebsd_to_abi_errno(enum sysdecode_abi _abi, int _error);
+bool sysdecode_getfsstat_flags(FILE *_fp, int _flags, int *_rem);
+const char *sysdecode_idtype(int _idtype);
const char *sysdecode_ioctlname(unsigned long _val);
+const char *sysdecode_ipproto(int _protocol);
+const char *sysdecode_kldsym_cmd(int _cmd);
+const char *sysdecode_kldunload_flags(int _flags);
+const char *sysdecode_lio_listio_mode(int _mode);
+const char *sysdecode_madvice(int _advice);
+const char *sysdecode_minherit_inherit(int _inherit);
+const char *sysdecode_msgctl_cmd(int _cmd);
+bool sysdecode_mlockall_flags(FILE *_fp, int _flags, int *_rem);
+bool sysdecode_mmap_flags(FILE *_fp, int _flags, int *_rem);
+bool sysdecode_mmap_prot(FILE *_fp, int _prot, int *_rem);
+bool sysdecode_mount_flags(FILE *_fp, int _flags, int *_rem);
+bool sysdecode_msg_flags(FILE *_fp, int _flags, int *_rem);
+bool sysdecode_msync_flags(FILE *_fp, int _flags, int *_rem);
+const char *sysdecode_nfssvc_flags(int _flags);
+bool sysdecode_open_flags(FILE *_fp, int _flags, int *_rem);
+bool sysdecode_pipe2_flags(FILE *_fp, int _flags, int *_rem);
+const char *sysdecode_prio_which(int _which);
+const char *sysdecode_procctl_cmd(int _cmd);
+const char *sysdecode_ptrace_request(int _request);
+bool sysdecode_quotactl_cmd(FILE *_fp, int _cmd);
+bool sysdecode_reboot_howto(FILE *_fp, int _howto, int *_rem);
+bool sysdecode_rfork_flags(FILE *_fp, int _flags, int *_rem);
+const char *sysdecode_rlimit(int _resource);
+const char *sysdecode_rtprio_function(int _function);
+const char *sysdecode_scheduler_policy(int _policy);
+const char *sysdecode_semctl_cmd(int _cmd);
+bool sysdecode_semget_flags(FILE *_fp, int _flag, int *_rem);
+bool sysdecode_sendfile_flags(FILE *_fp, int _flags, int *_rem);
+bool sysdecode_shmat_flags(FILE *_fp, int _flags, int *_rem);
+const char *sysdecode_shmctl_cmd(int _cmd);
+const char *sysdecode_shutdown_how(int _how);
+const char *sysdecode_sigbus_code(int _si_code);
+const char *sysdecode_sigchld_code(int _si_code);
+const char *sysdecode_sigcode(int _sig, int _si_code);
+const char *sysdecode_sigfpe_code(int _si_code);
+const char *sysdecode_sigill_code(int _si_code);
+const char *sysdecode_signal(int _sig);
+const char *sysdecode_sigprocmask_how(int _how);
+const char *sysdecode_sigsegv_code(int _si_code);
+const char *sysdecode_sigtrap_code(int _si_code);
+const char *sysdecode_sockaddr_family(int _sa_family);
+const char *sysdecode_socketdomain(int _domain);
+bool sysdecode_socket_type(FILE *_fp, int _type, int *_rem);
+const char *sysdecode_sockopt_level(int _level);
+const char *sysdecode_sockopt_name(int _level, int _optname);
const char *sysdecode_syscallname(enum sysdecode_abi _abi, unsigned int _code);
+bool sysdecode_thr_create_flags(FILE *_fp, int _flags, int *_rem);
+bool sysdecode_umtx_cvwait_flags(FILE *_fp, u_long _flags, u_long *_rem);
+const char *sysdecode_umtx_op(int _op);
+bool sysdecode_umtx_rwlock_flags(FILE *_fp, u_long _flags, u_long *_rem);
int sysdecode_utrace(FILE *_fp, void *_buf, size_t _len);
+bool sysdecode_vmprot(FILE *_fp, int _type, int *_rem);
+const char *sysdecode_vmresult(int _result);
+bool sysdecode_wait4_options(FILE *_fp, int _options, int *_rem);
+bool sysdecode_wait6_options(FILE *_fp, int _options, int *_rem);
+const char *sysdecode_whence(int _whence);
#endif /* !__SYSDECODE_H__ */
diff --git a/lib/libsysdecode/sysdecode_abi_to_freebsd_errno.3 b/lib/libsysdecode/sysdecode_abi_to_freebsd_errno.3
index fdee211d36fb..78eb858ed5c4 100644
--- a/lib/libsysdecode/sysdecode_abi_to_freebsd_errno.3
+++ b/lib/libsysdecode/sysdecode_abi_to_freebsd_errno.3
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd February 23, 2016
+.Dd October 17, 2016
.Dt sysdecode_abi_to_freebsd_errno 3
.Os
.Sh NAME
@@ -35,6 +35,9 @@
.Sh LIBRARY
.Lb libsysdecode
.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
.Ft int
.Fn sysdecode_abi_to_freebsd_errno "enum sysdecode_abi abi" "int error"
.Ft int
diff --git a/lib/libsysdecode/sysdecode_cap_rights.3 b/lib/libsysdecode/sysdecode_cap_rights.3
new file mode 100644
index 000000000000..7d916bbf2c53
--- /dev/null
+++ b/lib/libsysdecode/sysdecode_cap_rights.3
@@ -0,0 +1,50 @@
+.\"
+.\" Copyright (c) 2016 John Baldwin <jhb@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 17, 2016
+.Dt sysdecode_cap_rights 3
+.Os
+.Sh NAME
+.Nm sysdecode_cap_rights
+.Nd output list of capability rights
+.Sh LIBRARY
+.Lb libsysdecode
+.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
+.Ft void
+.Fn sysdecode_cap_rights "FILE *fp" "cap_rights_t *rightsp"
+.Sh DESCRIPTION
+The
+.Fn sysdecode_cap_rights
+function outputs a comma-separated list of capability rights at
+.Fa rightsp
+to the stream
+.Fa fp .
+.Sh SEE ALSO
+.Xr sysdecode 3
diff --git a/lib/libsysdecode/sysdecode_enum.3 b/lib/libsysdecode/sysdecode_enum.3
new file mode 100644
index 000000000000..f0fce4d04c07
--- /dev/null
+++ b/lib/libsysdecode/sysdecode_enum.3
@@ -0,0 +1,235 @@
+.\"
+.\" Copyright (c) 2016 John Baldwin <jhb@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 17, 2016
+.Dt sysdecode_enum 3
+.Os
+.Sh NAME
+.Nm sysdecode_enum ,
+.Nm sysdecode_acltype ,
+.Nm sysdecode_atfd ,
+.Nm sysdecode_extattrnamespace ,
+.Nm sysdecode_fadvice ,
+.Nm sysdecode_fcntl_cmd ,
+.Nm sysdecode_idtype ,
+.Nm sysdecode_ipproto ,
+.Nm sysdecode_kldsym_cmd ,
+.Nm sysdecode_kldunload_flags ,
+.Nm sysdecode_lio_listio_mode ,
+.Nm sysdecode_madvice ,
+.Nm sysdecode_minherit_flags ,
+.Nm sysdecode_msgctl_cmd ,
+.Nm sysdecode_nfssvc_flags ,
+.Nm sysdecode_prio_which ,
+.Nm sysdecode_procctl_cmd ,
+.Nm sysdecode_ptrace_request ,
+.Nm sysdecode_rlimit ,
+.Nm sysdecode_rtprio_function ,
+.Nm sysdecode_scheduler_policy ,
+.Nm sysdecode_semctl_cmd ,
+.Nm sysdecode_shmctl_cmd ,
+.Nm sysdecode_shutdown_how ,
+.Nm sysdecode_sigbus_code ,
+.Nm sysdecode_sigchld_code ,
+.Nm sysdecode_sigfpe_code ,
+.Nm sysdecode_sigill_code ,
+.Nm sysdecode_signal ,
+.Nm sysdecode_sigprocmask_how ,
+.Nm sysdecode_sigsegv_code ,
+.Nm sysdecode_sigtrap_code ,
+.Nm sysdecode_sockaddr_family ,
+.Nm sysdecode_socketdomain ,
+.Nm sysdecode_sockettype ,
+.Nm sysdecode_sockopt_level ,
+.Nm sysdecode_umtx_op ,
+.Nm sysdecode_vmresult ,
+.Nm sysdecode_whence
+.Nd lookup name of various enumerated values
+.Sh LIBRARY
+.Lb libsysdecode
+.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
+.Ft const char *
+.Fn sysdecode_acltype "int type"
+.Ft const char *
+.Fn sysdecode_atfd "int fd"
+.Ft const char *
+.Fn sysdecode_extattrnamespace "int namespace"
+.Ft const char *
+.Fn sysdecode_fadvice "int advice"
+.Ft const char *
+.Fn sysdecode_fcntl_cmd "int cmd"
+.Ft const char *
+.Fn sysdecode_idtype "int idtype"
+.Ft const char *
+.Fn sysdecode_ipproto "int protocol"
+.Ft const char *
+.Fn sysdecode_kldsym_cmd "int cmd"
+.Ft const char *
+.Fn sysdecode_kldunload_flags "int flags"
+.Ft const char *
+.Fn sysdecode_lio_listio_mode "int mode"
+.Ft const char *
+.Fn sysdecode_madvice "int advice"
+.Ft const char *
+.Fn sysdecode_minherit_flags "int inherit"
+.Ft const char *
+.Fn sysdecode_msgctl_cmd "int cmd"
+.Ft const char *
+.Fn sysdecode_nfssvc_flags "int flags"
+.Ft const char *
+.Fn sysdecode_prio_which "int which"
+.Ft const char *
+.Fn sysdecode_procctl_cmd "int cmd"
+.Ft const char *
+.Fn sysdecode_ptrace_request "int request"
+.Ft const char *
+.Fn sysdecode_rlimit "int resource"
+.Ft const char *
+.Fn sysdecode_rtprio_function "int function"
+.Ft const char *
+.Fn sysdecode_scheduler_policy "int policy"
+.Ft const char *
+.Fn sysdecode_semctl_cmd "int cmd"
+.Ft const char *
+.Fn sysdecode_shmctl_cmd "int cmd"
+.Ft const char *
+.Fn sysdecode_shutdown_how "int how"
+.Ft const char *
+.Fn sysdecode_sigbus_code "int si_code"
+.Ft const char *
+.Fn sysdecode_sigchld_code "int si_code"
+.Ft const char *
+.Fn sysdecode_sigfpe_code "int si_code"
+.Ft const char *
+.Fn sysdecode_sigill_code "int si_code"
+.Ft const char *
+.Fn sysdecode_signal "int sig"
+.Ft const char *
+.Fn sysdecode_sigprocmask_how "int how"
+.Ft const char *
+.Fn sysdecode_sigsegv_code "int si_code"
+.Ft const char *
+.Fn sysdecode_sigtrap_code "int si_code"
+.Ft const char *
+.Fn sysdecode_sockaddr_family "int sa_family"
+.Ft const char *
+.Fn sysdecode_socketdomain "int domain"
+.Ft const char *
+.Fn sysdecode_sockettype "int type"
+.Ft const char *
+.Fn sysdecode_sockopt_level "int level"
+.Ft const char *
+.Fn sysdecode_umtx_op "int op"
+.Ft const char *
+.Fn sysdecode_vmresult "int result"
+.Ft const char *
+.Fn sysdecode_whence "int whence"
+.Sh DESCRIPTION
+The
+.Nm
+functions return a text description of an integer value.
+The text description matches the name of a C macro with the same value as the
+sole function argument.
+.Dv NULL
+is returned if there is no matching C macro name.
+.Pp
+Most of these functions decode an argument passed to a system call:
+.Bl -column "Fn sysdecode_extattrnamespace" "Xr sched_setscheduler 2"
+.It Sy Function Ta Sy System Call Ta Sy Argument
+.It Fn sysdecode_acltype Ta Xr acl_get_file 3 Ta Fa type
+.It Fn sysdecode_atfd Ta Xr openat 2 Ta Fa fd
+.It Fn sysdecode_extattrnamespace Ta Xr extattr_get_fd 2 Ta Fa attrnamespace
+.It Fn sysdecode_fadvice Ta Xr posix_fadvise 2 Ta Fa advice
+.It Fn sysdecode_fcntl_cmd Ta Xr fcntl 2 Ta Fa cmd
+.It Fn sysdecode_idtype Ta
+.Xr procctl 2 ,
+.Xr waitid 2
+.Ta Fa idtype
+.It Fn sysdecode_kldsym_cmd Ta Xr kldsym 2 Ta Fa cmd
+.It Fn sysdecode_kldunload_flags Ta Xr kldunloadf 2 Ta Fa flags
+.It Fn sysdecode_lio_listio_mode Ta Xr lio_listio 2 Ta Fa mode
+.It Fn sysdecode_madvice Ta Xr madvise 2 Ta Fa advice
+.It Fn sysdecode_minherit_inherit Ta Xr minherit 2 Ta Fa inherit
+.It Fn sysdecode_msgctl_cmd Ta Xr msgctl 2 Ta Fa cmd
+.It Fn sysdecode_nfssvc_flags Ta Xr nfssvc 2 Ta Fa flags
+.It Fn sysdecode_prio_which Ta Xr getpriority 2 Ta Fa which
+.It Fn sysdecode_procctl_cmd Ta Xr procctl 2 Ta Fa cmd
+.It Fn sysdecode_ptrace_request Ta Xr ptrace 2 Ta Fa request
+.It Fn sysdecode_rlimit Ta Xr getrlimit 2 Ta Fa resource
+.It Fn sysdecode_rtprio_function Ta Xr rtprio 2 Ta Fa function
+.It Fn sysdecode_scheduler_policy Ta Xr sched_setscheduler 2 Ta Fa policy
+.It Fn sysdecode_semctl_cmd Ta Xr semctl 2 Ta Fa cmd
+.It Fn sysdecode_shmctl_cmd Ta Xr shmctl 2 Ta Fa cmd
+.It Fn sysdecode_shutdown_how Ta Xr shutdown 2 Ta Fa how
+.It Fn sysdecode_sigprocmask_how Ta Xr sigprocmask 2 Ta Fa how
+.It Fn sysdecode_sockopt_level Ta Xr getsockopt 2 Ta Fa level
+.It Fn sysdecode_umtx_op Ta Xr _umtx_op 2 Ta Fa op
+.It Fn sysdecode_whence Ta Xr lseek 2 Ta Fa whence
+.El
+.Pp
+These functions decode signal-specific signal codes stored in the
+.Fa si_code
+field of the
+.Vt siginfo_t
+object associated with an instance of signal:
+.Bl -column "Fn sysdecode_sigchld_code"
+.It Sy Function Ta Sy Signal
+.It Fn sysdecode_sigbus_code Ta Dv SIGBUS
+.It Fn sysdecode_sigchld_code Ta Dv SIGCHLD
+.It Fn sysdecode_sigfpe_code Ta Dv SIGFPE
+.It Fn sysdecode_sigill_code Ta Dv SIGILL
+.It Fn sysdecode_sigsegv_code Ta Dv SIGSEGV
+.It Fn sysdecode_sigtrap_code Ta Dv SIGBTRAP
+.El
+.Pp
+Other functions decode the values described below:
+.Bl -tag -width "Fn sysdecode_sockaddr_family"
+.It Fn sysdecode_ipproto
+An IP protocol.
+.It Fn sysdecode_signal
+A process signal.
+.It Fn sysdecode_sockaddr_family
+A socket address family.
+.It Fn sysdecode_socketdomain
+A socket domain.
+.It Fn sysdecode_vmresult
+The return value of a function in the virtual memory subsystem of the kernel
+indicating the status of the associated request.
+.El
+.Sh RETURN VALUES
+The
+.Nm
+functions return the name of a matching C macro or
+.Dv NULL
+if no matching C macro was found.
+.Sh SEE ALSO
+.Xr sysdecode 3 ,
+.Xr sysdecode_mask 3 ,
+.Xr sysdecode_sigcode 3
diff --git a/lib/libsysdecode/sysdecode_fcntl_arg.3 b/lib/libsysdecode/sysdecode_fcntl_arg.3
new file mode 100644
index 000000000000..2dacb01ceb8f
--- /dev/null
+++ b/lib/libsysdecode/sysdecode_fcntl_arg.3
@@ -0,0 +1,121 @@
+.\"
+.\" Copyright (c) 2016 John Baldwin <jhb@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 17, 2016
+.Dt sysdecode_fcntl_arg 3
+.Os
+.Sh NAME
+.Nm sysdecode_fcntl_arg ,
+.Nm sysdecode_fcntl_arg_p
+.Nd output description of fcntl argument
+.Sh LIBRARY
+.Lb libsysdecode
+.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
+.Ft void
+.Fn sysdecode_fcntl_arg "FILE *fp" "int cmd" "uintptr_t arg" "int base"
+.Ft bool
+.Fn sysdecode_fcntl_arg_p "int cmd"
+.Sh DESCRIPTION
+The
+.Fn sysdecode_fcntl_arg
+function outputs a text description of the optional
+.Fa arg
+argument to
+.Xr fcntl 2
+to the stream
+.Fa fp .
+The type and format of
+.Fa arg
+are determined by
+.Fa cmd :
+.Bl -column ".Dv F_SETLKW" "Vt struct flock *"
+.It Sy Command Ta Fa arg Sy Type Ta Sy Output Format
+.It
+.It Dv F_SETFD Ta Vt int Ta
+.Dq FD_CLOEXEC
+or the value of
+.Fa arg
+in the indicated
+.Fa base
+.Pq one of 8, 10, or 16 .
+.It
+.It Dv F_SETFL Ta Vt int Ta
+File flags as output by
+.Xr sysdecode_fcntl_fileflags 3
+with any unknown or remaining bits output in hexadecimal.
+.It
+.It Dv F_GETLK Ta Vt struct flock * Ta
+.It Dv F_SETLK Ta Vt struct flock * Ta
+.It Dv F_SETLKW Ta Vt struct flock * Ta
+The value of
+.Fa arg
+using the
+.Dq %p
+conversion specification.
+.It
+.It Others Ta Vt int Ta
+The value of
+.Fa arg
+in the indicated
+.Fa base
+.Pq one of 8, 10, or 16 .
+.El
+.Pp
+The
+.Fn sysdecode_fcntl_arg_p
+function can be used to determine if a
+.Xr fcntl 2
+command uses the optional third argument to
+.Xr fcntl 2 .
+The function returns
+.Dv true
+if
+.Fa cmd
+accepts a third argument to
+.Xr fcntl 2
+and
+.Dv false
+if it does not.
+.Sh RETURN VALUES
+The
+.Nm sysdecode_fcntl_arg_p
+function returns
+.Dv true
+if
+.Fa cmd
+accepts a third argument to
+.Xr fcntl 2
+and
+.Dv false
+if it does not.
+.Sh SEE ALSO
+.Xr sysdecode 3 ,
+.Xr sysdecode_fcntl_cmd 3 ,
+.Xr sysdecode_fcntl_fileflags 3
diff --git a/lib/libsysdecode/sysdecode_ioctlname.3 b/lib/libsysdecode/sysdecode_ioctlname.3
index 6479f03befd8..0baf1152c4b4 100644
--- a/lib/libsysdecode/sysdecode_ioctlname.3
+++ b/lib/libsysdecode/sysdecode_ioctlname.3
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 12, 2015
+.Dd October 17, 2016
.Dt sysdecode_ioctlname 3
.Os
.Sh NAME
@@ -34,6 +34,9 @@
.Sh LIBRARY
.Lb libsysdecode
.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
.Ft conts char *
.Fn sysdecode_ioctlname "unsigned long request"
.Sh DESCRIPTION
diff --git a/lib/libsysdecode/sysdecode_mask.3 b/lib/libsysdecode/sysdecode_mask.3
new file mode 100644
index 000000000000..5810fc8d3597
--- /dev/null
+++ b/lib/libsysdecode/sysdecode_mask.3
@@ -0,0 +1,216 @@
+.\"
+.\" Copyright (c) 2016 John Baldwin <jhb@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 17, 2016
+.Dt sysdecode_mask 3
+.Os
+.Sh NAME
+.Nm sysdecode_mask ,
+.Nm sysdecode_accessmode ,
+.Nm sysdecode_capfcntlrights ,
+.Nm sysdecode_fcntl_fileflags ,
+.Nm sysdecode_fileflags ,
+.Nm sysdecode_filemode ,
+.Nm sysdecode_flock_operation ,
+.Nm sysdecode_getfsstat_flags ,
+.Nm sysdecode_mlockall_flags ,
+.Nm sysdecode_mmap_flags ,
+.Nm sysdecode_mmap_prot ,
+.Nm sysdecode_mount_flags ,
+.Nm sysdecode_msg_flags ,
+.Nm sysdecode_msync_flags ,
+.Nm sysdecode_open_flags ,
+.Nm sysdecode_pipe2_flags ,
+.Nm sysdecode_reboot_howto ,
+.Nm sysdecode_rfork_flags ,
+.Nm sysdecode_semget_flags ,
+.Nm sysdecode_sendfile_flags ,
+.Nm sysdecode_shmat_flags ,
+.Nm sysdecode_socket_type ,
+.Nm sysdecode_thr_create_flags ,
+.Nm sysdecode_umtx_cvwait_flags ,
+.Nm sysdecode_umtx_rwlock_flags ,
+.Nm sysdecode_vmprot ,
+.Nm sysdecode_wait4_options ,
+.Nm sysdecode_wait6_options
+.Nd print name of various bitmask values
+.Sh LIBRARY
+.Lb libsysdecode
+.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
+.Ft bool
+.Fn sysdecode_access_mode "FILE *fp" "int mode" "int *rem"
+.Ft bool
+.Fn sysdecode_cap_fcntlrights "FILE *fp" "uint32_t rights" "uint32_t *rem"
+.Ft bool
+.Fn sysdecode_fcntl_fileflags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_fileflags "FILE *fp" "fflags_t flags" "fflags_t *rem"
+.Ft bool
+.Fn sysdecode_filemode "FILE *fp" "int mode" "int *rem"
+.Ft bool
+.Fn sysdecode_flock_operation "FILE *fp" "int operation" "int *rem"
+.Ft bool
+.Fn sysdecode_mlockall_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_mmap_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_mmap_prot "FILE *fp" "int prot" "int *rem"
+.Ft bool
+.Fn sysdecode_mount_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_msg_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_msync_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_open_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_pipe2_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_reboot_howto "FILE *fp" "int howto" "int *rem"
+.Ft bool
+.Fn sysdecode_rfork_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_semget_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_sendfile_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_shmat_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_socket_type "FILE *fp" "int type" "int *rem"
+.Ft bool
+.Fn sysdecode_thr_create_flags "FILE *fp" "int flags" "int *rem"
+.Ft bool
+.Fn sysdecode_umtx_cvwait_flags "FILE *fp" "u_long flags" "u_long *rem"
+.Ft bool
+.Fn sysdecode_umtx_rwlock_flags "FILE *fp" "u_long flags" "u_long *rem"
+.Ft bool
+.Fn sysdecode_vmprot "FILE *fp" "int type" "int *rem"
+.Ft bool
+.Fn sysdecode_wait4_options "FILE *fp" "int options" "int *rem"
+.Ft bool
+.Fn sysdecode_wait6_options "FILE *fp" "int options" "int *rem"
+.Sh DESCRIPTION
+The
+.Nm
+functions are used to generate a text description of an integer value
+built from a mask of bitfields.
+The text description lists the C macros for field values joined by pipe
+.Sq |
+characters matching the format used in C source code.
+Most of the values decoded by these functions are passed as arguments to
+system calls,
+though some of these values are used internally in the kernel.
+.Pp
+Each function writes the text description to
+.Fa fp .
+The second argument should contain the integer value to be decoded.
+The
+.Fa rem
+argument is set to the value of any bits that were not decoded
+.Pq bit fields that do not have a corresponding C macro .
+.Fa rem
+may be set to
+.Dv NULL
+if the caller does not need this value.
+Each function returns
+.Dv true
+if any bit fields in the value were decoded and
+.Dv false
+if no bit fields were decoded.
+.Pp
+Most of these functions decode an argument passed to a system call:
+.Bl -column "Fn sysdecode_flock_operation" "Xr cap_fcntls_limit 2"
+.It Sy Function Ta Sy System Call Ta Sy Argument
+.It Fn sysdecode_access_mode Ta Xr access 2 Ta Fa mode
+.It Fn sysdecode_cap_fcntlrights Ta Xr cap_fcntls_limit 2 Ta Fa fcntlrights
+.It Fn sysdecode_fileflags Ta Xr chflags 2 Ta Fa flags
+.It Fn sysdecode_filemode Ta Xr chmod 2 , Xr open 2 Ta mode
+.It Fn sysdecode_flock_operation Ta Xr flock 2 Ta Fa operation
+.It Fn sysdecode_getfsstat_flags Ta Xr getfsstatflags 2 Ta Fa flags
+.It Fn sysdecode_mlockall_flags Ta Xr mlockall 2 Ta Fa flags
+.It Fn sysdecode_mmap_flags Ta Xr mmap 2 Ta Fa flags
+.It Fn sysdecode_mmap_prot Ta Xr mmap 2 Ta Fa prot
+.It Fn sysdecode_mount_flags Ta Xr mount 2 Ta Fa flags
+.It Fn sysdecode_msg_flags Ta Xr recv 2 , Xr send 2 Ta Fa flags
+.It Fn sysdecode_msync_flags Ta Xr msync 2 Ta Fa flags
+.It Fn sysdecode_open_flags Ta Xr open 2 Ta Fa flags
+.It Fn sysdecode_pipe2_flags Ta Xr pipe2 Ta Fa flags
+.It Fn sysdecode_reboot_howto Ta Xr reboot 2 Ta Fa howto
+.It Fn sysdecode_rfork_flags Ta Xr rfork 2 Ta Fa flags
+.It Fn sysdecode_semget_flags Ta Xr semget 2 Ta Fa flags
+.It Fn sysdecode_sendfile_flags Ta Xr sendfile 2 Ta Fa flags
+.It Fn sysdecode_shmat_flags Ta Xr shmat 2 Ta Fa flags
+.It Fn sysdecode_socket_type Ta Xr socket 2 Ta Fa type
+.It Fn sysdecode_thr_create_flags Ta Xr thr_create 2 Ta Fa flags
+.It Fn sysdecode_wait4_options Ta Xr wait4 2 Ta Fa options
+.It Fn sysdecode_wait6_options Ta Xr wait6 2 Ta Fa options
+.El
+.Pp
+Other functions decode the values described below:
+.Bl -tag -width ".Fn sysdecode_umtx_cvwait_flags"
+.It Fn sysdecode_fcntl_fileflags
+The file flags used with the
+.Dv F_GETFL
+and
+.Dv F_SETFL
+.Xr fcntl 2
+commands.
+.It Fn sysdecode_umtx_cvwait_flags
+The
+.Fa val
+argument to
+.Xr _umtx_op 2
+for
+.Dv UMTX_OP_CV_WAIT
+operations.
+.It Fn sysdecode_umtx_rwlock_flags
+The
+.Fa val
+argument to
+.Xr _umtx_op 2
+for
+.Dv UMTX_OP_RW_RDLOCK
+operations.
+.It Fn sysdecode_vmprot
+The memory protection flags stored in
+.Vt vm_prot_t
+variables.
+.El
+.Sh RETURN VALUES
+The
+.Nm
+functions return
+.Dv true
+if any bit fields in the value were decoded and
+.Dv false
+if no bit fields were decoded.
+.Sh SEE ALSO
+.Xr sysdecode 3 ,
+.Xr sysdecode_enum 3
diff --git a/lib/libsysdecode/sysdecode_quotactl_cmd.3 b/lib/libsysdecode/sysdecode_quotactl_cmd.3
new file mode 100644
index 000000000000..362da170b704
--- /dev/null
+++ b/lib/libsysdecode/sysdecode_quotactl_cmd.3
@@ -0,0 +1,93 @@
+.\"
+.\" Copyright (c) 2016 John Baldwin <jhb@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 17, 2016
+.Dt sysdecode_quotactl_cmd 3
+.Os
+.Sh NAME
+.Nm sysdecode_quotactl_cmd
+.Nd output name of quotactl command
+.Sh LIBRARY
+.Lb libsysdecode
+.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
+.Ft bool
+.Fn sysdecode_quotactl_cmd "FILE *fp" "int cmd"
+.Sh DESCRIPTION
+The
+.Fn sysdecode_quotactl_cmd
+function outputs a text description of the
+.Fa cmd
+argument to
+.Xr quotactl 2
+to the stream
+.Fa fp .
+The description is formatted as an invocation of the
+.Dv QCMD
+macro defined in the
+.In ufs/ufs/quota.h
+header.
+.Pp
+The function first computes the primary and secondary values used by
+.Dv QCMD
+to construct
+.Fa cmd .
+If the primary command value does not represent a known constant,
+.Fn sysdecode_quotactl_cmd
+does not generate any output and returns
+.Dv false .
+Otherwise,
+.Fn sysdecode_quotactl_cmd
+outputs text depicting an invocation of
+.Dv QCMD
+with the associated constants for the primary and secondary command values
+and returns
+.Dv true .
+If the secondary command values does not represent a known constant,
+its value is output as a hexadecimal integer.
+.Sh RETURN VALUES
+The
+.Nm sysdecode_quotactl_cmd
+function returns
+.Dv true
+if it outputs a description of
+.Fa cmd
+and
+.Dv false
+if it does not.
+.Sh EXAMPLES
+The statement
+.Pp
+.Dl sysdecode_quotatcl_cmd(stdout, QCMD(Q_GETQUOTA, USRQUOTA);
+.Pp
+outputs the text
+.Dq QCMD(Q_GETQUOTA, USRQUOTA)
+to standard output.
+.Sh SEE ALSO
+.Xr sysdecode 3
diff --git a/lib/libsysdecode/sysdecode_sigcode.3 b/lib/libsysdecode/sysdecode_sigcode.3
new file mode 100644
index 000000000000..5675662956af
--- /dev/null
+++ b/lib/libsysdecode/sysdecode_sigcode.3
@@ -0,0 +1,83 @@
+.\"
+.\" Copyright (c) 2016 John Baldwin <jhb@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 17, 2016
+.Dt sysdecode_sigcode 3
+.Os
+.Sh NAME
+.Nm sysdecode_sigcode
+.Nd lookup name of signal code
+.Sh LIBRARY
+.Lb libsysdecode
+.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
+.Ft const char *
+.Fn sysdecode_sigcode "int signal" "int si_code"
+.Sh DESCRIPTION
+The
+.Fn sysdecode_sigcode
+function returns a text description of the
+.Fa si_code
+field of the
+.Vt siginfo_t
+object associated with an instance of signal
+.Fa sig .
+The text description contains the name of the C macro whose value matches
+.Fa si_code .
+General purpose signal codes such as
+.Dv SI_USER
+are handled as well as signal-specific codes for
+.Dv SIGBUS ,
+.Dv SIGCHLD ,
+.Dv SIGFPE ,
+.Dv SIGILL ,
+.Dv SIGSEGV
+and
+.Dv SIGTRAP .
+If
+.Fa si_code
+does not represent a known signal code,
+.Fn sysdecode_sigcode
+returns
+.Dv NULL .
+.Sh RETURN VALUES
+The
+.Fn sysdecode_sigcode
+function returns a pointer to a signal code description or
+.Dv NULL
+if
+.Fa si_code
+is not a known signal code.
+.Sh SEE ALSO
+.Xr sysdecode_sigbus_code 3 ,
+.Xr sysdecode_sigchld_code 3 ,
+.Xr sysdecode_sigfpe_code 3 ,
+.Xr sysdecode_sigill_code 3 ,
+.Xr sysdecode_sigsegv_code 3 ,
+.Xr sysdecode_sigtrap_code 3
diff --git a/lib/libsysdecode/sysdecode_sockopt_name.3 b/lib/libsysdecode/sysdecode_sockopt_name.3
new file mode 100644
index 000000000000..3db6e0ef9545
--- /dev/null
+++ b/lib/libsysdecode/sysdecode_sockopt_name.3
@@ -0,0 +1,61 @@
+.\"
+.\" Copyright (c) 2016 John Baldwin <jhb@FreeBSD.org>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 17, 2016
+.Dt sysdecode_sockopt_name 3
+.Os
+.Sh NAME
+.Nm sysdecode_sockopt_name
+.Nd lookup name of socket option
+.Sh LIBRARY
+.Lb libsysdecode
+.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
+.Ft const char *
+.Fn sysdecode_sockopt_name "int level" "int optname"
+.Sh DESCRIPTION
+The
+.Fn sysdecode_sockopt_name
+function returns a text description of the socket option name passed in the
+.Fa optname
+argument to
+.Xr getsockopt 2 .
+.Fn sysdecode_sockopt_name
+takes the socket option
+.Fa level
+as well as the option name to uniquely identify the option.
+.Sh SEE ALSO
+.Xr sysdecode_sockopt_level 3
+.Sh BUGS
+Socket option levels and names are protocol-specific.
+Both
+.Fn sysdecode_sockopt_level
+and
+.Fn sysdecode_sockopt_name
+should possibly accept the protocol family as an additional argument.
diff --git a/lib/libsysdecode/sysdecode_syscallnames.3 b/lib/libsysdecode/sysdecode_syscallnames.3
index e920edb29c55..9a571648247d 100644
--- a/lib/libsysdecode/sysdecode_syscallnames.3
+++ b/lib/libsysdecode/sysdecode_syscallnames.3
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 30, 2016
+.Dd October 17, 2016
.Dt sysdecode_syscallnames 3
.Os
.Sh NAME
@@ -34,6 +34,9 @@
.Sh LIBRARY
.Lb libsysdecode
.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
.Ft const char *
.Fn sysdecode_syscallnames "enum sysdecode_abi abi" "unsigned int code"
.Sh DESCRIPTION
diff --git a/lib/libsysdecode/sysdecode_utrace.3 b/lib/libsysdecode/sysdecode_utrace.3
index 8bf2e8595677..bf3f5e427bbf 100644
--- a/lib/libsysdecode/sysdecode_utrace.3
+++ b/lib/libsysdecode/sysdecode_utrace.3
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 11, 2015
+.Dd October 17, 2016
.Dt sysdecode_utrace 3
.Os
.Sh NAME
@@ -34,6 +34,9 @@
.Sh LIBRARY
.Lb libsysdecode
.Sh SYNOPSIS
+.In sys/types.h
+.In stdbool.h
+.In sysdecode.h
.Ft int
.Fn sysdecode_utrace "FILE *fp" "void *buf" "size_t len" "int decimal"
.Sh DESCRIPTION
diff --git a/lib/libsysdecode/utrace.c b/lib/libsysdecode/utrace.c
index dfd0e70380b0..87458190b4ea 100644
--- a/lib/libsysdecode/utrace.c
+++ b/lib/libsysdecode/utrace.c
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <dlfcn.h>
+#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <sysdecode.h>