Merge branch 'tomato-ND-fixes' into tomato-ND-USBmod
[tomato.git] / release / src / router / rc / services.c
blob00006e61fdd9aad296209b6f1faefa0338d034cf
1 /*
3 Copyright 2003, CyberTAN Inc. All Rights Reserved
5 This is UNPUBLISHED PROPRIETARY SOURCE CODE of CyberTAN Inc.
6 the contents of this file may not be disclosed to third parties,
7 copied or duplicated in any form without the prior written
8 permission of CyberTAN Inc.
10 This software should be used as a reference only, and it not
11 intended for production use!
13 THIS SOFTWARE IS OFFERED "AS IS", AND CYBERTAN GRANTS NO WARRANTIES OF ANY
14 KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. CYBERTAN
15 SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
16 FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE
21 Copyright 2005, Broadcom Corporation
22 All Rights Reserved.
24 THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
25 KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
26 SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
27 FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
32 Modified for Tomato Firmware
33 Portions, Copyright (C) 2006-2009 Jonathan Zarate
36 #include "rc.h"
38 #include <arpa/inet.h>
39 #include <time.h>
40 #include <sys/time.h>
41 #include <errno.h>
43 // !!TB
44 #include <sys/mount.h>
45 #include <mntent.h>
46 #include <dirent.h>
48 #define IFUP (IFF_UP | IFF_RUNNING | IFF_BROADCAST | IFF_MULTICAST)
49 #define sin_addr(s) (((struct sockaddr_in *)(s))->sin_addr)
51 // -----------------------------------------------------------------------------
53 static const char dmhosts[] = "/etc/hosts.dnsmasq";
54 static const char dmresolv[] = "/etc/resolv.dnsmasq";
55 static const char dmpid[] = "/var/run/dnsmasq.pid";
57 static pid_t pid_dnsmasq = -1;
60 void start_dnsmasq()
62 FILE *f;
63 const char *nv;
64 char buf[512];
65 char lan[24];
66 const char *router_ip;
67 const char *lan_ifname;
68 char sdhcp_lease[32];
69 char *e;
70 int n;
71 char *mac, *ip, *name;
72 char *p;
73 int ipn;
74 char ipbuf[32];
75 FILE *hf;
76 int dhcp_start;
77 int dhcp_count;
78 int dhcp_lease;
79 int do_dhcpd;
80 int do_dns;
82 TRACE_PT("begin\n");
84 if (getpid() != 1) {
85 start_service("dnsmasq");
86 return;
89 stop_dnsmasq();
91 if (nvram_match("wl_mode", "wet")) return;
92 if ((f = fopen("/etc/dnsmasq.conf", "w")) == NULL) return;
94 lan_ifname = nvram_safe_get("lan_ifname");
95 router_ip = nvram_safe_get("lan_ipaddr");
96 strlcpy(lan, router_ip, sizeof(lan));
97 if ((p = strrchr(lan, '.')) != NULL) *(p + 1) = 0;
99 fprintf(f,
100 "pid-file=%s\n"
101 "interface=%s\n",
102 dmpid, lan_ifname);
103 if (((nv = nvram_get("wan_domain")) != NULL) || ((nv = nvram_get("wan_get_domain")) != NULL)) {
104 if (*nv) fprintf(f, "domain=%s\n", nv);
107 // dns
108 const dns_list_t *dns = get_dns(); // this always points to a static buffer
110 if (((nv = nvram_get("dns_minport")) != NULL) && (*nv)) n = atoi(nv);
111 else n = 4096;
112 fprintf(f,
113 "resolv-file=%s\n" // the real stuff is here
114 "addn-hosts=%s\n" // "
115 "expand-hosts\n" // expand hostnames in hosts file
116 "min-port=%u\n", // min port used for random src port
117 dmresolv, dmhosts, n);
118 do_dns = nvram_match("dhcpd_dmdns", "1");
120 for (n = 0 ; n < dns->count; ++n) {
121 if (dns->dns[n].port != 53) {
122 fprintf(f, "server=%s#%u\n", inet_ntoa(dns->dns[n].addr), dns->dns[n].port);
127 // dhcp
128 do_dhcpd = nvram_match("lan_proto", "dhcp");
129 if (do_dhcpd) {
130 dhcp_lease = nvram_get_int("dhcp_lease");
131 if (dhcp_lease <= 0) dhcp_lease = 1440;
133 if ((e = nvram_get("dhcpd_slt")) != NULL) n = atoi(e); else n = 0;
134 if (n < 0) strcpy(sdhcp_lease, "infinite");
135 else sprintf(sdhcp_lease, "%dm", (n > 0) ? n : dhcp_lease);
137 if (!do_dns) {
138 // if not using dnsmasq for dns
140 if ((dns->count == 0) && (nvram_get_int("dhcpd_llndns"))) {
141 // no DNS might be temporary. use a low lease time to force clients to update.
142 dhcp_lease = 2;
143 strcpy(sdhcp_lease, "2m");
144 do_dns = 1;
146 else {
147 // pass the dns directly
148 buf[0] = 0;
149 for (n = 0 ; n < dns->count; ++n) {
150 if (dns->dns[n].port == 53) { // check: option 6 doesn't seem to support other ports
151 sprintf(buf + strlen(buf), ",%s", inet_ntoa(dns->dns[n].addr));
154 fprintf(f, "dhcp-option=6%s\n", buf);
158 if ((p = nvram_get("dhcpd_startip")) && (*p) && (e = nvram_get("dhcpd_endip")) && (*e)) {
159 fprintf(f, "dhcp-range=%s,%s,%s,%dm\n", p, e, nvram_safe_get("lan_netmask"), dhcp_lease);
161 else {
162 // for compatibility
163 dhcp_start = nvram_get_int("dhcp_start");
164 dhcp_count = nvram_get_int("dhcp_num");
165 fprintf(f, "dhcp-range=%s%d,%s%d,%s,%dm\n",
166 lan, dhcp_start, lan, dhcp_start + dhcp_count - 1, nvram_safe_get("lan_netmask"), dhcp_lease);
169 nv = router_ip;
170 if ((nvram_get_int("dhcpd_gwmode") == 1) && (get_wan_proto() == WP_DISABLED)) {
171 p = nvram_safe_get("lan_gateway");
172 if ((*p) && (strcmp(p, "0.0.0.0") != 0)) nv = p;
175 n = nvram_get_int("dhcpd_lmax");
176 fprintf(f,
177 "dhcp-option=3,%s\n" // gateway
178 "dhcp-lease-max=%d\n",
180 (n > 0) ? n : 255);
182 if (nvram_get_int("dhcpd_auth") >= 0) {
183 fprintf(f, "dhcp-authoritative\n");
186 if (((nv = nvram_get("wan_wins")) != NULL) && (*nv) && (strcmp(nv, "0.0.0.0") != 0)) {
187 fprintf(f, "dhcp-option=44,%s\n", nv);
189 #ifdef TCONFIG_SAMBASRV
190 else if (nvram_get_int("smbd_enable") && nvram_invmatch("lan_hostname", "") && nvram_get_int("smbd_wins")) {
191 if ((nv == NULL) || (*nv == 0) || (strcmp(nv, "0.0.0.0") == 0)) {
192 // Samba will serve as a WINS server
193 fprintf(f, "dhcp-option=44,0.0.0.0\n");
196 #endif
198 else {
199 fprintf(f, "no-dhcp-interface=%s\n", lan_ifname);
202 // write static lease entries & create hosts file
204 if ((hf = fopen(dmhosts, "w")) != NULL) {
205 if (((nv = nvram_get("wan_hostname")) != NULL) && (*nv))
206 fprintf(hf, "%s %s\n", router_ip, nv);
207 #ifdef TCONFIG_SAMBASRV
208 else if (((nv = nvram_get("lan_hostname")) != NULL) && (*nv))
209 fprintf(hf, "%s %s\n", router_ip, nv);
210 #endif
213 // 00:aa:bb:cc:dd:ee<123<xxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 53 w/ delim
214 // 00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 85 w/ delim
215 // 00:aa:bb:cc:dd:ee,00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 106 w/ delim
216 p = nvram_safe_get("dhcpd_static");
217 while ((e = strchr(p, '>')) != NULL) {
218 n = (e - p);
219 if (n > 105) {
220 p = e + 1;
221 continue;
224 strncpy(buf, p, n);
225 buf[n] = 0;
226 p = e + 1;
228 if ((e = strchr(buf, '<')) == NULL) continue;
229 *e = 0;
230 mac = buf;
232 ip = e + 1;
233 if ((e = strchr(ip, '<')) == NULL) continue;
234 *e = 0;
235 if (strchr(ip, '.') == NULL) {
236 ipn = atoi(ip);
237 if ((ipn <= 0) || (ipn > 255)) continue;
238 sprintf(ipbuf, "%s%d", lan, ipn);
239 ip = ipbuf;
241 else {
242 if (inet_addr(ip) == INADDR_NONE) continue;
245 name = e + 1;
247 if ((hf) && (*name != 0)) {
248 fprintf(hf, "%s %s\n", ip, name);
251 if ((do_dhcpd) && (*mac != 0) && (strcmp(mac, "00:00:00:00:00:00") != 0)) {
252 fprintf(f, "dhcp-host=%s,%s,%s\n", mac, ip, sdhcp_lease);
256 if (hf) fclose(hf);
260 #ifdef TCONFIG_OPENVPN
261 write_vpn_dnsmasq_config(f);
262 #endif
264 fprintf(f, "%s\n\n", nvram_safe_get("dnsmasq_custom"));
266 fappend(f, "/etc/dnsmasq.custom");
270 fclose(f);
272 if (do_dns) {
273 unlink("/etc/resolv.conf");
274 symlink("/rom/etc/resolv.conf", "/etc/resolv.conf"); // nameserver 127.0.0.1
277 TRACE_PT("run dnsmasq\n");
279 eval("dnsmasq");
281 if (!nvram_contains_word("debug_norestart", "dnsmasq")) {
282 f_read_string(dmpid, buf, sizeof(buf));
283 pid_dnsmasq = atol(buf);
286 TRACE_PT("end\n");
289 void stop_dnsmasq(void)
291 TRACE_PT("begin\n");
293 if (getpid() != 1) {
294 stop_service("dnsmasq");
295 return;
298 pid_dnsmasq = -1;
300 unlink("/etc/resolv.conf");
301 symlink(dmresolv, "/etc/resolv.conf");
303 killall_tk("dnsmasq");
305 TRACE_PT("end\n");
308 void clear_resolv(void)
310 f_write(dmresolv, NULL, 0, 0, 0); // blank
313 void dns_to_resolv(void)
315 FILE *f;
316 const dns_list_t *dns;
317 int i;
318 mode_t m;
320 m = umask(022); // 077 from pppoecd
321 if ((f = fopen(dmresolv, "w")) != NULL) {
322 // Check for VPN DNS entries
323 if (!write_vpn_resolv(f)) {
324 dns = get_dns(); // static buffer
325 if (dns->count == 0) {
326 // Put a pseudo DNS IP to trigger Connect On Demand
327 if ((nvram_match("ppp_demand", "1")) &&
328 (nvram_match("wan_proto", "pppoe") || nvram_match("wan_proto", "pptp") || nvram_match("wan_proto", "l2tp"))) {
329 fprintf(f, "nameserver 1.1.1.1\n");
332 else {
333 for (i = 0; i < dns->count; i++) {
334 if (dns->dns[i].port == 53) { // resolv.conf doesn't allow for an alternate port
335 fprintf(f, "nameserver %s\n", inet_ntoa(dns->dns[i].addr));
340 fclose(f);
342 umask(m);
345 // -----------------------------------------------------------------------------
347 void start_httpd(void)
349 chdir("/www");
350 if (!nvram_match("http_enable", "0")) {
351 xstart("httpd");
353 if (!nvram_match("https_enable", "0")) {
354 xstart("httpd", "-s");
356 chdir("/");
359 void stop_httpd(void)
361 killall_tk("httpd");
364 // -----------------------------------------------------------------------------
366 void start_upnp(void)
368 if (get_wan_proto() == WP_DISABLED) return;
370 int enable;
371 FILE *f;
372 int upnp_port;
374 if (((enable = nvram_get_int("upnp_enable")) & 3) != 0) {
375 mkdir("/etc/upnp", 0777);
376 if (f_exists("/etc/upnp/config.alt")) {
377 xstart("miniupnpd", "-f", "/etc/upnp/config.alt");
379 else {
380 if ((f = fopen("/etc/upnp/config", "w")) != NULL) {
381 upnp_port = nvram_get_int("upnp_port");
382 if ((upnp_port < 0) || (upnp_port >= 0xFFFF)) upnp_port = 0;
384 char *lanip = nvram_safe_get("lan_ipaddr");
385 char *lanmask = nvram_safe_get("lan_netmask");
387 fprintf(f,
388 "ext_ifname=%s\n"
389 "listening_ip=%s/%s\n"
390 "port=%d\n"
391 "enable_upnp=%s\n"
392 "enable_natpmp=%s\n"
393 "secure_mode=%s\n"
394 "upnp_forward_chain=upnp\n"
395 "upnp_nat_chain=upnp\n"
396 "notify_interval=%d\n"
397 "system_uptime=yes\n"
398 "\n"
400 nvram_safe_get("wan_iface"),
401 lanip, lanmask,
402 upnp_port,
403 (enable & 1) ? "yes" : "no", // upnp enable
404 (enable & 2) ? "yes" : "no", // natpmp enable
405 nvram_get_int("upnp_secure") ? "yes" : "no", // secure_mode (only forward to self)
406 nvram_get_int("upnp_ssdp_interval")
409 if (nvram_get_int("upnp_clean")) {
410 int interval = nvram_get_int("upnp_clean_interval");
411 if (interval < 60) interval = 60;
412 fprintf(f,
413 "clean_ruleset_interval=%d\n"
414 "clean_ruleset_threshold=%d\n",
415 interval,
416 nvram_get_int("upnp_clean_threshold")
419 else
420 fprintf(f,"clean_ruleset_interval=0\n");
422 if (nvram_match("upnp_mnp", "1")) {
423 int https = nvram_get_int("https_enable");
424 fprintf(f, "presentation_url=http%s://%s:%s/forward-upnp.asp\n",
425 https ? "s" : "", lanip,
426 nvram_safe_get(https ? "https_lanport" : "http_lanport"));
428 else {
429 // Empty parameters are not included into XML service description
430 fprintf(f, "presentation_url=\n");
433 char uuid[45];
434 f_read_string("/proc/sys/kernel/random/uuid", uuid, sizeof(uuid));
435 fprintf(f, "uuid=%s\n", uuid);
437 int ports[4];
438 if ((ports[0] = nvram_get_int("upnp_min_port_int")) > 0 &&
439 (ports[1] = nvram_get_int("upnp_max_port_int")) > 0 &&
440 (ports[2] = nvram_get_int("upnp_min_port_ext")) > 0 &&
441 (ports[3] = nvram_get_int("upnp_max_port_ext")) > 0) {
442 fprintf(f,
443 "allow %d-%d %s/%s %d-%d\n",
444 ports[0], ports[1],
445 lanip, lanmask,
446 ports[2], ports[3]
449 else {
450 // by default allow only redirection of ports above 1024
451 fprintf(f, "allow 1024-65535 %s/%s 1024-65535\n", lanip, lanmask);
454 fappend(f, "/etc/upnp/config.custom");
455 fprintf(f, "\ndeny 0-65535 0.0.0.0/0 0-65535\n");
456 fclose(f);
458 xstart("miniupnpd", "-f", "/etc/upnp/config");
464 void stop_upnp(void)
466 killall_tk("miniupnpd");
469 // -----------------------------------------------------------------------------
471 static pid_t pid_crond = -1;
473 void start_cron(void)
475 char *argv[] = { "crond", "-l", "9", NULL };
477 stop_cron();
479 if (nvram_contains_word("log_events", "crond")) argv[1] = NULL;
480 _eval(argv, NULL, 0, NULL);
481 if (!nvram_contains_word("debug_norestart", "crond")) {
482 pid_crond = -2;
487 void stop_cron(void)
489 pid_crond = -1;
490 killall_tk("crond");
493 // -----------------------------------------------------------------------------
494 #ifdef LINUX26
496 static pid_t pid_hotplug2 = -1;
498 void start_hotplug2()
500 stop_hotplug2();
502 f_write_string("/proc/sys/kernel/hotplug", "", FW_NEWLINE, 0);
503 xstart("hotplug2", "--persistent", "--no-coldplug");
504 sleep(1);
506 if (!nvram_contains_word("debug_norestart", "hotplug2")) {
507 pid_hotplug2 = -2;
511 void stop_hotplug2(void)
513 pid_hotplug2 = -1;
514 killall_tk("hotplug2");
517 #endif /* LINUX26 */
518 // -----------------------------------------------------------------------------
520 // Written by Sparq in 2002/07/16
521 void start_zebra(void)
523 #ifdef TCONFIG_ZEBRA
524 FILE *fp;
526 char *lan_tx = nvram_safe_get("dr_lan_tx");
527 char *lan_rx = nvram_safe_get("dr_lan_rx");
528 char *wan_tx = nvram_safe_get("dr_wan_tx");
529 char *wan_rx = nvram_safe_get("dr_wan_rx");
531 if ((*lan_tx == '0') && (*lan_rx == '0') && (*wan_tx == '0') && (*wan_rx == '0')) {
532 return;
535 // empty
536 if ((fp = fopen("/etc/zebra.conf", "w")) != NULL) {
537 fclose(fp);
541 if ((fp = fopen("/etc/ripd.conf", "w")) != NULL) {
542 char *lan_ifname = nvram_safe_get("lan_ifname");
543 char *wan_ifname = nvram_safe_get("wan_ifname");
545 fprintf(fp, "router rip\n");
546 fprintf(fp, "network %s\n", lan_ifname);
547 fprintf(fp, "network %s\n", wan_ifname);
548 fprintf(fp, "redistribute connected\n");
549 //fprintf(fp, "redistribute static\n");
551 // 43011: modify by zg 2006.10.18 for cdrouter3.3 item 173(cdrouter_rip_30) bug
552 // fprintf(fp, "redistribute kernel\n"); // 1.11: removed, redistributes indirect -- zzz
554 fprintf(fp, "interface %s\n", lan_ifname);
555 if (*lan_tx != '0') fprintf(fp, "ip rip send version %s\n", lan_tx);
556 if (*lan_rx != '0') fprintf(fp, "ip rip receive version %s\n", lan_rx);
558 fprintf(fp, "interface %s\n", wan_ifname);
559 if (*wan_tx != '0') fprintf(fp, "ip rip send version %s\n", wan_tx);
560 if (*wan_rx != '0') fprintf(fp, "ip rip receive version %s\n", wan_rx);
562 fprintf(fp, "router rip\n");
563 if (*lan_tx == '0') fprintf(fp, "distribute-list private out %s\n", lan_ifname);
564 if (*lan_rx == '0') fprintf(fp, "distribute-list private in %s\n", lan_ifname);
565 if (*wan_tx == '0') fprintf(fp, "distribute-list private out %s\n", wan_ifname);
566 if (*wan_rx == '0') fprintf(fp, "distribute-list private in %s\n", wan_ifname);
567 fprintf(fp, "access-list private deny any\n");
569 //fprintf(fp, "debug rip events\n");
570 //fprintf(fp, "log file /etc/ripd.log\n");
571 fclose(fp);
574 xstart("zebra", "-d");
575 xstart("ripd", "-d");
576 #endif
579 void stop_zebra(void)
581 #ifdef TCONFIG_ZEBRA
582 killall("zebra", SIGTERM);
583 killall("ripd", SIGTERM);
585 unlink("/etc/zebra.conf");
586 unlink("/etc/ripd.conf");
587 #endif
590 // -----------------------------------------------------------------------------
592 void start_syslog(void)
594 #if 1
595 char *argv[12];
596 int argc;
597 char *nv;
598 char rem[256];
599 int n;
600 char s[64];
602 argv[0] = "syslogd";
603 argc = 1;
605 if (nvram_match("log_remote", "1")) {
606 nv = nvram_safe_get("log_remoteip");
607 if (*nv) {
608 snprintf(rem, sizeof(rem), "%s:%s", nv, nvram_safe_get("log_remoteport"));
609 argv[argc++] = "-R";
610 argv[argc++] = rem;
614 if (nvram_match("log_file", "1")) {
615 argv[argc++] = "-L";
616 argv[argc++] = "-s";
617 argv[argc++] = "50";
620 if (argc > 1) {
621 argv[argc] = NULL;
622 _eval(argv, NULL, 0, NULL);
623 //usleep(500000);
624 sleep(1);
626 argv[0] = "klogd";
627 argv[1] = NULL;
628 _eval(argv, NULL, 0, NULL);
629 usleep(500000);
631 // used to be available in syslogd -m
632 n = nvram_get_int("log_mark");
633 if (n > 0) {
634 sprintf(s, "cru a syslogdmark \"%s %s * * * logger -p syslog.info -- -- MARK --\"",
635 (n < 60) ? "*/30" : "0", (n < 120) ? "*" : "*/2");
636 system(s);
638 else {
639 system("cru d syslogdmark");
643 #else
644 char *argv[12];
645 int argc;
646 char *nv;
647 char rem[256];
649 argv[0] = "syslogd";
650 argv[1] = "-m";
651 argv[2] = nvram_get("log_mark");
652 argc = 3;
654 if (nvram_match("log_remote", "1")) {
655 nv = nvram_safe_get("log_remoteip");
656 if (*nv) {
657 snprintf(rem, sizeof(rem), "%s:%s", nv, nvram_safe_get("log_remoteport"));
658 argv[argc++] = "-R";
659 argv[argc++] = rem;
663 if (nvram_match("log_file", "1")) {
664 argv[argc++] = "-L";
665 argv[argc++] = "-s";
666 argv[argc++] = "50";
669 if (argc > 3) {
670 argv[argc] = NULL;
671 _eval(argv, NULL, 0, NULL);
672 usleep(500000);
674 argv[0] = "klogd";
675 argv[1] = NULL;
676 _eval(argv, NULL, 0, NULL);
677 usleep(500000);
679 #endif
682 void stop_syslog(void)
684 killall("klogd", SIGTERM);
685 killall("syslogd", SIGTERM);
688 // -----------------------------------------------------------------------------
690 static pid_t pid_igmp = -1;
692 void start_igmp_proxy(void)
694 FILE *fp;
695 char *p;
697 pid_igmp = -1;
698 if (nvram_match("multicast_pass", "1")) {
699 switch (get_wan_proto()) {
700 case WP_DISABLED:
701 return;
702 case WP_PPPOE:
703 case WP_PPTP:
704 case WP_L2TP:
705 p = "wan_iface";
706 break;
707 default:
708 p = "wan_ifname";
709 break;
712 if (f_exists("/etc/igmp.alt")) {
713 xstart("igmpproxy", "/etc/igmp.alt");
715 else if ((fp = fopen("/etc/igmp.conf", "w")) != NULL) {
716 fprintf(fp,
717 "quickleave\n"
718 "phyint %s upstream\n"
719 "\taltnet %s\n"
720 "phyint %s downstream ratelimit 0\n",
721 nvram_safe_get(p),
722 nvram_get("multicast_altnet") ? : "0.0.0.0/0",
723 nvram_safe_get("lan_ifname"));
724 fclose(fp);
725 xstart("igmpproxy", "/etc/igmp.conf");
727 else {
728 return;
730 if (!nvram_contains_word("debug_norestart", "igmprt")) {
731 pid_igmp = -2;
736 void stop_igmp_proxy(void)
738 pid_igmp = -1;
739 killall("igmpproxy", SIGTERM);
743 // -----------------------------------------------------------------------------
745 void set_tz(void)
747 f_write_string("/etc/TZ", nvram_safe_get("tm_tz"), FW_CREATE|FW_NEWLINE, 0644);
750 void start_ntpc(void)
752 set_tz();
754 stop_ntpc();
756 if (nvram_get_int("ntp_updates") >= 0) {
757 xstart("ntpsync", "--init");
761 void stop_ntpc(void)
763 killall("ntpsync", SIGTERM);
766 // -----------------------------------------------------------------------------
768 static void stop_rstats(void)
770 int n;
771 int pid;
773 n = 60;
774 while ((n-- > 0) && ((pid = pidof("rstats")) > 0)) {
775 if (kill(pid, SIGTERM) != 0) break;
776 sleep(1);
780 static void start_rstats(int new)
782 if (nvram_match("rstats_enable", "1")) {
783 stop_rstats();
784 if (new) xstart("rstats", "--new");
785 else xstart("rstats");
789 // -----------------------------------------------------------------------------
791 // !!TB - FTP Server
793 #ifdef TCONFIG_USB
795 * Return non-zero if we created the directory,
796 * and zero if it already existed.
798 int mkdir_if_none(char *dir)
800 DIR *dp;
801 if (!(dp=opendir(dir))) {
802 umask(0000);
803 mkdir(dir, 0777);
804 return 1;
806 closedir(dp);
807 return 0;
810 char *get_full_storage_path(char *val)
812 static char buf[128];
813 int len;
815 if (val[0] == '/')
816 len = sprintf(buf, "%s", val);
817 else
818 len = sprintf(buf, "%s/%s", MOUNT_ROOT, val);
820 if (len > 1 && buf[len - 1] == '/')
821 buf[len - 1] = 0;
823 return buf;
826 char *nvram_storage_path(char *var)
828 char *val = nvram_safe_get(var);
829 return get_full_storage_path(val);
831 #endif // TCONFIG_USB
833 #ifdef TCONFIG_FTP
835 char vsftpd_conf[] = "/etc/vsftpd.conf";
836 char vsftpd_users[] = "/etc/vsftpd.users";
837 char vsftpd_passwd[] = "/etc/vsftpd.passwd";
838 #endif
840 #ifdef TCONFIG_FTP
841 /* VSFTPD code mostly stolen from Oleg's ASUS Custom Firmware GPL sources */
842 static void do_start_stop_ftpd(int stop, int start)
844 if (stop) killall_tk("vsftpd");
846 char tmp[256];
847 FILE *fp, *f;
849 if (!start || !nvram_get_int("ftp_enable")) return;
851 mkdir_if_none(vsftpd_users);
852 mkdir_if_none("/var/run/vsftpd");
854 if ((fp = fopen(vsftpd_conf, "w")) == NULL)
855 return;
857 if (nvram_get_int("ftp_super"))
859 /* rights */
860 sprintf(tmp, "%s/%s", vsftpd_users, "admin");
861 if ((f = fopen(tmp, "w")))
863 fprintf(f,
864 "dirlist_enable=yes\n"
865 "write_enable=yes\n"
866 "download_enable=yes\n");
867 fclose(f);
871 #ifdef TCONFIG_SAMBASRV
872 if (nvram_match("smbd_cset", "utf8"))
873 fprintf(fp, "utf8=yes\n");
874 #endif
876 if (nvram_invmatch("ftp_anonymous", "0"))
878 fprintf(fp,
879 "anon_allow_writable_root=yes\n"
880 "anon_world_readable_only=no\n"
881 "anon_umask=022\n");
883 /* rights */
884 sprintf(tmp, "%s/ftp", vsftpd_users);
885 if ((f = fopen(tmp, "w")))
887 if (nvram_match("ftp_dirlist", "0"))
888 fprintf(f, "dirlist_enable=yes\n");
889 if (nvram_match("ftp_anonymous", "1") ||
890 nvram_match("ftp_anonymous", "3"))
891 fprintf(f, "write_enable=yes\n");
892 if (nvram_match("ftp_anonymous", "1") ||
893 nvram_match("ftp_anonymous", "2"))
894 fprintf(f, "download_enable=yes\n");
895 fclose(f);
897 if (nvram_match("ftp_anonymous", "1") ||
898 nvram_match("ftp_anonymous", "3"))
899 fprintf(fp,
900 "anon_upload_enable=yes\n"
901 "anon_mkdir_write_enable=yes\n"
902 "anon_other_write_enable=yes\n");
903 } else {
904 fprintf(fp, "anonymous_enable=no\n");
907 fprintf(fp,
908 "dirmessage_enable=yes\n"
909 "download_enable=no\n"
910 "dirlist_enable=no\n"
911 "hide_ids=yes\n"
912 "syslog_enable=yes\n"
913 "local_enable=yes\n"
914 "local_umask=022\n"
915 "chmod_enable=no\n"
916 "chroot_local_user=yes\n"
917 "check_shell=no\n"
918 "log_ftp_protocol=%s\n"
919 "user_config_dir=%s\n"
920 "passwd_file=%s\n"
921 "listen=yes\n"
922 "listen_port=%s\n"
923 "background=yes\n"
924 "isolate=no\n"
925 "max_clients=%d\n"
926 "max_per_ip=%d\n"
927 "idle_session_timeout=%s\n"
928 "use_sendfile=no\n"
929 "anon_max_rate=%d\n"
930 "local_max_rate=%d\n"
931 "%s\n",
932 nvram_get_int("log_ftp") ? "yes" : "no",
933 vsftpd_users, vsftpd_passwd,
934 nvram_get("ftp_port") ? : "21",
935 nvram_get_int("ftp_max"),
936 nvram_get_int("ftp_ipmax"),
937 nvram_get("ftp_staytimeout") ? : "300",
938 nvram_get_int("ftp_anonrate") * 1024,
939 nvram_get_int("ftp_rate") * 1024,
940 nvram_safe_get("ftp_custom"));
942 fclose(fp);
944 /* prepare passwd file and default users */
945 if ((fp = fopen(vsftpd_passwd, "w")) == NULL)
946 return;
948 fprintf(fp, /* anonymous, admin, nobody */
949 "ftp:x:0:0:ftp:%s:/sbin/nologin\n"
950 "%s:%s:0:0:root:/:/sbin/nologin\n"
951 "nobody:x:65534:65534:nobody:%s/:/sbin/nologin\n",
952 nvram_storage_path("ftp_anonroot"), "admin",
953 nvram_get_int("ftp_super") ? crypt(nvram_safe_get("http_passwd"), "$1$") : "x",
954 MOUNT_ROOT);
956 char *buf;
957 char *p, *q;
958 char *user, *pass, *rights;
960 if ((buf = strdup(nvram_safe_get("ftp_users"))) != NULL)
963 username<password<rights
964 rights:
965 Read/Write
966 Read Only
967 View Only
968 Private
970 p = buf;
971 while ((q = strsep(&p, ">")) != NULL) {
972 if (vstrsep(q, "<", &user, &pass, &rights) != 3) continue;
973 if (!user || !pass) continue;
975 /* directory */
976 if (strncmp(rights, "Private", 7) == 0)
978 sprintf(tmp, "%s/%s", nvram_storage_path("ftp_pvtroot"), user);
979 mkdir_if_none(tmp);
981 else
982 sprintf(tmp, "%s", nvram_storage_path("ftp_pubroot"));
984 fprintf(fp, "%s:%s:0:0:%s:%s:/sbin/nologin\n",
985 user, crypt(pass, "$1$"), user, tmp);
987 /* rights */
988 sprintf(tmp, "%s/%s", vsftpd_users, user);
989 if ((f = fopen(tmp, "w")))
991 tmp[0] = 0;
992 if (nvram_invmatch("ftp_dirlist", "1"))
993 strcat(tmp, "dirlist_enable=yes\n");
994 if (strstr(rights, "Read") || !strcmp(rights, "Private"))
995 strcat(tmp, "download_enable=yes\n");
996 if (strstr(rights, "Write") || !strncmp(rights, "Private", 7))
997 strcat(tmp, "write_enable=yes\n");
999 fputs(tmp, f);
1000 fclose(f);
1003 free(buf);
1006 fclose(fp);
1007 killall("vsftpd", SIGHUP);
1009 /* start vsftpd if it's not already running */
1010 if (pidof("vsftpd") <= 0)
1011 eval("vsftpd");
1013 #endif
1015 void start_ftpd(void)
1017 #ifdef TCONFIG_FTP
1018 int fd = file_lock("usb");
1019 do_start_stop_ftpd(0, 1);
1020 file_unlock(fd);
1021 #endif
1024 void stop_ftpd(void)
1026 #ifdef TCONFIG_FTP
1027 int fd = file_lock("usb");
1028 do_start_stop_ftpd(1, 0);
1029 unlink(vsftpd_passwd);
1030 unlink(vsftpd_conf);
1031 eval("rm", "-rf", vsftpd_users);
1032 file_unlock(fd);
1033 #endif
1036 // -----------------------------------------------------------------------------
1038 // !!TB - Samba
1040 #ifdef TCONFIG_SAMBASRV
1041 void kill_samba(int sig)
1043 if (sig == SIGTERM) {
1044 killall_tk("smbd");
1045 killall_tk("nmbd");
1047 else {
1048 killall("smbd", sig);
1049 killall("nmbd", sig);
1052 #endif
1054 #ifdef TCONFIG_SAMBASRV
1055 static void do_start_stop_samba(int stop, int start)
1057 if (stop) kill_samba(SIGTERM);
1059 FILE *fp;
1060 DIR *dir = NULL;
1061 struct dirent *dp;
1062 char nlsmod[15];
1063 int mode;
1064 char *nv;
1066 mode = nvram_get_int("smbd_enable");
1067 if (!start || !mode || !nvram_invmatch("lan_hostname", ""))
1068 return;
1070 if ((fp = fopen("/etc/smb.conf", "w")) == NULL)
1071 return;
1073 fprintf(fp, "[global]\n"
1074 " interfaces = %s\n"
1075 " bind interfaces only = yes\n"
1076 " workgroup = %s\n"
1077 " netbios name = %s\n"
1078 " server string = %s\n"
1079 " guest account = nobody\n"
1080 " security = %s\n"
1081 " browseable = yes\n"
1082 " guest ok = yes\n"
1083 " guest only = no\n"
1084 " log level = %d\n"
1085 " syslog only = yes\n"
1086 " timestamp logs = no\n"
1087 " syslog = 1\n"
1088 " dns proxy = no\n"
1089 " encrypt passwords = yes\n"
1090 " preserve case = yes\n"
1091 " short preserve case = yes\n",
1092 nvram_safe_get("lan_ifname"),
1093 nvram_get("smbd_wgroup") ? : "WORKGROUP",
1094 nvram_safe_get("lan_hostname"),
1095 nvram_get("router_name") ? : "Tomato",
1096 mode == 2 ? "user" : "share",
1097 nvram_get_int("smbd_loglevel")
1100 if (nvram_get_int("smbd_wins")) {
1101 nv = nvram_safe_get("wan_wins");
1102 if ((*nv == 0) || (strcmp(nv, "0.0.0.0") == 0)) {
1103 fprintf(fp, " wins support = yes\n");
1107 if (nvram_get_int("smbd_master")) {
1108 fprintf(fp,
1109 " domain master = yes\n"
1110 " local master = yes\n"
1111 " preferred master = yes\n"
1112 " os level = 65\n");
1115 nv = nvram_safe_get("smbd_cpage");
1116 if (*nv) {
1117 #ifndef TCONFIG_SAMBA3
1118 fprintf(fp, " client code page = %s\n", nv);
1119 #endif
1120 sprintf(nlsmod, "nls_cp%s", nv);
1122 nv = nvram_safe_get("smbd_nlsmod");
1123 if ((*nv) && (strcmp(nv, nlsmod) != 0))
1124 modprobe_r(nv);
1126 modprobe(nlsmod);
1127 nvram_set("smbd_nlsmod", nlsmod);
1130 #ifndef TCONFIG_SAMBA3
1131 if (nvram_match("smbd_cset", "utf8"))
1132 fprintf(fp, " coding system = utf8\n");
1133 else if (nvram_invmatch("smbd_cset", ""))
1134 fprintf(fp, " character set = %s\n", nvram_safe_get("smbd_cset"));
1135 #endif
1137 fprintf(fp, "%s\n\n", nvram_safe_get("smbd_custom"));
1139 /* configure shares */
1141 char *buf;
1142 char *p, *q;
1143 char *name, *path, *comment, *writeable, *hidden;
1144 int cnt = 0;
1146 if ((buf = strdup(nvram_safe_get("smbd_shares"))) != NULL)
1148 /* sharename<path<comment<writeable[0|1]<hidden[0|1] */
1150 p = buf;
1151 while ((q = strsep(&p, ">")) != NULL) {
1152 if (vstrsep(q, "<", &name, &path, &comment, &writeable, &hidden) != 5) continue;
1153 if (!path || !name) continue;
1155 /* share name */
1156 fprintf(fp, "\n[%s]\n", name);
1158 /* path */
1159 fprintf(fp, " path = %s\n", path);
1161 /* access level */
1162 if (!strcmp(writeable, "1"))
1163 fprintf(fp, " writable = yes\n force user = %s\n", "root");
1164 if (!strcmp(hidden, "1"))
1165 fprintf(fp, " browseable = no\n");
1167 /* comment */
1168 if (comment)
1169 fprintf(fp, " comment = %s\n", comment);
1171 cnt++;
1173 free(buf);
1176 /* share everything below MOUNT_ROOT */
1177 if (nvram_get_int("smbd_autoshare") && (dir = opendir(MOUNT_ROOT))) {
1178 while ((dp = readdir(dir))) {
1179 if (strcmp(dp->d_name, ".") && strcmp(dp->d_name, "..")) {
1181 /* smbd_autoshare: 0 - disable, 1 - read-only, 2 - writable, 3 - hidden writable */
1182 fprintf(fp, "\n[%s]\n path = %s/%s\n comment = %s\n",
1183 dp->d_name, MOUNT_ROOT, dp->d_name, dp->d_name);
1184 if (nvram_match("smbd_autoshare", "3")) // Hidden
1185 fprintf(fp, "\n[%s$]\n path = %s/%s\n browseable = no\n",
1186 dp->d_name, MOUNT_ROOT, dp->d_name);
1187 if (nvram_match("smbd_autoshare", "2") || nvram_match("smbd_autoshare", "3")) // RW
1188 fprintf(fp, " writable = yes\n force user = %s\n", "root");
1190 cnt++;
1194 if (dir) closedir(dir);
1196 if (cnt == 0) {
1197 /* by default share MOUNT_ROOT as read-only */
1198 fprintf(fp, "\n[share]\n"
1199 " path = %s\n"
1200 " writable = no\n",
1201 MOUNT_ROOT);
1204 fclose(fp);
1206 mkdir_if_none("/var/run/samba");
1207 mkdir_if_none("/etc/samba");
1209 /* write smbpasswd */
1210 #ifdef TCONFIG_SAMBA3
1211 eval("smbpasswd", "nobody", "\"\"");
1212 #else
1213 eval("smbpasswd", "-a", "nobody", "\"\"");
1214 #endif
1215 if (mode == 2) {
1216 char *smbd_user;
1217 if (((smbd_user = nvram_get("smbd_user")) == NULL) || (*smbd_user == 0) || !strcmp(smbd_user, "root"))
1218 smbd_user = "nas";
1219 #ifdef TCONFIG_SAMBA3
1220 eval("smbpasswd", smbd_user, nvram_safe_get("smbd_passwd"));
1221 #else
1222 eval("smbpasswd", "-a", smbd_user, nvram_safe_get("smbd_passwd"));
1223 #endif
1226 kill_samba(SIGHUP);
1227 int ret1 = 0, ret2 = 0;
1228 /* start samba if it's not already running */
1229 if (pidof("nmbd") <= 0)
1230 ret1 = eval("nmbd", "-D");
1231 if (pidof("smbd") <= 0)
1232 ret2 = eval("smbd", "-D");
1234 if (ret1 || ret2) kill_samba(SIGTERM);
1236 #endif
1238 void start_samba(void)
1240 #ifdef TCONFIG_SAMBASRV
1241 int fd = file_lock("usb");
1242 do_start_stop_samba(0, 1);
1243 file_unlock(fd);
1244 #endif
1247 void stop_samba(void)
1249 #ifdef TCONFIG_SAMBASRV
1250 int fd = file_lock("usb");
1251 do_start_stop_samba(1, 0);
1253 if (nvram_invmatch("smbd_nlsmod", "")) {
1254 modprobe_r(nvram_get("smbd_nlsmod"));
1255 nvram_set("smbd_nlsmod", "");
1258 /* clean up */
1259 unlink("/var/log/smb");
1260 unlink("/var/log/nmb");
1261 eval("rm", "-rf", "/var/run/samba");
1262 file_unlock(fd);
1263 #endif
1266 #ifdef TCONFIG_USB
1267 void restart_nas_services(int stop, int start)
1269 /* restart all NAS applications */
1270 #if TCONFIG_SAMBASRV || TCONFIG_FTP
1271 int fd = file_lock("usb");
1272 #ifdef TCONFIG_SAMBASRV
1273 do_start_stop_samba(stop, start && nvram_get_int("smbd_enable"));
1274 #endif
1275 #ifdef TCONFIG_FTP
1276 do_start_stop_ftpd(stop, start && nvram_get_int("ftp_enable"));
1277 #endif
1278 file_unlock(fd);
1279 #endif // TCONFIG_SAMBASRV || TCONFIG_FTP
1281 #endif // TCONFIG_USB
1283 // -----------------------------------------------------------------------------
1285 static void _check(pid_t *pid, const char *name, void (*func)(void) )
1287 if (*pid != -1) {
1288 if (kill(*pid, 0) != 0) {
1289 if ((*pid = pidof(name)) == -1) func();
1294 void check_services(void)
1296 #ifdef LINUX26
1297 _check(&pid_hotplug2, "hotplug2", start_hotplug2);
1298 #endif
1299 _check(&pid_dnsmasq, "dnsmasq", start_dnsmasq);
1300 _check(&pid_crond, "crond", start_cron);
1301 _check(&pid_igmp, "igmpproxy", start_igmp_proxy);
1304 // -----------------------------------------------------------------------------
1306 void start_services(void)
1308 static int once = 1;
1310 if (once) {
1311 once = 0;
1313 create_passwd();
1314 if (nvram_get_int("telnetd_eas")) start_telnetd();
1315 if (nvram_get_int("sshd_eas")) start_sshd();
1318 // start_syslog();
1319 start_nas();
1320 start_zebra();
1321 start_dnsmasq();
1322 start_cifs();
1323 start_httpd();
1324 start_cron();
1325 // start_upnp();
1326 start_rstats(0);
1327 start_sched();
1328 restart_nas_services(1, 1); // !!TB - Samba and FTP Server
1331 void stop_services(void)
1333 clear_resolv();
1335 stop_ftpd(); // !!TB - FTP Server
1336 stop_samba(); // !!TB - Samba
1337 stop_sched();
1338 stop_rstats();
1339 // stop_upnp();
1340 stop_cron();
1341 stop_httpd();
1342 stop_cifs();
1343 stop_dnsmasq();
1344 stop_zebra();
1345 stop_nas();
1346 // stop_syslog();
1349 // -----------------------------------------------------------------------------
1351 void exec_service(void)
1353 const int A_START = 1;
1354 const int A_STOP = 2;
1355 const int A_RESTART = 1|2;
1356 char buffer[128];
1357 char *service;
1358 char *act;
1359 char *next;
1360 int action;
1361 int i;
1363 strlcpy(buffer, nvram_safe_get("action_service"), sizeof(buffer));
1364 next = buffer;
1366 TOP:
1367 act = strsep(&next, ",");
1368 service = strsep(&act, "-");
1369 if (act == NULL) {
1370 next = NULL;
1371 goto CLEAR;
1374 TRACE_PT("service=%s action=%s\n", service, act);
1376 if (strcmp(act, "start") == 0) action = A_START;
1377 else if (strcmp(act, "stop") == 0) action = A_STOP;
1378 else if (strcmp(act, "restart") == 0) action = A_RESTART;
1379 else action = 0;
1382 if (strcmp(service, "dhcpc") == 0) {
1383 if (action & A_STOP) stop_dhcpc();
1384 if (action & A_START) start_dhcpc();
1385 goto CLEAR;
1388 if ((strcmp(service, "dhcpd") == 0) || (strcmp(service, "dns") == 0) || (strcmp(service, "dnsmasq") == 0)) {
1389 if (action & A_STOP) stop_dnsmasq();
1390 if (action & A_START) {
1391 dns_to_resolv();
1392 start_dnsmasq();
1394 goto CLEAR;
1397 if (strcmp(service, "firewall") == 0) {
1398 if (action & A_STOP) {
1399 stop_firewall();
1400 stop_igmp_proxy();
1402 if (action & A_START) {
1403 start_firewall();
1404 start_igmp_proxy();
1406 goto CLEAR;
1409 if (strcmp(service, "restrict") == 0) {
1410 if (action & A_STOP) {
1411 stop_firewall();
1413 if (action & A_START) {
1414 i = nvram_get_int("rrules_radio"); // -1 = not used, 0 = enabled by rule, 1 = disabled by rule
1416 start_firewall();
1418 // if radio was disabled by access restriction, but no rule is handling it now, enable it
1419 if (i == 1) {
1420 if (nvram_get_int("rrules_radio") < 0) {
1421 if (!get_radio()) eval("radio", "on");
1425 goto CLEAR;
1428 if (strcmp(service, "qos") == 0) {
1429 if (action & A_STOP) {
1430 stop_qos();
1432 stop_firewall(); start_firewall(); // always restarted
1433 if (action & A_START) {
1434 start_qos();
1435 if (nvram_match("qos_reset", "1")) f_write_string("/proc/net/clear_marks", "1", 0, 0);
1437 goto CLEAR;
1440 if (strcmp(service, "upnp") == 0) {
1441 if (action & A_STOP) {
1442 stop_upnp();
1444 stop_firewall(); start_firewall(); // always restarted
1445 if (action & A_START) {
1446 start_upnp();
1448 goto CLEAR;
1451 if (strcmp(service, "telnetd") == 0) {
1452 if (action & A_STOP) stop_telnetd();
1453 if (action & A_START) start_telnetd();
1454 goto CLEAR;
1457 if (strcmp(service, "sshd") == 0) {
1458 if (action & A_STOP) stop_sshd();
1459 if (action & A_START) start_sshd();
1460 goto CLEAR;
1463 if (strcmp(service, "httpd") == 0) {
1464 if (action & A_STOP) stop_httpd();
1465 if (action & A_START) start_httpd();
1466 goto CLEAR;
1469 if (strcmp(service, "admin") == 0) {
1470 if (action & A_STOP) {
1471 stop_sshd();
1472 stop_telnetd();
1473 stop_httpd();
1475 stop_firewall(); start_firewall(); // always restarted
1476 if (action & A_START) {
1477 start_httpd();
1478 create_passwd();
1479 if (nvram_match("telnetd_eas", "1")) start_telnetd();
1480 if (nvram_match("sshd_eas", "1")) start_sshd();
1482 goto CLEAR;
1485 if (strcmp(service, "ddns") == 0) {
1486 if (action & A_STOP) stop_ddns();
1487 if (action & A_START) start_ddns();
1488 goto CLEAR;
1491 if (strcmp(service, "ntpc") == 0) {
1492 if (action & A_STOP) stop_ntpc();
1493 if (action & A_START) start_ntpc();
1494 goto CLEAR;
1497 if (strcmp(service, "logging") == 0) {
1498 if (action & A_STOP) {
1499 stop_syslog();
1500 stop_cron();
1502 stop_firewall(); start_firewall(); // always restarted
1503 if (action & A_START) {
1504 start_cron();
1505 start_syslog();
1507 goto CLEAR;
1510 if (strcmp(service, "crond") == 0) {
1511 if (action & A_STOP) {
1512 stop_cron();
1514 if (action & A_START) {
1515 start_cron();
1517 goto CLEAR;
1520 #ifdef LINUX26
1521 if (strncmp(service, "hotplug", 7) == 0) {
1522 if (action & A_STOP) {
1523 stop_hotplug2();
1525 if (action & A_START) {
1526 start_hotplug2(1);
1528 goto CLEAR;
1530 #endif
1532 if (strcmp(service, "upgrade") == 0) {
1533 if (action & A_START) {
1534 #if TOMATO_SL
1535 stop_usbevent();
1536 stop_smbd();
1537 #endif
1538 stop_ftpd(); // !!TB - FTP Server
1539 stop_samba(); // !!TB - Samba
1540 stop_jffs2();
1541 // stop_cifs();
1542 stop_zebra();
1543 stop_cron();
1544 stop_ntpc();
1545 stop_upnp();
1546 // stop_dhcpc();
1547 killall("rstats", SIGTERM);
1548 killall("buttons", SIGTERM);
1549 stop_syslog();
1550 remove_storage_main(1); // !!TB - USB Support
1551 stop_usb(); // !!TB - USB Support
1553 goto CLEAR;
1556 #ifdef TCONFIG_CIFS
1557 if (strcmp(service, "cifs") == 0) {
1558 if (action & A_STOP) stop_cifs();
1559 if (action & A_START) start_cifs();
1560 goto CLEAR;
1562 #endif
1564 #ifdef TCONFIG_JFFS2
1565 if (strcmp(service, "jffs2") == 0) {
1566 if (action & A_STOP) stop_jffs2();
1567 if (action & A_START) start_jffs2();
1568 goto CLEAR;
1570 #endif
1572 if (strcmp(service, "routing") == 0) {
1573 if (action & A_STOP) {
1574 stop_zebra();
1575 do_static_routes(0); // remove old '_saved'
1576 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "0");
1578 stop_firewall();
1579 start_firewall();
1580 if (action & A_START) {
1581 do_static_routes(1); // add new
1582 start_zebra();
1583 eval("brctl", "stp", nvram_safe_get("lan_ifname"), nvram_safe_get("lan_stp"));
1585 goto CLEAR;
1588 if (strcmp(service, "ctnf") == 0) {
1589 if (action & A_START) {
1590 setup_conntrack();
1591 stop_firewall();
1592 start_firewall();
1594 goto CLEAR;
1597 if (strcmp(service, "wan") == 0) {
1598 if (action & A_STOP) {
1599 if (get_wan_proto() == WP_PPPOE) {
1600 stop_dnsmasq();
1601 stop_redial();
1602 stop_singe_pppoe(PPPOE0);
1603 if (((action & A_START) == 0) && (nvram_match("ppp_demand", "1"))) {
1604 sleep(1);
1605 start_pppoe(PPPOE0);
1607 start_dnsmasq();
1609 else {
1610 stop_wan();
1614 if (action & A_START) {
1615 rename("/tmp/ppp/log", "/tmp/ppp/log.~");
1617 if (get_wan_proto() == WP_PPPOE) {
1618 stop_singe_pppoe(PPPOE0);
1619 start_pppoe(PPPOE0);
1620 if (nvram_invmatch("ppp_demand", "1")) {
1621 start_redial();
1624 else {
1625 start_wan(BOOT);
1627 sleep(2);
1628 force_to_dial();
1630 goto CLEAR;
1633 if (strcmp(service, "net") == 0) {
1634 if (action & A_STOP) {
1635 stop_wan();
1636 stop_nas();
1637 stop_lan();
1638 stop_vlan();
1640 if (action & A_START) {
1641 start_vlan();
1642 start_lan();
1643 start_nas();
1644 start_wan(BOOT);
1645 start_wl();
1647 goto CLEAR;
1650 if (strcmp(service, "rstats") == 0) {
1651 if (action & A_STOP) stop_rstats();
1652 if (action & A_START) start_rstats(0);
1653 goto CLEAR;
1656 if (strcmp(service, "rstatsnew") == 0) {
1657 if (action & A_STOP) stop_rstats();
1658 if (action & A_START) start_rstats(1);
1659 goto CLEAR;
1662 if (strcmp(service, "sched") == 0) {
1663 if (action & A_STOP) stop_sched();
1664 if (action & A_START) start_sched();
1665 goto CLEAR;
1668 #ifdef TCONFIG_USB
1669 // !!TB - USB Support
1670 if (strcmp(service, "usb") == 0) {
1671 if (action & A_STOP) stop_usb();
1672 if (action & A_START) {
1673 start_usb();
1674 // restart Samba and ftp since they may be killed by stop_usb()
1675 restart_nas_services(0, 1);
1677 goto CLEAR;
1679 #endif
1681 #ifdef TCONFIG_FTP
1682 // !!TB - FTP Server
1683 if (strcmp(service, "ftpd") == 0) {
1684 if (action & A_STOP) stop_ftpd();
1685 setup_conntrack();
1686 stop_firewall();
1687 start_firewall();
1688 if (action & A_START) start_ftpd();
1689 goto CLEAR;
1691 #endif
1693 #ifdef TCONFIG_SAMBASRV
1694 // !!TB - Samba
1695 if (strcmp(service, "samba") == 0 || strcmp(service, "smbd") == 0) {
1696 if (action & A_STOP) stop_samba();
1697 if (action & A_START) {
1698 create_passwd();
1699 stop_dnsmasq();
1700 start_dnsmasq();
1701 start_samba();
1703 goto CLEAR;
1705 #endif
1707 #ifdef TCONFIG_OPENVPN
1708 if (strncmp(service, "vpnclient", 9) == 0) {
1709 if (action & A_STOP) stop_vpnclient(atoi(&service[9]));
1710 if (action & A_START) start_vpnclient(atoi(&service[9]));
1711 goto CLEAR;
1714 if (strncmp(service, "vpnserver", 9) == 0) {
1715 if (action & A_STOP) stop_vpnserver(atoi(&service[9]));
1716 if (action & A_START) start_vpnserver(atoi(&service[9]));
1717 goto CLEAR;
1719 #endif
1721 CLEAR:
1722 if (next) goto TOP;
1724 // some functions check action_service and must be cleared at end -- zzz
1725 nvram_set("action_service", "");
1728 static void do_service(const char *name, const char *action, int user)
1730 int n;
1731 char s[64];
1733 n = 15;
1734 while (!nvram_match("action_service", "")) {
1735 if (user) {
1736 putchar('*');
1737 fflush(stdout);
1739 else if (--n < 0) break;
1740 sleep(1);
1743 snprintf(s, sizeof(s), "%s-%s", name, action);
1744 nvram_set("action_service", s);
1745 kill(1, SIGUSR1);
1747 n = 15;
1748 while (nvram_match("action_service", s)) {
1749 if (user) {
1750 putchar('.');
1751 fflush(stdout);
1753 else if (--n < 0) {
1754 break;
1756 sleep(1);
1760 int service_main(int argc, char *argv[])
1762 if (argc != 3) usage_exit(argv[0], "<service> <action>");
1763 do_service(argv[1], argv[2], 1);
1764 printf("\nDone.\n");
1765 return 0;
1768 void start_service(const char *name)
1770 do_service(name, "start", 0);
1773 void stop_service(const char *name)
1775 do_service(name, "stop", 0);
1779 void restart_service(const char *name)
1781 do_service(name, "restart", 0);