kernel: Add further support for fixed-width integer type sysctls.
authorSascha Wildner <saw@online.de>
Sat, 6 Oct 2018 07:29:28 +0000 (09:29 +0200)
committerSascha Wildner <saw@online.de>
Sat, 6 Oct 2018 07:29:28 +0000 (09:29 +0200)
U32 support was added in c48b2bac286ed1aaa6b974adfbc844e82bc65f38.

QUAD and UQUAD are now aliases of S64 and U64.

Taken-from: FreeBSD

sbin/sysctl/sysctl.c
share/man/man9/Makefile
share/man/man9/sysctl.9
share/man/man9/sysctl_add_oid.9
sys/kern/kern_sysctl.c
sys/sys/sysctl.h

index 0bb9e17..567b293 100644 (file)
@@ -48,6 +48,7 @@
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
+#include <inttypes.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -157,14 +158,19 @@ parse(const char *string)
        size_t len;
        int i, j;
        void *newval = NULL;
+       int8_t i8val;
+       uint8_t u8val;
+       int16_t i16val;
+       uint16_t u16val;
+       int32_t i32val;
        uint32_t u32val;
+       int64_t i64val;
+       uint64_t u64val;
        int intval;
        unsigned int uintval;
        long longval;
        unsigned long ulongval;
        size_t newsize = 0;
-       quad_t quadval;
-       u_quad_t uquadval;
        int mib[CTL_MAXNAME];
        char *cp, fmt[BUFSIZ];
        const char *name;
@@ -249,21 +255,46 @@ parse(const char *string)
                                break;
                        case CTLTYPE_STRING:
                                break;
-                       case CTLTYPE_QUAD:
-                               quadval = strtoq(newval, NULL, 0);
-                               newval = &quadval;
-                               newsize = sizeof(quadval);
+                       case CTLTYPE_S8:
+                               i8val = (int8_t)strtol(newval, NULL, 0);
+                               newval = &i8val;
+                               newsize = sizeof(i8val);
                                break;
-                       case CTLTYPE_UQUAD:
-                               uquadval = strtouq(newval, NULL, 0);
-                               newval = &uquadval;
-                               newsize = sizeof(uquadval);
+                       case CTLTYPE_S16:
+                               i16val = (int16_t)strtol(newval, NULL, 0);
+                               newval = &i16val;
+                               newsize = sizeof(i16val);
+                               break;
+                       case CTLTYPE_S32:
+                               i32val = (int32_t)strtol(newval, NULL, 0);
+                               newval = &i32val;
+                               newsize = sizeof(i32val);
+                               break;
+                       case CTLTYPE_S64:
+                               i64val = strtoimax(newval, NULL, 0);
+                               newval = &i64val;
+                               newsize = sizeof(i64val);
+                               break;
+                       case CTLTYPE_U8:
+                               u8val = (uint8_t)strtoul(newval, NULL, 0);
+                               newval = &u8val;
+                               newsize = sizeof(u8val);
+                               break;
+                       case CTLTYPE_U16:
+                               u16val = (uint16_t)strtoul(newval, NULL, 0);
+                               newval = &u16val;
+                               newsize = sizeof(u16val);
                                break;
                        case CTLTYPE_U32:
                                u32val = (uint32_t)strtoul(newval, NULL, 0);
                                newval = &u32val;
                                newsize = sizeof(u32val);
                                break;
