sysctl: replaces some slashes with dots

It turns out that plain sysctl understands a.b/c syntax to write to
/proc/sys/a/b.c. Support this for compatibility.

https://bugs.freedesktop.org/show_bug.cgi?id=77466
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2014-04-16 21:33:46 -04:00
parent 806a37e743
commit 2e573fcf87
Notes: Zbigniew Jędrzejewski-Szmek 2014-04-21 08:49:59 -04:00
Backport: bugfix
2 changed files with 36 additions and 9 deletions

View file

@ -68,13 +68,26 @@
<para>The configuration files contain a list of
variable assignments, separated by newlines. Empty
lines and lines whose first non-whitespace character
is # or ; are ignored.</para>
is <literal>#</literal> or <literal>;</literal> are
ignored.</para>
<para>Note that both / and . are accepted as label
separators within sysctl variable
names. <literal>kernel.domainname=foo</literal> and
<literal>kernel/domainname=foo</literal> hence are
entirely equivalent.</para>
<para>Note that either <literal>/</literal> or
<literal>.</literal> may be used as separators within
sysctl variable names. If the first separator is a
slash, remaining slashes and dots are left intact. If
the first separator is a dot, dots and slashes are
interchanged. <literal>kernel.domainname=foo</literal>
and <literal>kernel/domainname=foo</literal> are
equivalent and will cause <literal>foo</literal> to
be written to
<filename>/proc/sys/kernel/domainname</filename>.
Either
<literal>net.ipv4.conf.enp3s0/200.forwarding</literal>
or
<literal>net/ipv4/conf/enp3s0.200/forwarding</literal>
may be used to refer to
<filename>/proc/sys/net/ipv4/conf/enp3s0.200/forwarding</filename>.
</para>
<para>Each configuration file shall be named in the
style of <filename><replaceable>program</replaceable>.conf</filename>.
@ -109,7 +122,7 @@
early on boot. The network interface-specific options
will also be applied individually for each network
interface as it shows up in the system. (More
specifically, that is
specifically,
<filename>net.ipv4.conf.*</filename>,
<filename>net.ipv6.conf.*</filename>,
<filename>net.ipv4.neigh.*</filename> and <filename>net.ipv6.neigh.*</filename>)</para>

View file

@ -48,12 +48,26 @@ static const char conf_file_dirs[] =
#endif
;
static char *normalize_sysctl(char *s) {
static char* normalize_sysctl(char *s) {
char *n;
for (n = s; *n; n++)
n = strpbrk(s, "/.");
/* If the first separator is a slash, the path is
* assumed to be normalized and slashes remain slashes
* and dots remains dots. */
if (!n || *n == '/')
return s;
/* Otherwise, dots become slashes and slashes become
* dots. Fun. */
while (n) {
if (*n == '.')
*n = '/';
else
*n = '.';
n = strpbrk(n + 1, "/.");
}
return s;
}