From 58cc52aa76462d668a37af8e5ae70a190e54f105 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Wed, 15 Oct 2008 08:22:55 +0000 Subject: [PATCH] sysctl: fix bug 3894 (by Kryzhanovskyy Maksym) function old new delta sysctl_dots_to_slashes - 47 +47 sysctl_write_setting 310 298 -12 sysctl_read_setting 296 284 -12 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 0/2 up/down: 47/-24) Total: 23 bytes --- procps/sysctl.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/procps/sysctl.c b/procps/sysctl.c index 79f0074c9..18caa2c11 100644 --- a/procps/sysctl.c +++ b/procps/sysctl.c @@ -20,6 +20,7 @@ static int sysctl_read_setting(const char *setting); static int sysctl_write_setting(const char *setting); static int sysctl_display_all(const char *path); static int sysctl_preload_file_and_exit(const char *filename); +static void sysctl_dots_to_slashes(char *name); static const char ETC_SYSCTL_CONF[] ALIGN1 = "/etc/sysctl.conf"; static const char PROC_SYS[] ALIGN1 = "/proc/sys/"; @@ -143,8 +144,7 @@ static int sysctl_write_setting(const char *setting) tmpname = xasprintf("%s%.*s", PROC_SYS, (int)(equals - name), name); outname = xstrdup(tmpname + strlen_PROC_SYS); - while ((cptr = strchr(tmpname, '.')) != NULL) - *cptr = '/'; + sysctl_dots_to_slashes(tmpname); while ((cptr = strchr(outname, '/')) != NULL) *cptr = '.'; @@ -198,8 +198,8 @@ static int sysctl_read_setting(const char *name) tmpname = concat_path_file(PROC_SYS, name); outname = xstrdup(tmpname + strlen_PROC_SYS); - while ((cptr = strchr(tmpname, '.')) != NULL) - *cptr = '/'; + sysctl_dots_to_slashes(tmpname); + while ((cptr = strchr(outname, '/')) != NULL) *cptr = '.'; @@ -266,3 +266,22 @@ static int sysctl_display_all(const char *path) return retval; } /* end sysctl_display_all() */ + +static void sysctl_dots_to_slashes(char *name) +{ + char *cptr = name; + + /* Example from bug 3894: + * net.ipv4.conf.eth0.100.mc_forwarding -> + * net/ipv4/conf/eth0.100/mc_forwarding */ + while (*cptr != '\0') { + if (*cptr == '.') { + *cptr = '\0'; + if (access(name, F_OK) == 0) + *cptr = '/'; + else + *cptr = '.'; + } + cptr++; + } +} /* end sysctl_dots_to_slashes() */ -- 2.25.1