+                       case CTLTYPE_U64:
+                               u64val = strtoumax(newval, NULL, 0);
+                               newval = &u64val;
+                               newsize = sizeof(u64val);
+                               break;
                        case CTLTYPE_OPAQUE:
                                if (strcmp(fmt, "T,dev_t") == 0 ||
                                    strcmp(fmt, "T,udev_t") == 0
index 0514cf4..63a410a 100644 (file)
@@ -914,9 +914,16 @@ MLINKS+=sysctl.9 SYSCTL_DECL.9 \
        sysctl.9 SYSCTL_OPAQUE.9 \
        sysctl.9 SYSCTL_PROC.9 \
        sysctl.9 SYSCTL_QUAD.9 \
+       sysctl.9 SYSCTL_S8.9 \
+       sysctl.9 SYSCTL_S16.9 \
+       sysctl.9 SYSCTL_S32.9 \
+       sysctl.9 SYSCTL_S64.9 \
        sysctl.9 SYSCTL_STRING.9 \
        sysctl.9 SYSCTL_STRUCT.9 \
+       sysctl.9 SYSCTL_U8.9 \
+       sysctl.9 SYSCTL_U16.9 \
        sysctl.9 SYSCTL_U32.9 \
+       sysctl.9 SYSCTL_U64.9 \
        sysctl.9 SYSCTL_UINT.9 \
        sysctl.9 SYSCTL_ULONG.9 \
        sysctl.9 SYSCTL_UQUAD.9
@@ -927,9 +934,16 @@ MLINKS+=sysctl_add_oid.9 SYSCTL_ADD_INT.9 \
        sysctl_add_oid.9 SYSCTL_ADD_OPAQUE.9 \
        sysctl_add_oid.9 SYSCTL_ADD_PROC.9 \
        sysctl_add_oid.9 SYSCTL_ADD_QUAD.9 \
+       sysctl_add_oid.9 SYSCTL_ADD_S8.9 \
+       sysctl_add_oid.9 SYSCTL_ADD_S16.9 \
+       sysctl_add_oid.9 SYSCTL_ADD_S32.9 \
+       sysctl_add_oid.9 SYSCTL_ADD_S64.9 \
        sysctl_add_oid.9 SYSCTL_ADD_STRING.9 \
        sysctl_add_oid.9 SYSCTL_ADD_STRUCT.9 \
+       sysctl_add_oid.9 SYSCTL_ADD_U8.9 \
+       sysctl_add_oid.9 SYSCTL_ADD_U16.9 \
        sysctl_add_oid.9 SYSCTL_ADD_U32.9 \
+       sysctl_add_oid.9 SYSCTL_ADD_U64.9 \
        sysctl_add_oid.9 SYSCTL_ADD_UINT.9 \
        sysctl_add_oid.9 SYSCTL_ADD_ULONG.9 \
        sysctl_add_oid.9 SYSCTL_ADD_UQUAD.9 \
index 6916f01..1157d40 100644 (file)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD: src/share/man/man9/sysctl.9,v 1.3 2006/04/28 23:21:36 keramida Exp $
 .\"
-.Dd July 20, 2018
+.Dd October 6, 2018
 .Dt SYSCTL 9
 .Os
 .Sh NAME
 .Nm SYSCTL_NODE ,
 .Nm SYSCTL_OPAQUE ,
 .Nm SYSCTL_PROC ,
+.Nm SYSCTL_S8 ,
+.Nm SYSCTL_S16 ,
+.Nm SYSCTL_S32 ,
+.Nm SYSCTL_S64 ,
 .Nm SYSCTL_STRING ,
 .Nm SYSCTL_STRUCT ,
+.Nm SYSCTL_U8 ,
+.Nm SYSCTL_U16 ,
 .Nm SYSCTL_U32 ,
+.Nm SYSCTL_U64 ,
 .Nm SYSCTL_UINT ,
 .Nm SYSCTL_ULONG ,
 .Nm SYSCTL_UQUAD
 .Fa "val"
 .Fa "descr"
 .Fc
-.Fo SYSCTL_QUAD
-.Fa "parent"
-.Fa "nbr"
-.Fa "name"
-.Fa "access"
-.Fa "ptr"
-.Fa "val"
-.Fa "descr"
-.Fc
 .Fo SYSCTL_NODE
 .Fa "parent"
 .Fa "nbr"
 .Fa "fmt"
 .Fa "descr"
 .Fc
+.Fo SYSCTL_QUAD
+.Fa "parent"
+.Fa "nbr"
+.Fa "name"
+.Fa "access"
+.Fa "ptr"
+.Fa "val"
+.Fa "descr"
+.Fc
+.Fo SYSCTL_S8
+.Fa "parent"
+.Fa "number"
+.Fa "name"
+.Fa "access"
+.Fa "ptr"
+.Fa "val"
+.Fa "descr"
+.Fc
+.Fo SYSCTL_S16
+.Fa "parent"
+.Fa "number"
+.Fa "name"
+.Fa "access"
+.Fa "ptr"
+.Fa "val"
+.Fa "descr"
+.Fc
+.Fo SYSCTL_S32
+.Fa "parent"
+.Fa "number"
+.Fa "name"
+.Fa "access"
+.Fa "ptr"
+.Fa "val"
+.Fa "descr"
+.Fc
+.Fo SYSCTL_S64
+.Fa "parent"
+.Fa "number"
+.Fa "name"
+.Fa "access"
+.Fa "ptr"
+.Fa "val"
+.Fa "descr"
+.Fc
 .Fo SYSCTL_STRING
 .Fa "parent"
 .Fa "nbr"
 .Fa "type"
 .Fa "descr"
 .Fc
+.Fo SYSCTL_U8
+.Fa "parent"
+.Fa "number"
+.Fa "name"
+.Fa "access"
+.Fa "ptr"
+.Fa "val"
+.Fa "descr"
+.Fc
+.Fo SYSCTL_U16
+.Fa "parent"
+.Fa "number"
+.Fa "name"
+.Fa "access"
+.Fa "ptr"
+.Fa "val"
+.Fa "descr"
+.Fc
 .Fo SYSCTL_U32
 .Fa "parent"
 .Fa "number"
 .Fa "val"
 .Fa "descr"
 .Fc
+.Fo SYSCTL_U64
+.Fa "parent"
+.Fa "number"
+.Fa "name"
+.Fa "access"
+.Fa "ptr"
+.Fa "val"
+.Fa "descr"
+.Fc
 .Fo SYSCTL_UINT
 .Fa "parent"
 .Fa "nbr"
@@ -181,9 +251,16 @@ New nodes are declared using one of
 .Nm SYSCTL_NODE ,
 .Nm SYSCTL_OPAQUE ,
 .Nm SYSCTL_PROC ,
+.Nm SYSCTL_S8 ,
+.Nm SYSCTL_S16 ,
+.Nm SYSCTL_S32 ,
+.Nm SYSCTL_S64 ,
 .Nm SYSCTL_STRING ,
 .Nm SYSCTL_STRUCT ,
+.Nm SYSCTL_U8 ,
+.Nm SYSCTL_U16 ,
 .Nm SYSCTL_U32 ,
+.Nm SYSCTL_U64 ,
 .Nm SYSCTL_UINT ,
 .Nm SYSCTL_ULONG ,
 and
@@ -205,6 +282,14 @@ including a type in the access mask is required:
 This is a node intended to be a parent for other nodes.
 .It Dv CTLTYPE_INT
 This is a signed integer.
+.It Dv CTLTYPE_S8
+This is an 8-bit signed integer.
+.It Dv CTLTYPE_S16
+This is a 16-bit signed integer.
+.It Dv CTLTYPE_S32
+This is a 32-bit signed integer.
+.It Dv CTLTYPE_S64
+This is a 64-bit signed integer.
 .It Dv CTLTYPE_STRING
 This is a nul-terminated string stored in a character array.
 .It Dv CTLTYPE_QUAD
@@ -214,8 +299,14 @@ This is an opaque data structure.
 .It Dv CTLTYPE_STRUCT
 Alias for
 .Dv CTLTYPE_OPAQUE .
+.It Dv CTLTYPE_U8
+This is an 8-bit unsigned integer.
+.It Dv CTLTYPE_U16
+This is a 16-bit unsigned integer.
 .It Dv CTLTYPE_U32
 This is a 32-bit unsigned integer.
+.It Dv CTLTYPE_U64
+This is a 64-bit unsigned integer.
 .It Dv CTLTYPE_UINT
 This is an unsigned integer.
 .It Dv CTLTYPE_LONG
index 2b85a4d..46ca8f3 100644 (file)
@@ -27,7 +27,7 @@
 .\"
 .\" $FreeBSD: src/share/man/man9/sysctl_add_oid.9,v 1.21 2006/04/28 10:45:27 rwatson Exp $
 .\"
-.Dd July 21, 2018
+.Dd October 6, 2018
 .Dt SYSCTL_ADD_OID 9
 .Os
 .Sh NAME
 .Fa "const char *descr"
 .Fc
 .Ft struct sysctl_oid *
+.Fo SYSCTL_ADD_S8
+.Fa "struct sysctl_ctx_list *ctx"
+.Fa "struct sysctl_oid_list *parent"
+.Fa "int number"
+.Fa "const char *name"
+.Fa "int access"
+.Fa "int8_t *arg"
+.Fa "int len"
+.Fa "const char *descr"
+.Fc
+.Ft struct sysctl_oid *
+.Fo SYSCTL_ADD_S16
+.Fa "struct sysctl_ctx_list *ctx"
+.Fa "struct sysctl_oid_list *parent"
+.Fa "int number"
+.Fa "const char *name"
+.Fa "int access"
+.Fa "int16_t *arg"
+.Fa "int len"
+.Fa "const char *descr"
+.Fc
+.Ft struct sysctl_oid *
+.Fo SYSCTL_ADD_S32
+.Fa "struct sysctl_ctx_list *ctx"
+.Fa "struct sysctl_oid_list *parent"
+.Fa "int number"
+.Fa "const char *name"
+.Fa "int access"
+.Fa "int32_t *arg"
+.Fa "int len"
+.Fa "const char *descr"
+.Fc
+.Ft struct sysctl_oid *
+.Fo SYSCTL_ADD_S64
+.Fa "struct sysctl_ctx_list *ctx"
+.Fa "struct sysctl_oid_list *parent"
+.Fa "int number"
+.Fa "const char *name"
+.Fa "int access"
+.Fa "int64_t *arg"
+.Fa "int len"
+.Fa "const char *descr"
+.Fc
+.Ft struct sysctl_oid *
 .Fo SYSCTL_ADD_STRING
 .Fa "struct sysctl_ctx_list *ctx"
 .Fa "struct sysctl_oid_list *parent"
 .Fa "const char *descr"
 .Fc
 .Ft struct sysctl_oid *
+.Fo SYSCTL_ADD_U8
+.Fa "struct sysctl_ctx_list *ctx"
+.Fa "struct sysctl_oid_list *parent"
+.Fa "int number"
+.Fa "const char *name"
+.Fa "int access"
+.Fa "uint8_t *arg"
+.Fa "int len"
+.Fa "const char *descr"
+.Fc
+.Ft struct sysctl_oid *
+.Fo SYSCTL_ADD_U16
+.Fa "struct sysctl_ctx_list *ctx"
+.Fa "struct sysctl_oid_list *parent"
+.Fa "int number"
+.Fa "const char *name"
+.Fa "int access"
+.Fa "uint16_t *arg"
+.Fa "int len"
+.Fa "const char *descr"
+.Fc
+.Ft struct sysctl_oid *
 .Fo SYSCTL_ADD_U32
 .Fa "struct sysctl_ctx_list *ctx"
 .Fa "struct sysctl_oid_list *parent"
 .Fa "const char *descr"
 .Fc
 .Ft struct sysctl_oid *
+.Fo SYSCTL_ADD_U64
+.Fa "struct sysctl_ctx_list *ctx"
+.Fa "struct sysctl_oid_list *parent"
+.Fa "int number"
+.Fa "const char *name"
+.Fa "int access"
+.Fa "uint64_t *arg"
+.Fa "int len"
+.Fa "const char *descr"
+.Fc
+.Ft struct sysctl_oid *
 .Fo SYSCTL_ADD_UINT
 .Fa "struct sysctl_ctx_list *ctx"
 .Fa "struct sysctl_oid_list *parent"
@@ -447,16 +524,44 @@ function.
 creates an oid of type
 .Dv CTLTYPE_NODE ,
 to which child oids may be added.
+.It Fn SYSCTL_ADD_S8
+creates an oid that handles an
+.Li int8_t
+variable.
+.It Fn SYSCTL_ADD_S16
+creates an oid that handles an
+.Li int16_t
+variable.
+.It Fn SYSCTL_ADD_S32
+creates an oid that handles an
+.Li int16_t
+variable.
+.It Fn SYSCTL_ADD_S64
+creates an oid that handles an
+.Li int64_t
+variable.
 .It Fn SYSCTL_ADD_STRING
 creates an oid that handles a zero-terminated character string.
 .It Fn SYSCTL_ADD_INT
 creates an oid that handles an
 .Li int
 variable.
+.It Fn SYSCTL_ADD_U8
+creates an oid that handles a
+.Li uint8_t
+variable.
+.It Fn SYSCTL_ADD_U16
+creates an oid that handles a
+.Li uint16_t
+variable.
 .It Fn SYSCTL_ADD_U32
 creates an oid that handles a
 .Li uint32_t
 variable.
+.It Fn SYSCTL_ADD_U64
+creates an oid that handles a
+.Li uint64_t
+variable.
 .It Fn SYSCTL_ADD_UINT
 creates an oid that handles an
 .Li unsigned int
index 0d4c3c1..da0692f 100644 (file)
@@ -571,9 +571,18 @@ sysctl_sysctl_debug_dump_node(struct sysctl_oid_list *l, int i)
                                }
                                break;
                        case CTLTYPE_INT:    kprintf(" Int\n"); break;
