Thanks to all the suggestions/hints from Crystal Kolipe and Janne
Johansson I made a few changes to the patch.
This also fixes reading commented lines.
Thanks!
--- sysctl.c.dist Tue Feb 21 12:17:57 2023
+++ sysctl.c Tue Feb 21 13:41:13 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(SYSCTL_CONF, "r") == -1 && errno != ENOENT)
+ err(1, "unveil /etc/sysctl.conf");
if (unveil(NULL, NULL) == -1)
err(1, "unveil");
+ if (pflag) {
+ read_config();
+ return (0);
+ }
+
if (argc == 0 || (Aflag || aflag)) {
debuginit();
vfsinit();
@@ -278,9 +293,33 @@
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)
+ errx(1, "Cannot open %s", SYSCTL_CONF);
+
+ while(fgets(line, SYSCTL_BUFSIZ, file) != NULL) {
+ /* Ignore comments */
+ if (strncmp(line, "#", 1) == 0)
+ continue;
+ 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