From 0897d999e63be4e2e6e5c385b72a02dd649086ee Mon Sep 17 00:00:00 2001 From: sin Date: Thu, 17 Apr 2014 16:38:31 +0100 Subject: [PATCH] Implement streplace() Restore variable as early as possible and in error conditions --- sysctl.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/sysctl.c b/sysctl.c index e9a3898..6a764e5 100644 --- a/sysctl.c +++ b/sysctl.c @@ -7,6 +7,16 @@ #include #include "util.h" +static void +streplace(char *s, int a, int b) +{ + char *p; + + for (p = s; *p; p++) + if (*p == a) + *p = b; +} + static int getsysctl(char *variable, char **value) { @@ -17,13 +27,15 @@ getsysctl(char *variable, char **value) ssize_t n; size_t sz, i; - for (p = variable; *p; p++) - if (*p == '.') - *p = '/'; + streplace(variable, '.', '/'); strlcpy(path, "/proc/sys/", sizeof(path)); - if (strlcat(path, variable, sizeof(path)) >= sizeof(path)) + if (strlcat(path, variable, sizeof(path)) >= sizeof(path)) { + streplace(variable, '/', '.'); return -1; + } + + streplace(variable, '/', '.'); fd = open(path, O_RDONLY); if (fd < 0) @@ -59,10 +71,6 @@ getsysctl(char *variable, char **value) if (p) *p = '\0'; - for (p = variable; *p; p++) - if (*p == '/') - *p = '.'; - *value = buf; close(fd);