+                       case CTLTYPE_UINT:   kprintf(" u_int\n"); break;
+                       case CTLTYPE_LONG:   kprintf(" Long\n"); break;
+                       case CTLTYPE_ULONG:  kprintf(" u_long\n"); break;
                        case CTLTYPE_STRING: kprintf(" String\n"); break;
-                       case CTLTYPE_QUAD:   kprintf(" Quad\n"); break;
+                       case CTLTYPE_S8:     kprintf(" int8_t\n"); break;
+                       case CTLTYPE_S16:    kprintf(" int16_t\n"); break;
+                       case CTLTYPE_S32:    kprintf(" int32_t\n"); break;
+                       case CTLTYPE_S64:    kprintf(" int64_t\n"); break;
+                       case CTLTYPE_U8:     kprintf(" uint8_t\n"); break;
+                       case CTLTYPE_U16:    kprintf(" uint16_t\n"); break;
                        case CTLTYPE_U32:    kprintf(" uint32_t\n"); break;
+                       case CTLTYPE_U64:    kprintf(" uint64_t\n"); break;
                        case CTLTYPE_OPAQUE: kprintf(" Opaque/struct\n"); break;
                        default:             kprintf("\n");
                }
@@ -856,6 +865,46 @@ SYSCTL_NODE(_sysctl, 5, oiddescr, CTLFLAG_RD | CTLFLAG_NOLOCK,
  * Default "handler" functions.
  */
 
+/*
+ * Handle an 8-bit number, signed or unsigned.  arg1 points to it.
+ */
+
+int
+sysctl_handle_8(SYSCTL_HANDLER_ARGS)
+{
+       int error = 0;
+
+       if (!arg1)
+               return (EINVAL);
+       error = SYSCTL_OUT(req, arg1, sizeof(int8_t));
+
+       if (error || !req->newptr)
+               return (error);
+
+       error = SYSCTL_IN(req, arg1, sizeof(int8_t));
+       return (error);
+}
+
+/*
+ * Handle a 16-bit number, signed or unsigned.  arg1 points to it.
+ */
+
+int
+sysctl_handle_16(SYSCTL_HANDLER_ARGS)
+{
+       int error = 0;
+
+       if (!arg1)
+               return (EINVAL);
+       error = SYSCTL_OUT(req, arg1, sizeof(int16_t));
+
+       if (error || !req->newptr)
+               return (error);
+
+       error = SYSCTL_IN(req, arg1, sizeof(int16_t));
+       return (error);
+}
+
 /*
  * Handle a 32-bit number, signed or unsigned.  arg1 points to it.
  */
@@ -876,6 +925,26 @@ sysctl_handle_32(SYSCTL_HANDLER_ARGS)
        return (error);
 }
 
