Hello everyone,
this patch adds the "-p" option to sysctl which makes it possible to
read/parse/apply settings from /etc/sysctl.conf at any time the user
wishes. Normally, the sysctl.conf is only parsed during system boot via rc.
I've tested the patch on OpenBSD 7.2 amd64 and so far there have been no
problems.
Thanks in advance!
PS: Sorry if any mistakes were made, first time trying to contribute.
--- sysctl.c.dist Tue Feb 21 12:17:57 2023
+++ sysctl.c Tue Feb 21 11:59:56 2023
@@ -138,6 +138,9 @@
/* Maximum size object to expect from sysctl(2) */
#define SYSCTL_BUFSIZ 8192
+/* Default sysctl.conf location */
+#define SYSCTL_CONF "/etc/sysctl.conf"
+
struct list {
struct ctlname *list;
int size;
@@ -161,7 +164,7 @@
{ 0, 0 }, /* CTL_VFS */
};
-int Aflag, aflag, nflag, qflag;
+int Aflag, aflag, nflag, pflag, qflag;
time_t boottime;
@@ -192,6 +195,7 @@
ssize_t parse_hex_string(unsigned char *, size_t, const char *);
void parse(char *, int);
void parse_baddynamic(int *, size_t, char *, void **, size_t *, int, int);
+void read_config(void);
void usage(void);
int findname(char *, char *, char **, struct list *);
int sysctl_inet(char *, char **, int *, int, int *);
@@ -232,7 +236,7 @@
{
int ch, lvl1;
- while ((ch = getopt(argc, argv, "Aanqw")) != -1) {
+ while ((ch = getopt(argc, argv, "Aanpqw")) != -1) {
switch (ch) {
case 'A':
@@ -247,6 +251,10 @@
nflag = 1;
break;
+ case 'p':
+ pflag = 1;
+ break;
+
case 'q':
qflag = 1;
break;
@@ -268,9 +276,16 @@
err(1,"unveil %s", _PATH_DEVDB);
if (unveil("/dev", "r") == -1 && errno != ENOENT)
err(1, "unveil /dev");
+ if(unveil("/etc", "r") == -1 && errno != ENOENT)
+ err(1, "unveil /etc");
if (unveil(NULL, NULL) == -1)
err(1, "unveil");
+ if (pflag) {
+ read_config();
+ return (0);
+ }
+
if (argc == 0 || (Aflag || aflag)) {
debuginit();
vfsinit();
@@ -278,9 +293,30 @@
listall(topname[lvl1].ctl_name, &secondlevel[lvl1]);
return (0);
}
+
for (; *argv != NULL; ++argv)
parse(*argv, 1);
return (0);
+}
+
+/*
+ * Read sysctl.conf and parse every line
+ */
+void
+read_config(void)
+{
+ char line[SYSCTL_BUFSIZ];
+ FILE *file;
+
+ file = fopen(SYSCTL_CONF, "r");
+ if(!file)
+ err(1, "fopen");
+
+ while(fgets(line, SYSCTL_BUFSIZ, file) != NULL) {
+ line[strlen(line)-1] = '\0';
+ parse(line, 1);
+ memset(line, '\0', SYSCTL_BUFSIZ);
+ }
}
/*
--- sysctl.8.dist Tue Feb 21 12:18:21 2023
+++ sysctl.8 Tue Feb 21 12:09:59 2023
@@ -38,7 +38,7 @@
.Nd get or set kernel state
.Sh SYNOPSIS
.Nm sysctl
-.Op Fl Aanq
+.Op Fl Aanpq
.Op Ar name Ns Op = Ns Ar value
.Sh DESCRIPTION
The
@@ -74,6 +74,8 @@
For example, to set the psize shell variable to the pagesize of the
hardware:
.Pp
.Dl # set psize=`sysctl -n hw.pagesize`
+.It Fl p
+Read and apply all settings from /etc/sysctl.conf.
.It Fl q
Suppress all output when setting a variable.
This option overrides the behaviour of
@@ -133,6 +135,10 @@
To retrieve information about the load average history:
.Pp
.Dl $ sysctl vm.loadavg
+.Pp
+To apply all settings from /etc/sysctl.conf
+.Pp
+.Dl # sysctl -p
.Pp
To make the
.Xr chown 2