annotate toys/pending/sysctl.c @ 1281:6b78ac1d7d58 draft

Add sysctl by Bilal Qureshi.
author Rob Landley <rob@landley.net>
date Mon, 12 May 2014 06:22:10 -0500
parents
children c99912c6bc09
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
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
16 -a, A Show all values
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
17 -e Don't warn about unknown keys
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 -N Show only key names
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 -n Show only key values
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 -p FILE Set values from FILE (default /etc/sysctl.conf)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 -q Set values silently
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 -w Set values
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 */
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 #define FOR_sysctl
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 #include "toys.h"
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
26
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 #define PROC_SYS_DIR "/proc/sys"
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
28 #define MAX_BYTES_LINE 1024
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
29
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 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
31 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
32 char *name, *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 if (!(name = strchr(param, '='))) goto show_error_msg;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 value = name;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 value++;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 if (!(*value)) goto show_error_msg;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 *name = '\0';
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 *key_name = param;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 *key_value = value;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
41 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
42 show_error_msg:
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 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
44 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
45
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 static void replace_char(char *str, char old, char new)
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 char *tmp = str;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
49
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 for (; *tmp; tmp++)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
51 if (*tmp == old) *tmp = new;
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
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 static void handle_file_error(char *key_name)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 replace_char(key_name, '/', '.');
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 if (errno == ENOENT) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 if (!(toys.optflags & FLAG_e))
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 error_msg("error: '%s' is an unknown key", key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 else toys.exitval = 1;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
61 } 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
62 "setting" : "reading", key_name);
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
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
65 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
66 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
67 int fd;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
68
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 replace_char(key_name, '.', '/');
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
70 sprintf(toybuf, "%s/%s", fpath, key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
71 if ((fd = open(toybuf, O_WRONLY)) < 0) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
72 handle_file_error(key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
73 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 xwrite(fd, key_value, strlen(key_value));
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 xclose(fd);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
77 if (!(toys.optflags & FLAG_q)) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 replace_char(key_name, '/', '.');
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
79 if (toys.optflags & FLAG_N) xprintf("%s\n", key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 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
81 else xprintf("%s = %s\n", key_name, key_value);
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
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
85 static char *get_key_value(char *buff, int *offset)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
86 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 char *line, *tmp = (char *) (buff + *offset);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 int index = 0, multiplier = 1;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
89
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 if (!(*tmp)) return NULL;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 line = (char *) xmalloc(sizeof(char) * MAX_BYTES_LINE);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 for (; *tmp != '\n'; tmp++) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 line[index++] = *tmp;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 if (MAX_BYTES_LINE == index) { // buffer overflow
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 multiplier++;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 line = (char *) xrealloc(line, multiplier * MAX_BYTES_LINE);
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 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
99 line[index++] = '\0';
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 *offset += index;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 return line;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
102 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
103
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
104 // 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
105 void read_key_values(char *fpath)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
106 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
107 char *key_value, *fdata, *key_name, *tmp = xstrdup(fpath);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
108 int offset = 0;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
109
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
110 key_name = (tmp + strlen(PROC_SYS_DIR) + 1);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
111 replace_char(key_name, '/', '.');
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
112 if (!(fdata = readfile(fpath, NULL, 0))) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
113 handle_file_error(key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
114 free(tmp);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
115 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
116 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
117 if (toys.optflags & FLAG_N) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
118 xprintf("%s\n", key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
119 free(tmp);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
120 free(fdata);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
121 return;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
122 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
123 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
124 if (!(toys.optflags & FLAG_q)) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
125 if (!(toys.optflags & FLAG_n)) xprintf("%s = ", key_name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
126 xprintf("%s\n", key_value);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
127 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
128 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
129 free(tmp);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
130 free(fdata);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
131 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
132
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
133 static void trim_spaces(char **param)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
134 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
135 int len = 0;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
136 char *str = *param, *p_start = str, *p_end;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
137
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
138 if (p_start) { // start pointer to string
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
139 p_end = str + strlen(str) - 1; // end pointer to string
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
140 while (*p_start == ' ') p_start++;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
141 str = p_start;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
142 while (*p_end == ' ') p_end--;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
143 p_end++;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
144 *p_end = '\0';
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
145 len = (int) (p_end - str) + 1;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
146 memmove(*param, str, len);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
147 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
148 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
149
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
150 // Read config file and write values to there corresponding key name files
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
151 static void read_config_file(char *fname)
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 char *line, *name = NULL, *value = NULL;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
154 int fd = xopen(fname, O_RDONLY);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
155
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
156 for (; (line = get_line(fd)); free(line), name = NULL, value = NULL) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
157 char *ptr = line;
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 while (*ptr == ' ' || *ptr == '\t') ptr++;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
160 if (*ptr != '#' && *ptr != ';' && *ptr !='\n' && *ptr) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
161 parse_key_name_value(ptr, &name, &value);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
162 trim_spaces(&name);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
163 trim_spaces(&value);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
164 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
165 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
166 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
167 xclose(fd);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
168 }
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
169
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
170 static int do_process(struct dirtree *dt)
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
171 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
172 char *fpath;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
173
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
174 if (!dirtree_notdotdot(dt)) return 0; // Skip . and ..
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
175 if (S_ISDIR(dt->st.st_mode)) return DIRTREE_RECURSE;
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
176 if ((fpath = dirtree_path(dt, 0))) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
177 read_key_values(fpath);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
178 free(fpath);
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
179 }
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 {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
185 char *name = NULL, *value = NULL, **args = NULL;
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) {
6b78ac1d7d58 Add sysctl by Bilal Qureshi.
Rob Landley <rob@landley.net>
parents:
diff changeset
188 dirtree_read(PROC_SYS_DIR, do_process);
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 }