+/*
+ * Handle a 64-bit number, signed or unsigned.  arg1 points to it.
+ */
+
+int
+sysctl_handle_64(SYSCTL_HANDLER_ARGS)
+{
+       int error = 0;
+
+       if (!arg1)
+               return (EINVAL);
+       error = SYSCTL_OUT(req, arg1, sizeof(int64_t));
+
+       if (error || !req->newptr)
+               return (error);
+
+       error = SYSCTL_IN(req, arg1, sizeof(int64_t));
+       return (error);
+}
+
 /*
  * Handle an int, signed or unsigned.
  * Two cases:
index 6fea21a..87a182e 100644 (file)
@@ -70,13 +70,20 @@ struct ctlname {
 #define        CTLTYPE_NODE    1       /* name is a node */
 #define        CTLTYPE_INT     2       /* name describes an integer */
 #define        CTLTYPE_STRING  3       /* name describes a string */
-#define        CTLTYPE_QUAD    4       /* name describes a 64-bit number */
+#define        CTLTYPE_S64     4       /* name describes a signed 64-bit number */
+#define        CTLTYPE_QUAD    CTLTYPE_S64 /* name describes a signed 64-bit number */
 #define        CTLTYPE_OPAQUE  5       /* name describes a structure */
 #define        CTLTYPE_STRUCT  CTLTYPE_OPAQUE  /* name describes a structure */
 #define        CTLTYPE_UINT    6       /* name describes an unsigned integer */
 #define        CTLTYPE_LONG    7       /* name describes a long */
 #define        CTLTYPE_ULONG   8       /* name describes an unsigned long */
