kernel/sysctl: Add handling of uint32_t.
authorSascha Wildner <saw@online.de>
Fri, 20 Jul 2018 11:38:22 +0000 (13:38 +0200)
committerSascha Wildner <saw@online.de>
Fri, 20 Jul 2018 11:39:09 +0000 (13:39 +0200)
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 64785fa..0bb9e17 100644 (file)
@@ -157,6 +157,7 @@ parse(const char *string)
        size_t len;
        int i, j;
        void *newval = NULL;
+       uint32_t u32val;
        int intval;
        unsigned int uintval;
        long longval;
@@ -258,6 +259,11 @@ parse(const char *string)
                                newval = &uquadval;
                                newsize = sizeof(uquadval);
                                break;
+                       case CTLTYPE_U32:
+                               u32val = (uint32_t)strtoul(newval, NULL, 0);
+                               newval = &u32val;
+                               newsize = sizeof(u32val);
+                               break;
                        case CTLTYPE_OPAQUE:
                                if (strcmp(fmt, "T,dev_t") == 0 ||
                                    strcmp(fmt, "T,udev_t") == 0
index c10f90d..5932b1a 100644 (file)
@@ -915,6 +915,7 @@ MLINKS+=sysctl.9 SYSCTL_DECL.9 \
        sysctl.9 SYSCTL_QUAD.9 \
        sysctl.9 SYSCTL_STRING.9 \
        sysctl.9 SYSCTL_STRUCT.9 \
+       sysctl.9 SYSCTL_U32.9 \
        sysctl.9 SYSCTL_UINT.9 \
        sysctl.9 SYSCTL_ULONG.9 \
        sysctl.9 SYSCTL_UQUAD.9
@@ -927,6 +928,7 @@ MLINKS+=sysctl_add_oid.9 SYSCTL_ADD_INT.9 \
        sysctl_add_oid.9 SYSCTL_ADD_QUAD.9 \
        sysctl_add_oid.9 SYSCTL_ADD_STRING.9 \
        sysctl_add_oid.9 SYSCTL_ADD_STRUCT.9 \
+       sysctl_add_oid.9 SYSCTL_ADD_U32.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 c2c7568..6916f01 100644 (file)
@@ -24,9 +24,8 @@
 .\" SUCH DAMAGE.
 .\"
 .\" $FreeBSD: src/share/man/man9/sysctl.9,v 1.3 2006/04/28 23:21:36 keramida Exp $
-.\" $DragonFly: src/share/man/man9/sysctl.9,v 1.6 2008/09/02 11:50:46 matthias Exp $
 .\"
-.Dd September 2, 2008
+.Dd July 20, 2018
 .Dt SYSCTL 9
 .Os
 .Sh NAME
@@ -39,6 +38,7 @@
 .Nm SYSCTL_PROC ,
 .Nm SYSCTL_STRING ,
 .Nm SYSCTL_STRUCT ,
+.Nm SYSCTL_U32 ,
 .Nm SYSCTL_UINT ,
 .Nm SYSCTL_ULONG ,
 .Nm SYSCTL_UQUAD
 .Fa "type"
 .Fa "descr"
 .Fc
+.Fo SYSCTL_U32
+.Fa "parent"
+.Fa "number"
+.Fa "name"
+.Fa "access"
+.Fa "ptr"
+.Fa "val"
+.Fa "descr"
+.Fc
 .Fo SYSCTL_UINT
 .Fa "parent"
 .Fa "nbr"
@@ -174,6 +183,7 @@ New nodes are declared using one of
 .Nm SYSCTL_PROC ,
 .Nm SYSCTL_STRING ,
 .Nm SYSCTL_STRUCT ,
+.Nm SYSCTL_U32 ,
 .Nm SYSCTL_UINT ,
 .Nm SYSCTL_ULONG ,
 and
@@ -204,6 +214,8 @@ This is an opaque data structure.
 .It Dv CTLTYPE_STRUCT
 Alias for
 .Dv CTLTYPE_OPAQUE .
+.It Dv CTLTYPE_U32
+This is a 32-bit unsigned integer.
 .It Dv CTLTYPE_UINT
 This is an unsigned integer.
 .It Dv CTLTYPE_LONG
index ef22dff..987cfb1 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 May 16, 2015
+.Dd July 20, 2018
 .Dt SYSCTL_ADD_OID 9
 .Os
 .Sh NAME
 .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 "int number"
+.Fa "const char *name"
+.Fa "int access"
+.Fa "uint32_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"
@@ -428,6 +439,10 @@ creates an oid that handles a zero-terminated character string.
 creates an oid that handles an
 .Li int
 variable.
+.It Fn SYSCTL_ADD_U32
+creates an oid that handles a
+.Li uint32_t
+variable.
 .It Fn SYSCTL_ADD_UINT
 creates an oid that handles an
 .Li unsigned int
index 66f7dd6..0d4c3c1 100644 (file)
@@ -573,6 +573,7 @@ sysctl_sysctl_debug_dump_node(struct sysctl_oid_list *l, int i)
                        case CTLTYPE_INT:    kprintf(" Int\n"); break;
                        case CTLTYPE_STRING: kprintf(" String\n"); break;
                        case CTLTYPE_QUAD:   kprintf(" Quad\n"); break;
+                       case CTLTYPE_U32:    kprintf(" uint32_t\n"); break;
                        case CTLTYPE_OPAQUE: kprintf(" Opaque/struct\n"); break;
                        default:             kprintf("\n");
                }
@@ -855,6 +856,26 @@ SYSCTL_NODE(_sysctl, 5, oiddescr, CTLFLAG_RD | CTLFLAG_NOLOCK,
  * Default "handler" functions.
  */
 
+/*
+ * Handle a 32-bit number, signed or unsigned.  arg1 points to it.
+ */
+
+int
+sysctl_handle_32(SYSCTL_HANDLER_ARGS)
+{
+       int error = 0;
+
+       if (!arg1)
+               return (EINVAL);
+       error = SYSCTL_OUT(req, arg1, sizeof(int32_t));
+
+       if (error || !req->newptr)
+               return (error);
+
+       error = SYSCTL_IN(req, arg1, sizeof(int32_t));
+       return (error);
+}
+
 /*
  * Handle an int, signed or unsigned.
  * Two cases:
index edfaa31..6fea21a 100644 (file)
@@ -77,6 +77,7 @@ struct ctlname {
 #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_U32     0xf     /* name describes an unsigned 32-bit number */
 
 #define        CTLFLAG_RD      0x80000000      /* Allow reads of variable */
 #define        CTLFLAG_WR      0x40000000      /* Allow writes to the variable */
@@ -157,6 +158,7 @@ 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_32(SYSCTL_HANDLER_ARGS);
 int sysctl_handle_int(SYSCTL_HANDLER_ARGS);
 int sysctl_handle_long(SYSCTL_HANDLER_ARGS);
 int sysctl_handle_quad(SYSCTL_HANDLER_ARGS);
@@ -317,6 +319,15 @@ TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_entry);
                CTLTYPE_ULONG|CTLFLAG_NOLOCK|(access),                  \
                ptr, 0, sysctl_handle_long, "LU", 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),             \
+               ptr, val, sysctl_handle_32, "IU", descr)
+
+#define SYSCTL_ADD_U32(ctx, parent, nbr, name, access, ptr, descr)     \
+       sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_U32|(access),    \
+       ptr, 0, sysctl_handle_32, "IU", 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),          \