libevent: updated to 2.0.22
[tomato.git] / release / src-rt-6.x.4708 / router / rc / rc.c
blobd54e54e57697943cefae1ff1a22b71ad828d5ed9
1 /*
3 Tomato Firmware
4 Copyright (C) 2006-2009 Jonathan Zarate
6 */
8 #include "rc.h"
11 #ifdef DEBUG_RCTEST
12 // used for various testing
13 static int rctest_main(int argc, char *argv[])
15 if (argc < 2) {
16 printf("test what?\n");
18 else {
19 printf("%s\n", argv[1]);
21 if (strcmp(argv[1], "foo") == 0) {
23 else if (strcmp(argv[1], "qos") == 0) {
24 start_qos();
27 #ifdef TCONFIG_FANCTRL
28 else if (strcmp(argv[1], "phy_tempsense") == 0) {
29 stop_phy_tempsense();
30 start_phy_tempsense();
32 #endif
34 #ifdef TCONFIG_IPV6
35 else if (strcmp(argv[1], "6rd") == 0) {
36 stop_6rd_tunnel();
37 start_6rd_tunnel();
39 #endif
40 #ifdef DEBUG_IPTFILE
41 else if (strcmp(argv[1], "iptfile") == 0) {
42 create_test_iptfile();
44 #endif
45 else {
46 printf("what?\n");
49 return 0;
51 #endif
54 static int hotplug_main(int argc, char *argv[])
56 if (argc >= 2) {
57 if (strcmp(argv[1], "net") == 0) {
58 hotplug_net();
60 #ifdef TCONFIG_USB
61 // !!TB - USB Support
62 else if (strcmp(argv[1], "usb") == 0) {
63 hotplug_usb();
65 #ifdef LINUX26
66 else if (strcmp(argv[1], "block") == 0) {
67 hotplug_usb();
69 #endif
70 #endif
72 return 0;
75 static int rc_main(int argc, char *argv[])
77 if (argc < 2) return 0;
78 if (strcmp(argv[1], "start") == 0) return kill(1, SIGUSR2);
79 if (strcmp(argv[1], "stop") == 0) return kill(1, SIGINT);
80 if (strcmp(argv[1], "restart") == 0) return kill(1, SIGHUP);
81 return 0;
86 typedef struct {
87 const char *name;
88 int (*main)(int argc, char *argv[]);
89 } applets_t;
91 static const applets_t applets[] = {
92 { "preinit", init_main },
93 { "init", init_main },
94 { "console", console_main },
95 { "rc", rc_main },
96 { "ip-up", ipup_main },
97 { "ip-down", ipdown_main },
98 /* KDB - these functions do nothing why are they here?
99 #ifdef TCONFIG_IPV6
100 { "ipv6-up", ip6up_main },
101 { "ipv6-down", ip6down_main },
102 #endif
104 { "ppp_event", pppevent_main },
105 { "hotplug", hotplug_main },
106 { "redial", redial_main },
107 { "listen", listen_main },
108 { "service", service_main },
109 { "sched", sched_main },
110 #ifdef TCONFIG_BCMARM
111 { "mtd-write", mtd_write_main_old },
112 { "mtd-erase", mtd_unlock_erase_main_old },
113 { "mtd-unlock", mtd_unlock_erase_main_old },
114 #else
115 { "mtd-write", mtd_write_main },
116 { "mtd-erase", mtd_unlock_erase_main },
117 { "mtd-unlock", mtd_unlock_erase_main },
118 #endif
119 { "buttons", buttons_main },
120 { "blink", blink_main },
121 #ifdef CONFIG_BCMWL6
122 { "blink_5g", blink_5g_main },
123 #endif
124 #ifdef TCONFIG_FANCTRL
125 { "phy_tempsense", phy_tempsense_main },
126 #endif
127 { "rcheck", rcheck_main },
128 { "dhcpc-event", dhcpc_event_main },
129 { "dhcpc-release", dhcpc_release_main },
130 { "dhcpc-renew", dhcpc_renew_main },
131 #ifdef TCONFIG_IPV6
132 { "dhcp6c-state", dhcp6c_state_main },
133 #endif
134 { "radio", radio_main },
135 { "led", led_main },
136 { "halt", reboothalt_main },
137 { "reboot", reboothalt_main },
138 { "gpio", gpio_main },
139 { "wldist", wldist_main },
140 #ifdef TCONFIG_CIFS
141 { "mount-cifs", mount_cifs_main },
142 #endif
143 #ifdef TCONFIG_DDNS
144 { "ddns-update", ddns_update_main },
145 #endif
146 #ifdef DEBUG_RCTEST
147 { "rctest", rctest_main },
148 #endif
149 {NULL, NULL}
152 #ifdef TCONFIG_BCMARM
153 void erase_nvram(void)
155 eval("mtd-erase2", "nvram");
157 #endif
159 int main(int argc, char **argv)
161 char *base;
162 int f;
165 Make sure std* are valid since several functions attempt to close these
166 handles. If nvram_*() runs first, nvram=0, nvram gets closed. - zzz
168 if ((f = open("/dev/null", O_RDWR)) < 3) {
169 dup(f);
170 dup(f);
172 else {
173 close(f);
176 base = strrchr(argv[0], '/');
177 base = base ? base + 1 : argv[0];
179 #if 1
180 if (strcmp(base, "rc") == 0) {
181 if (argc < 2) return 1;
182 if (strcmp(argv[1], "start") == 0) return kill(1, SIGUSR2);
183 if (strcmp(argv[1], "stop") == 0) return kill(1, SIGINT);
184 if (strcmp(argv[1], "restart") == 0) return kill(1, SIGHUP);
185 ++argv;
186 --argc;
187 base = argv[0];
189 #endif
193 #if defined(DEBUG_NOISY)
194 if (nvram_match("debug_logrc", "1")) {
195 int i;
197 cprintf("[rc %d] ", getpid());
198 for (i = 0; i < argc; ++i) {
199 cprintf("%s ", argv[i]);
201 cprintf("\n");
204 #endif
206 #if defined(DEBUG_NOISY)
207 if (nvram_match("debug_ovrc", "1")) {
208 char tmp[256];
209 char *a[32];
211 realpath(argv[0], tmp);
212 if ((strncmp(tmp, "/tmp/", 5) != 0) && (argc < 32)) {
213 sprintf(tmp, "%s%s", "/tmp/", base);
214 if (f_exists(tmp)) {
215 cprintf("[rc] override: %s\n", tmp);
216 memcpy(a, argv, argc * sizeof(a[0]));
217 a[argc] = 0;
218 a[0] = tmp;
219 execvp(tmp, a);
220 exit(0);
224 #endif
226 const applets_t *a;
227 for (a = applets; a->name; ++a) {
228 if (strcmp(base, a->name) == 0) {
229 openlog(base, LOG_PID, LOG_USER);
230 return a->main(argc, argv);
234 #ifdef TCONFIG_BCMARM
235 if (!strcmp(base, "nvram_erase")){
236 erase_nvram();
237 return 0;
239 /* mtd-erase2 [device] */
240 else if (!strcmp(base, "mtd-erase2")) {
241 if (argv[1] && ((!strcmp(argv[1], "boot")) ||
242 (!strcmp(argv[1], "linux")) ||
243 (!strcmp(argv[1], "linux2")) ||
244 (!strcmp(argv[1], "rootfs")) ||
245 (!strcmp(argv[1], "rootfs2")) ||
246 (!strcmp(argv[1], "nvram")))) {
248 return mtd_erase(argv[1]);
249 } else {
250 fprintf(stderr, "usage: mtd-erase2 [device]\n");
251 return EINVAL;
254 /* mtd-write2 [path] [device] */
255 else if (!strcmp(base, "mtd-write2")) {
256 if (argc >= 3)
257 return mtd_write(argv[1], argv[2]);
258 else {
259 fprintf(stderr, "usage: mtd-write2 [path] [device]\n");
260 return EINVAL;
263 #endif
265 printf("Unknown applet: %s\n", base);
266 return 0;