annotate toys/pending/sysctl.c @ 1282:c99912c6bc09 draft

First cleanup pass on sysctl. Remove unnecessary typecasting of things that are already char * to char *, and multiplying by sizeof(char *) which is 1. Rename do_process() do_flag_a() since that's the only caller. Move read_key_values() down past trim_spaces() and read_config_file() so it's next to its only two users. Replace some euphemisms for 0 with 0. replace_char() really sounds like something libc should already have one of, but I'm blanking on it if so. (It doesn't need a temporary variable when the argument variable is already a copy so changing it won't affect the caller.)
author Rob Landley <rob@landley.net>
date Mon, 12 May 2014 07:52:12 -0500
parents 6b78ac1d7d58
children 55de00e9daf4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1281
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* sysctl.c - A utility to read and manipulate the sysctl parameters.
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2014 Bilal Qureshi <bilal.jmi@gmail.com>
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 * Copyright 2014 Kyungwan Han <asura321@gmail.com>
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 *
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
6 * No Standard
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
7
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
8 USE_SYSCTL(NEWTOY(sysctl, "^neNqwpaA[!ap][!aq][!aw][+aA]", TOYFLAG_USR|TOYFLAG_BIN))
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
9
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 config SYSCTL
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 bool "sysctl"
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 default n
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 help
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 usage: sysctl [OPTIONS] [KEY[=VALUE]]...
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
15
1282
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
16 Configure kernel parameters at runtime.
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
17
1281
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 -a, A Show all values
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 -e Don't warn about unknown keys
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 -N Show only key names
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 -n Show only key values
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 -p FILE Set values from FILE (default /etc/sysctl.conf)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 -q Set values silently
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 -w Set values
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 */
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 #define FOR_sysctl
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 #include "toys.h"
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
28
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 #define PROC_SYS_DIR "/proc/sys"
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 #define MAX_BYTES_LINE 1024
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
31
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 static void parse_key_name_value(char *param, char **key_name, char **key_value)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 char *name, *value;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
35
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 if (!(name = strchr(param, '='))) goto show_error_msg;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 value = name;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 value++;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 if (!(*value)) goto show_error_msg;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 *name = '\0';
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 *key_name = param;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 *key_value = value;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 show_error_msg:
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 error_msg("error: '%s' must be of the form name=value", param);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
47
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
48 static void replace_char(char *str, char old, char new)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
49 {
1282
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
50 for (; *str; str++) if (*str == old) *str = new;
1281
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
52
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
53 static void handle_file_error(char *key_name)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 replace_char(key_name, '/', '.');
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 if (errno == ENOENT) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 if (!(toys.optflags & FLAG_e))
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 error_msg("error: '%s' is an unknown key", key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 else toys.exitval = 1;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 } else perror_msg("error: %s key '%s'", (toys.optflags & FLAG_w) ?
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 "setting" : "reading", key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
62 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
63
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
64 static void write_to_file(char *fpath, char *key_name, char *key_value)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 int fd;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
67
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 replace_char(key_name, '.', '/');
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 sprintf(toybuf, "%s/%s", fpath, key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 if ((fd = open(toybuf, O_WRONLY)) < 0) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 handle_file_error(key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 xwrite(fd, key_value, strlen(key_value));
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 xclose(fd);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 if (!(toys.optflags & FLAG_q)) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 replace_char(key_name, '/', '.');
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 if (toys.optflags & FLAG_N) xprintf("%s\n", key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 else if (toys.optflags & FLAG_n) xprintf("%s\n", key_value);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 else xprintf("%s = %s\n", key_name, key_value);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
82 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
83
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
84 static char *get_key_value(char *buff, int *offset)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 {
1282
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
86 char *line, *tmp = buff + *offset;
1281
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 int index = 0, multiplier = 1;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
88
1282
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
89 if (!*tmp) return 0;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
90 line = xmalloc(MAX_BYTES_LINE);
1281
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 for (; *tmp != '\n'; tmp++) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 line[index++] = *tmp;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 if (MAX_BYTES_LINE == index) { // buffer overflow
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 multiplier++;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 line = (char *) xrealloc(line, multiplier * MAX_BYTES_LINE);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
97 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
98 line[index++] = '\0';
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 *offset += index;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 return line;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
102
1282
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
103 static void trim_spaces(char **param)
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
104 {
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
105 int len = 0;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
106 char *str = *param, *p_start = str, *p_end;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
107
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
108 if (p_start) { // start pointer to string
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
109 p_end = str + strlen(str) - 1; // end pointer to string
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
110 while (*p_start == ' ') p_start++;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
111 str = p_start;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
112 while (*p_end == ' ') p_end--;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
113 p_end++;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
114 *p_end = '\0';
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
115 len = (int) (p_end - str) + 1;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
116 memmove(*param, str, len);
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
117 }
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
118 }
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
119
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
120 // Read config file and write values to corresponding key name files
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
121 static void read_config_file(char *fname)
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
122 {
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
123 char *line, *name = NULL, *value = NULL;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
124 int fd = xopen(fname, O_RDONLY);
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
125
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
126 for (; (line = get_line(fd)); free(line), name = NULL, value = NULL) {
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
127 char *ptr = line;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
128
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
129 while (*ptr == ' ' || *ptr == '\t') ptr++;
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
130 if (*ptr != '#' && *ptr != ';' && *ptr !='\n' && *ptr) {
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
131 parse_key_name_value(ptr, &name, &value);
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
132 trim_spaces(&name);
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
133 trim_spaces(&value);
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
134 if (name && value) write_to_file(PROC_SYS_DIR, name, value);
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
135 }
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
136 }
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
137 xclose(fd);
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
138 }
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
139
1281
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
140 // Open file for each and every key name and read file contents
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
141 void read_key_values(char *fpath)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
142 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
143 char *key_value, *fdata, *key_name, *tmp = xstrdup(fpath);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
144 int offset = 0;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
145
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
146 key_name = (tmp + strlen(PROC_SYS_DIR) + 1);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
147 replace_char(key_name, '/', '.');
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
148 if (!(fdata = readfile(fpath, NULL, 0))) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
149 handle_file_error(key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
150 free(tmp);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
151 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
152 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
153 if (toys.optflags & FLAG_N) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
154 xprintf("%s\n", key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
155 free(tmp);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
156 free(fdata);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
157 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
158 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
159 for (; (key_value = get_key_value(fdata, &offset)); free(key_value)) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
160 if (!(toys.optflags & FLAG_q)) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
161 if (!(toys.optflags & FLAG_n)) xprintf("%s = ", key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
162 xprintf("%s\n", key_value);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
163 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
164 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
165 free(tmp);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
166 free(fdata);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
167 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
168
1282
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
169 static int do_flag_a(struct dirtree *dt)
1281
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
170 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
171 char *fpath;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
172
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
173 if (!dirtree_notdotdot(dt)) return 0; // Skip . and ..
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
174 if (S_ISDIR(dt->st.st_mode)) return DIRTREE_RECURSE;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
175 if ((fpath = dirtree_path(dt, 0))) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
176 read_key_values(fpath);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
177 free(fpath);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
178 }
1282
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
179
1281
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
180 return 0;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
181 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
182
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
183 void sysctl_main()
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
184 {
1282
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
185 char *name = 0, *value = 0, **args = 0;
1281
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
186
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
187 if (toys.optflags & FLAG_a) {
1282
c99912c6bc09 First cleanup pass on sysctl.
Rob Landley <rob@landley.net>
parents: 1281
diff changeset
188 dirtree_read(PROC_SYS_DIR, do_flag_a);
1281
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
189 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
190 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
191 if (toys.optflags & FLAG_p) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
192 if (*toys.optargs) read_config_file(*toys.optargs);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
193 else read_config_file("/etc/sysctl.conf");
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
194 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
195 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
196 if (toys.optflags & FLAG_w) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
197 for (args = toys.optargs; *args; args++, name = NULL, value = NULL) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
198 parse_key_name_value(*args, &name, &value);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
199 if (name && value) write_to_file(PROC_SYS_DIR, name, value);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
200 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
201 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
202 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
203 for (args = toys.optargs; *args; args++) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
204 replace_char(*args, '.', '/');
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
205 sprintf(toybuf, "%s/%s", PROC_SYS_DIR, *args);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
206 read_key_values(toybuf);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
207 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
208 }