aboutsummaryrefslogtreecommitdiff
path: root/toys/pending/sysctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/pending/sysctl.c')
-rw-r--r--toys/pending/sysctl.c152
1 files changed, 0 insertions, 152 deletions
diff --git a/toys/pending/sysctl.c b/toys/pending/sysctl.c
deleted file mode 100644
index c83051c7..00000000
--- a/toys/pending/sysctl.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/* sysctl.c - A utility to read and manipulate the sysctl parameters.
- *
- * Copyright 2014 Bilal Qureshi <bilal.jmi@gmail.com>
- * Copyright 2014 Kyungwan Han <asura321@gmail.com>
- *
- * No Standard
-
-USE_SYSCTL(NEWTOY(sysctl, "^neNqwpaA[!ap][!aq][!aw][+aA]", TOYFLAG_USR|TOYFLAG_BIN))
-
-config SYSCTL
- bool "sysctl"
- default n
- help
- usage: sysctl [-aAeNnqw] [-p [FILE] | KEY[=VALUE]...]
-
- Read/write system control data (under /proc/sys).
-
- -a,A Show all values
- -e Don't warn about unknown keys
- -N Don't print key values
- -n Don't print key names
- -p [FILE] Read values from FILE (default /etc/sysctl.conf)
- -q Don't show value after write
- -w Only write values (object to reading)
-*/
-#define FOR_sysctl
-#include "toys.h"
-
-// Null terminate at =, return value
-static char *split_key(char *key)
-{
- char *value = strchr(key, '=');
-
- if (value) *(value++)=0;
-
- return value;
-}
-
-static void replace_char(char *str, char old, char new)
-{
- for (; *str; str++) if (*str == old) *str = new;
-}
-
-static void key_error(char *key)
-{
- if (errno == ENOENT) {
- if (!(toys.optflags & FLAG_e)) error_msg("unknown key '%s'", key);
- } else perror_msg("key '%s'", key);
-}
-
-static int write_key(char *path, char *key, char *value)
-{
- int fd = open(path, O_WRONLY);;
-
- if (fd < 0) {
- key_error(key);
-
- return 0;
- }
- xwrite(fd, value, strlen(value));
- xclose(fd);
-
- return 1;
-}
-
-// Display all keys under a path
-static int do_show_keys(struct dirtree *dt)
-{
- char *path, *data, *key;
-
- if (!dirtree_notdotdot(dt)) return 0; // Skip . and ..
- if (S_ISDIR(dt->st.st_mode)) return DIRTREE_RECURSE;
-
- path = dirtree_path(dt, 0);
- data = readfile(path, 0, 0);
- replace_char(key = path + 10, '/', '.'); // skip "/proc/sys/"
- if (!data) key_error(key);
- else {
- // Print the parts that aren't switched off by flags.
- if (!(toys.optflags & FLAG_n)) xprintf("%s", key);
- if (!(toys.optflags & (FLAG_N|FLAG_n))) xprintf(" = ");
- for (key = data+strlen(data); key > data && isspace(*--key); *key = 0);
- if (!(toys.optflags & FLAG_N)) xprintf("%s", data);
- if ((toys.optflags & (FLAG_N|FLAG_n)) != (FLAG_N|FLAG_n)) xputc('\n');
- }
-
- free(data);
- free(path);
-
- return 0;
-}
-
-// Read/write entries under a key. Accepts "key=value" in key if !value
-static void process_key(char *key, char *value)
-{
- char *path;
-
- if (!value) value = split_key(key);
- if ((toys.optflags & FLAG_w) && !value) {
- error_msg("'%s' not key=value");
-
- return;
- }
-
- path = xmprintf("/proc/sys/%s", key);
- replace_char(path, '.', '/');
- // Note: failure to assign to a non-leaf node suppresses the display.
- if (!(value && (!write_key(path, key, value) || (toys.optflags & FLAG_q)))) {
- if (!access(path, R_OK)) dirtree_read(path, do_show_keys);
- else key_error(key);
- }
- free(path);
-}
-
-void sysctl_main()
-{
- char **args = 0;
-
- // Display all keys
- if (toys.optflags & FLAG_a) dirtree_read("/proc/sys", do_show_keys);
-
- // read file
- else if (toys.optflags & FLAG_p) {
- FILE *fp = xfopen(*toys.optargs ? *toys.optargs : "/etc/sysctl.conf", "r");
- size_t len;
-
- for (;;) {
- char *line = 0, *key, *val;
-
- if (-1 == (len = getline(&line, &len, fp))) break;
- key = line;
- while (isspace(*key)) key++;
- if (*key == '#' || *key == ';' || !*key) continue;
- while (len && isspace(line[len-1])) line[--len] = 0;
- if (!(val = split_key(line))) {
- error_msg("'%s' not key=value", line);
- continue;
- }
-
- // Trim whitespace around =
- len = (val-line)-1;
- while (len && isspace(line[len-1])) line[--len] = 0;
- while (isspace(*val)) val++;;
-
- process_key(key, val);
- free(line);
- }
- fclose(fp);
-
- // Loop through arguments, displaying or assigning as appropriate
- } else for (args = toys.optargs; *args; args++) process_key(*args, 0);
-}