sysctl: fix compatibility with procps sysctl
No binary (build failed)
—
(log yok)
| @@ -56,9 +56,32 @@ enum { | |
| static void sysctl_dots_to_slashes(char *name) | |
| { | |
| - | char *cptr, *last_good, *end; |
| + | char *cptr, *last_good, *end, *slash; |
| char end_ch; | |
| + | end = strchrnul(name, '='); |
| + | |
| + | slash = strchrnul(name, '/'); |
| + | if (slash < end |
| + | && strchrnul(name, '.') < slash |
| + | ) { |
| + | /* There are both dots and slashes, and 1st dot is |
| + | * before 1st slash. |
| + | * (IOW: not raw, unmangled a/b/c.d format) |
| + | * |
| + | * procps supports this syntax for names with dots: |
| + | * net.ipv4.conf.eth0/100.mc_forwarding |
| + | * (dots and slashes are simply swapped) |
| + | */ |
| + | while (end != name) { |
| + | end--; |
| + | if (*end == '.') *end = '/'; |
| + | else if (*end == '/') *end = '.'; |
| + | } |
| + | return; |
| + | } |
| + | /* else: use our old behavior: */ |
| + | |
| /* Convert minimum number of '.' to '/' so that | |
| * we end up with existing file's name. | |
| * | |
| @@ -77,7 +100,6 @@ static void sysctl_dots_to_slashes(char *name) | |
| * | |
| * To set up testing: modprobe 8021q; vconfig add eth0 100 | |
| */ | |
| - | end = strchrnul(name, '='); |
| end_ch = *end; | |
| *end = '.'; /* trick the loop into trying full name too */ | |
| @@ -114,6 +136,8 @@ static int sysctl_act_on_setting(char *setting) | |
| while (*cptr) { | |
| if (*cptr == '/') | |
| *cptr = '.'; | |
| + | else if (*cptr == '.') |
| + | *cptr = '/'; |
| cptr++; | |
| } | |