-#define        CTLTYPE_UQUAD   9       /* name describes an unsigned 64-bit number */
+#define        CTLTYPE_U64     9       /* name describes an unsigned 64-bit number */
+#define        CTLTYPE_UQUAD   CTLTYPE_U64 /* name describes an unsigned 64-bit number */
+#define        CTLTYPE_U8      0xa     /* name describes an unsigned 8-bit number */
+#define        CTLTYPE_U16     0xb     /* name describes an unsigned 16-bit number */
+#define        CTLTYPE_S8      0xc     /* name describes a signed 8-bit number */
+#define        CTLTYPE_S16     0xd     /* name describes a signed 16-bit number */
+#define        CTLTYPE_S32     0xe     /* name describes a signed 32-bit number */
 #define        CTLTYPE_U32     0xf     /* name describes an unsigned 32-bit number */
 
 #define        CTLFLAG_RD      0x80000000      /* Allow reads of variable */
@@ -158,7 +165,10 @@ struct sysctl_oid {
 #define SYSCTL_OUT(r, p, l)    (r->oldfunc)(r, p, l)
 #define SYSCTL_OUT_STR(r, p)   (r->oldfunc)(r, p, strlen(p) + 1)
 
+int sysctl_handle_8(SYSCTL_HANDLER_ARGS);
+int sysctl_handle_16(SYSCTL_HANDLER_ARGS);
 int sysctl_handle_32(SYSCTL_HANDLER_ARGS);
+int sysctl_handle_64(SYSCTL_HANDLER_ARGS);
 int sysctl_handle_int(SYSCTL_HANDLER_ARGS);
 int sysctl_handle_long(SYSCTL_HANDLER_ARGS);
 int sysctl_handle_quad(SYSCTL_HANDLER_ARGS);
@@ -319,6 +329,60 @@ TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_entry);
                CTLTYPE_ULONG|CTLFLAG_NOLOCK|(access),                  \
                ptr, 0, sysctl_handle_long, "LU", descr)
 
