[PATCH] sysctl: fix compatibility with procps sysctl
Aaro Koskinen
aaro.koskinen at iki.fi
Thu Jan 31 20:14:56 UTC 2019
From: Aaro Koskinen <aaro.koskinen at nokia.com>
Busybox sysctl is incompatible with procps when '.' appears in
directory name, mostly happens with VLANs.
busybox syntax (since 2008): net.ipv4.conf.eth0.100.mc_forwarding
procps syntax (since 2002): net.ipv4.conf.eth0/100.mc_forwarding
(supported by both: net/ipv4/conf/eth0.100/mc_forwarding)
Make procps syntax the default; for users relying on the old behaviour
provide a config option for time being.
Signed-off-by: Aaro Koskinen <aaro.koskinen at nokia.com>
---
procps/sysctl.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/procps/sysctl.c b/procps/sysctl.c
index 5fa7646d1..3e79e3927 100644
--- a/procps/sysctl.c
+++ b/procps/sysctl.c
@@ -15,6 +15,23 @@
//config: default y
//config: help
//config: Configure kernel parameters at runtime.
+//config:config SYSCTL_OLDBUSYBOX_COMPAT
+//config: bool "sysctl compatibility with older busybox versions"
+//config: default n
+//config: depends on BB_SYSCTL
+//config: help
+//config: Older busybox versions are incompatible with procps when
+//config: handling VLAN interfaces. Busybox supported syntax:
+//config: net.ipv4.conf.eth0.100.mc_forwarding
+//config: while procps supports:
+//config: net.ipv4.conf.eth0/100.mc_forwarding
+//config:
+//config: Choose this option only if you are upgrading from an older
+//config: busybox and need to maintain compatilibity e.g. for scripts
+//config: that configure VLAN interfaces using sysctl. This option may be
+//config: deprecated in the future so consider migrating to the procps
+//config: syntax.
+//config:
//applet:IF_BB_SYSCTL(APPLET_NOEXEC(sysctl, sysctl, BB_DIR_SBIN, BB_SUID_DROP, sysctl))
@@ -56,6 +73,7 @@ enum {
static void sysctl_dots_to_slashes(char *name)
{
+#ifdef CONFIG_SYSCTL_OLDBUSYBOX_COMPAT
char *cptr, *last_good, *end;
/* Convert minimum number of '.' to '/' so that
@@ -97,6 +115,25 @@ static void sysctl_dots_to_slashes(char *name)
cptr--;
}
*end = '\0';
+#else /* CONFIG_SYSCTL_OLDBUSYBOX_COMPAT */
+ char *cptr;
+ int n = 0;
+
+ cptr = name;
+ while (*cptr) {
+ if (*cptr == '.') {
+ *cptr = '/';
+ n++;
+ } else if (*cptr == '/') {
+ if (!n)
+ return; /* slash syntax is used */
+ *cptr = '.';
+ } else if (*cptr == '=') {
+ return;
+ }
+ cptr++;
+ }
+#endif /* CONFIG_SYSCTL_OLDBUSYBOX_COMPAT */
}
static int sysctl_act_on_setting(char *setting)
@@ -112,6 +149,10 @@ static int sysctl_act_on_setting(char *setting)
while (*cptr) {
if (*cptr == '/')
*cptr = '.';
+#ifndef CONFIG_SYSCTL_OLDBUSYBOX_COMPAT
+ else if (*cptr == '.')
+ *cptr = '/';
+#endif
cptr++;
}
--
2.17.0
More information about the busybox
mailing list