[hackers] [ubase] Add initial implementation of sysctl(8) || sin

From: <git_AT_suckless.org>
Date: Thu, 17 Apr 2014 16:31:48 +0200

commit 8b32decb6feabf771a06aed6f9c19fa27da7f1f6
Author: sin <sin_AT_2f30.org>
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
_AT_@ -47,6 +47,7 @@ SRC = \
         swapoff.c \
         swapon.c \
         switch_root.c \
+ sysctl.c \
         truncate.c \
         umount.c \
         unshare.c \
_AT_@ -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
_AT_@ -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
_AT_@ -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
_AT_@ -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
_AT_@ -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] = '
Received on Thu Apr 17 2014 - 16:31:48 CEST

This archive was generated by hypermail 2.3.0 : Thu Apr 17 2014 - 16:36:22 CEST