commit 8b32decb6feabf771a06aed6f9c19fa27da7f1f6
Author: sin <[email protected]>
Date:   Thu Apr 17 15:18:38 2014 +0100

    Add initial implementation of sysctl(8)
    
    Needs a bit of cleanup (avoiding magic numbers etc.).

diff --git a/Makefile b/Makefile
index dd2f1cd..17f620c 100644
--- a/Makefile
+++ b/Makefile
@@ -47,6 +47,7 @@ SRC = \
        swapoff.c           \
        swapon.c            \
        switch_root.c       \
+       sysctl.c            \
        truncate.c          \
        umount.c            \
        unshare.c           \
@@ -92,6 +93,7 @@ MAN8 = \
        swapoff.8           \
        swapon.8            \
        switch_root.8       \
+       sysctl.8            \
        umount.8
 
 OBJ = $(SRC:.c=.o) $(LIB)
diff --git a/README b/README
index 7743756..7cf5f95 100644
--- a/README
+++ b/README
@@ -9,7 +9,7 @@ The following programs are currently implemented:
     chvt clear ctrlaltdel df dmesg  eject fallocate free getty halt id
     insmod killall5 lsmod lsusb mknod mkswap mount mountpoint pagesize
     pidof  pivot_root   ps  respawn  rmmod  stat   su  swapoff  swapon
-    switch_root truncate umount unshare uptime watch who
+    switch_root sysctl truncate umount unshare uptime watch who
 
 The complement  of ubase  is sbase[1] which  mostly follows  POSIX and
 provides all the portable tools.  Together they are intended to form a
diff --git a/TODO b/TODO
index 409a6df..ec7272e 100644
--- a/TODO
+++ b/TODO
@@ -6,7 +6,6 @@ Tools
  * swaplabel(8)
  * last(1)
  * losetup(8)
- * sysctl
  * lspci
  * mkswap [-L]
  * passwd
diff --git a/sysctl.8 b/sysctl.8
new file mode 100644
index 0000000..62dc27a
--- /dev/null
+++ b/sysctl.8
@@ -0,0 +1,9 @@
+.TH SYSCTL 8 ubase-VERSION
+.SH NAME
+BsysctlR - Configure kernel parameters at runtime
+.SH SYNOPSIS
+BsysctlR IvariableR[=IvalueR]...
+.SH DESCRIPTION
+BsysctlR modifies kernel parameters at runtime.  The parameters available
+are those listed under I/proc/sys/R.  Procfs is required for sysctl support
+in Linux.  You can use BsysctlR to both read and write sysctl data.
diff --git a/sysctl.c b/sysctl.c
new file mode 100644
index 0000000..c6e42ce
--- /dev/null
+++ b/sysctl.c
@@ -0,0 +1,139 @@
+/* See LICENSE file for copyright and license details. */
+#include <fcntl.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "util.h"
+
+static int
+getsysctl(char *variable, char **value)
+{
+       char path[PATH_MAX];
+       char *p;
+       char *buf;
+       int fd;
+       ssize_t n;
+
+       for (p = variable; *p; p++)
+               if (*p == '.')
+                       *p = '/';
+
+       strlcpy(path, "/proc/sys/", sizeof(path));
+       if (strlcat(path, variable, sizeof(path)) >= sizeof(path))
+               return -1;
+
+       fd = open(path, O_RDONLY);
+       if (fd < 0)
+               return -1;
+
+       buf = malloc(1024);
+       if (!buf) {
+               close(fd);
+               return -1;
+       }
+
+       n = read(fd, buf, 1023);
+       if (n <= 0) {
+               close(fd);
+               free(buf);
+               return -1;
+       }
+       buf[n] = '

Reply via email to