+/* Oid for a signed 8-bit int.  The pointer must be non NULL. */
+#define SYSCTL_S8(parent, nbr, name, access, ptr, val, descr)  \
+       SYSCTL_OID(parent, nbr, name, CTLTYPE_S8|(access),              \
+               ptr, val, sysctl_handle_8, "C", descr)
+
+#define SYSCTL_ADD_S8(ctx, parent, nbr, name, access, ptr, descr)      \
+       sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_S8|(access),     \
+       ptr, 0, sysctl_handle_8, "C", descr)
+
+/* Oid for a signed 16-bit int.  The pointer must be non NULL. */
+#define SYSCTL_S16(parent, nbr, name, access, ptr, val, descr) \
+       SYSCTL_OID(parent, nbr, name, CTLTYPE_S16|(access),             \
+               ptr, val, sysctl_handle_16, "S", descr)
+
+#define SYSCTL_ADD_S16(ctx, parent, nbr, name, access, ptr, descr)     \
+       sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_S16|(access),    \
+       ptr, 0, sysctl_handle_16, "S", descr)
+
+/* Oid for a signed 32-bit int.  The pointer must be non NULL. */
+#define SYSCTL_S32(parent, nbr, name, access, ptr, val, descr) \
+       SYSCTL_OID(parent, nbr, name, CTLTYPE_S32|(access),             \
+               ptr, val, sysctl_handle_32, "I", descr)
+
+#define SYSCTL_ADD_S32(ctx, parent, nbr, name, access, ptr, descr)     \
+       sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_S32|(access),    \
+       ptr, 0, sysctl_handle_32, "I", descr)
+
+/* Oid for a signed 64-bit int.  The pointer must be non NULL. */
+#define SYSCTL_S64(parent, nbr, name, access, ptr, val, descr) \
+       SYSCTL_OID(parent, nbr, name, CTLTYPE_S64|(access),             \
+               ptr, val, sysctl_handle_64, "Q", descr)
+
+#define SYSCTL_ADD_S64(ctx, parent, nbr, name, access, ptr, descr)     \
+       sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_S64|(access),    \
+       ptr, 0, sysctl_handle_64, "Q", descr)
+
+/* Oid for an unsigned 8-bit int.  The pointer must be non NULL. */
+#define SYSCTL_U8(parent, nbr, name, access, ptr, val, descr)  \
+       SYSCTL_OID(parent, nbr, name, CTLTYPE_U8|(access),              \
+               ptr, val, sysctl_handle_8, "CU", descr)
+
+#define SYSCTL_ADD_U8(ctx, parent, nbr, name, access, ptr, descr)      \
+       sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_U8|(access),     \
+       ptr, 0, sysctl_handle_8, "CU", descr)
+
+/* Oid for an unsigned 16-bit int.  The pointer must be non NULL. */
+#define SYSCTL_U16(parent, nbr, name, access, ptr, val, descr) \
+       SYSCTL_OID(parent, nbr, name, CTLTYPE_U16|(access),             \
+               ptr, val, sysctl_handle_16, "SU", descr)
+
+#define SYSCTL_ADD_U16(ctx, parent, nbr, name, access, ptr, descr)     \
+       sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_U16|(access),    \
+       ptr, 0, sysctl_handle_16, "SU", descr)
+
 /* Oid for an unsigned 32-bit int.  The pointer must be non NULL. */
 #define SYSCTL_U32(parent, nbr, name, access, ptr, val, descr) \
        SYSCTL_OID(parent, nbr, name, CTLTYPE_U32|(access),             \
@@ -328,6 +392,15 @@ TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_entry);
        sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_U32|(access),    \
        ptr, 0, sysctl_handle_32, "IU", descr)
 
+/* Oid for an unsigned 64-bit int.  The pointer must be non NULL. */
+#define SYSCTL_U64(parent, nbr, name, access, ptr, val, descr) \
+       SYSCTL_OID(parent, nbr, name, CTLTYPE_U64|(access),             \
+               ptr, val, sysctl_handle_64, "QU", descr)
+
+#define SYSCTL_ADD_U64(ctx, parent, nbr, name, access, ptr, descr)     \
+       sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_U64|(access),    \
+       ptr, 0, sysctl_handle_64, "QU", descr)
+
 /* Oid for an opaque object.  Specified by a pointer and a length. */
 #define SYSCTL_OPAQUE(parent, nbr, name, access, ptr, len, fmt, descr) \
        SYSCTL_OID(parent, nbr, name, CTLTYPE_OPAQUE|(access),          \