diff --git a/man/sysctl.d.xml b/man/sysctl.d.xml
index 00a857b11..db53b4959 100644
--- a/man/sysctl.d.xml
+++ b/man/sysctl.d.xml
@@ -68,13 +68,26 @@
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.
+ is # or ; are
+ ignored.
- Note that both / and . are accepted as label
- separators within sysctl variable
- names. kernel.domainname=foo and
- kernel/domainname=foo hence are
- entirely equivalent.
+ Note that either / or
+ . 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. kernel.domainname=foo
+ and kernel/domainname=foo are
+ equivalent and will cause foo to
+ be written to
+ /proc/sys/kernel/domainname.
+ Either
+ net.ipv4.conf.enp3s0/200.forwarding
+ or
+ net/ipv4/conf/enp3s0.200/forwarding
+ may be used to refer to
+ /proc/sys/net/ipv4/conf/enp3s0.200/forwarding.
+
Each configuration file shall be named in the
style of program.conf.
@@ -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,
net.ipv4.conf.*,
net.ipv6.conf.*,
net.ipv4.neigh.* and net.ipv6.neigh.*)
diff --git a/src/sysctl/sysctl.c b/src/sysctl/sysctl.c
index 283eefe1a..06defa5b7 100644
--- a/src/sysctl/sysctl.c
+++ b/src/sysctl/sysctl.c
@@ -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;
}