commit 0897d999e63be4e2e6e5c385b72a02dd649086ee
parent 6ba9fe35f1716763cfa95ed8c27510822b4b96d0
Author: sin <sin@2f30.org>
Date: Thu, 17 Apr 2014 16:38:31 +0100
Implement streplace()
Restore variable as early as possible and in error conditions
Diffstat:
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/sysctl.c b/sysctl.c
@@ -7,6 +7,16 @@
#include <unistd.h>
#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);