Remove TomatoAnon
[tomato.git] / release / src / router / rc / services.c
blobe6730cd098c1a31ad7e6d327f866ac552af3a9d2
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 // Pop an alarm to recheck pids in 500 msec.
49 static const struct itimerval pop_tv = { {0,0}, {0, 500 * 1000} };
51 // Pop an alarm to reap zombies.
52 static const struct itimerval zombie_tv = { {0,0}, {307, 0} };
54 // -----------------------------------------------------------------------------
56 static const char dmhosts[] = "/etc/dnsmasq/hosts";
57 static const char dmdhcp[] = "/etc/dnsmasq/dhcp";
58 static const char dmresolv[] = "/etc/resolv.dnsmasq";
60 static pid_t pid_dnsmasq = -1;
62 static int is_wet(int idx, int unit, int subunit, void *param)
64 return nvram_match(wl_nvname("mode", unit, subunit), "wet");
67 void start_dnsmasq()
69 FILE *f;
70 const char *nv;
71 char buf[512];
72 char lan[24];
73 const char *router_ip;
74 char sdhcp_lease[32];
75 char *e;
76 int n;
77 char *mac, *ip, *name;
78 char *p;
79 int ipn;
80 char ipbuf[32];
81 FILE *hf, *df;
82 int dhcp_start;
83 int dhcp_count;
84 int dhcp_lease;
85 int do_dhcpd;
86 int do_dns;
87 int do_dhcpd_hosts;
89 #ifdef TCONFIG_IPV6
90 char *prefix, *ipv6, *mtu;
91 int do_6to4, do_6rd;
92 int service;
93 #endif
95 TRACE_PT("begin\n");
97 if (getpid() != 1) {
98 start_service("dnsmasq");
99 return;
102 stop_dnsmasq();
104 if (foreach_wif(1, NULL, is_wet)) return;
106 if ((f = fopen("/etc/dnsmasq.conf", "w")) == NULL) return;
108 router_ip = nvram_safe_get("lan_ipaddr");
110 fprintf(f,
111 "pid-file=/var/run/dnsmasq.pid\n");
112 if (((nv = nvram_get("wan_domain")) != NULL) || ((nv = nvram_get("wan_get_domain")) != NULL)) {
113 if (*nv) fprintf(f, "domain=%s\n", nv);
116 // dns
117 const dns_list_t *dns = get_dns(); // this always points to a static buffer
119 if (((nv = nvram_get("dns_minport")) != NULL) && (*nv)) n = atoi(nv);
120 else n = 4096;
121 fprintf(f,
122 "resolv-file=%s\n" // the real stuff is here
123 "addn-hosts=%s\n" // directory with additional hosts files
124 "dhcp-hostsfile=%s\n" // directory with dhcp hosts files
125 "expand-hosts\n" // expand hostnames in hosts file
126 "min-port=%u\n", // min port used for random src port
127 dmresolv, dmhosts, dmdhcp, n);
128 do_dns = nvram_match("dhcpd_dmdns", "1");
130 // DNS rebinding protection, will discard upstream RFC1918 responses
131 if (nvram_get_int("dns_norebind")) {
132 fprintf(f,
133 "stop-dns-rebind\n"
134 "rebind-localhost-ok\n");
135 // allow RFC1918 responses for server domain
136 switch (get_wan_proto()) {
137 case WP_PPTP:
138 nv = nvram_get("pptp_server_ip");
139 break;
140 case WP_L2TP:
141 nv = nvram_get("l2tp_server_ip");
142 break;
143 default:
144 nv = NULL;
145 break;
147 if (nv && *nv) fprintf(f, "rebind-domain-ok=%s\n", nv);
150 #ifdef TCONFIG_DNSCRYPT
151 if (nvram_match("dnscrypt_proxy", "1")) {
152 fprintf(f, "server=127.0.0.1#%s\n", nvram_safe_get("dnscrypt_port") );
154 #endif
156 for (n = 0 ; n < dns->count; ++n) {
157 if (dns->dns[n].port != 53) {
158 fprintf(f, "server=%s#%u\n", inet_ntoa(dns->dns[n].addr), dns->dns[n].port);
162 if (nvram_get_int("dhcpd_static_only")) {
163 fprintf(f, "dhcp-ignore=tag:!known\n");
166 if ((n = nvram_get_int("dnsmasq_q"))) { //process quiet flags
167 if (n & 1) fprintf(f, "quiet-dhcp\n");
168 if (n & 2) fprintf(f, "quiet-dhcp6\n");
169 if (n & 4) fprintf(f, "quiet-ra\n");
172 // dhcp
173 do_dhcpd_hosts=0;
174 char lanN_proto[] = "lanXX_proto";
175 char lanN_ifname[] = "lanXX_ifname";
176 char lanN_ipaddr[] = "lanXX_ipaddr";
177 char lanN_netmask[] = "lanXX_netmask";
178 char dhcpdN_startip[] = "dhcpdXX_startip";
179 char dhcpdN_endip[] = "dhcpdXX_endip";
180 char dhcpN_start[] = "dhcpXX_start";
181 char dhcpN_num[] = "dhcpXX_num";
182 char dhcpN_lease[] = "dhcpXX_lease";
183 char br;
184 for(br=0 ; br<=3 ; br++) {
185 char bridge[2] = "0";
186 if (br!=0)
187 bridge[0]+=br;
188 else
189 strcpy(bridge, "");
191 sprintf(lanN_proto, "lan%s_proto", bridge);
192 sprintf(lanN_ifname, "lan%s_ifname", bridge);
193 sprintf(lanN_ipaddr, "lan%s_ipaddr", bridge);
194 do_dhcpd = nvram_match(lanN_proto, "dhcp");
195 if (do_dhcpd) {
196 do_dhcpd_hosts++;
198 router_ip = nvram_safe_get(lanN_ipaddr);
199 strlcpy(lan, router_ip, sizeof(lan));
200 if ((p = strrchr(lan, '.')) != NULL) *(p + 1) = 0;
202 fprintf(f,
203 "interface=%s\n",
204 nvram_safe_get(lanN_ifname));
206 sprintf(dhcpN_lease, "dhcp%s_lease", bridge);
207 dhcp_lease = nvram_get_int(dhcpN_lease);
209 if (dhcp_lease <= 0) dhcp_lease = 1440;
211 if ((e = nvram_get("dhcpd_slt")) != NULL) n = atoi(e); else n = 0;
212 if (n < 0) strcpy(sdhcp_lease, "infinite");
213 else sprintf(sdhcp_lease, "%dm", (n > 0) ? n : dhcp_lease);
215 if (!do_dns) {
216 // if not using dnsmasq for dns
218 if ((dns->count == 0) && (nvram_get_int("dhcpd_llndns"))) {
219 // no DNS might be temporary. use a low lease time to force clients to update.
220 dhcp_lease = 2;
221 strcpy(sdhcp_lease, "2m");
222 do_dns = 1;
224 else {
225 // pass the dns directly
226 buf[0] = 0;
227 for (n = 0 ; n < dns->count; ++n) {
228 if (dns->dns[n].port == 53) { // check: option 6 doesn't seem to support other ports
229 sprintf(buf + strlen(buf), ",%s", inet_ntoa(dns->dns[n].addr));
232 fprintf(f, "dhcp-option=tag:%s,6%s\n", nvram_safe_get(lanN_ifname), buf);
236 sprintf(dhcpdN_startip, "dhcpd%s_startip", bridge);
237 sprintf(dhcpdN_endip, "dhcpd%s_endip", bridge);
238 sprintf(lanN_netmask, "lan%s_netmask", bridge);
240 if ((p = nvram_get(dhcpdN_startip)) && (*p) && (e = nvram_get(dhcpdN_endip)) && (*e)) {
241 fprintf(f, "dhcp-range=tag:%s,%s,%s,%s,%dm\n", nvram_safe_get(lanN_ifname), p, e, nvram_safe_get(lanN_netmask), dhcp_lease);
243 else {
244 // for compatibility
245 sprintf(dhcpN_start, "dhcp%s_start", bridge);
246 sprintf(dhcpN_num, "dhcp%s_num", bridge);
247 sprintf(lanN_netmask, "lan%s_netmask", bridge);
248 dhcp_start = nvram_get_int(dhcpN_start);
249 dhcp_count = nvram_get_int(dhcpN_num);
250 fprintf(f, "dhcp-range=tag:%s,%s%d,%s%d,%s,%dm\n",
251 nvram_safe_get(lanN_ifname), lan, dhcp_start, lan, dhcp_start + dhcp_count - 1, nvram_safe_get(lanN_netmask), dhcp_lease);
254 nv = nvram_safe_get(lanN_ipaddr);
255 if ((nvram_get_int("dhcpd_gwmode") == 1) && (get_wan_proto() == WP_DISABLED)) {
256 p = nvram_safe_get("lan_gateway");
257 if ((*p) && (strcmp(p, "0.0.0.0") != 0)) nv = p;
260 fprintf(f,
261 "dhcp-option=tag:%s,3,%s\n", // gateway
262 nvram_safe_get(lanN_ifname), nv);
264 if (((nv = nvram_get("wan_wins")) != NULL) && (*nv) && (strcmp(nv, "0.0.0.0") != 0)) {
265 fprintf(f, "dhcp-option=tag:%s,44,%s\n", nvram_safe_get(lanN_ifname), nv);
267 #ifdef TCONFIG_SAMBASRV
268 else if (nvram_get_int("smbd_enable") && nvram_invmatch("lan_hostname", "") && nvram_get_int("smbd_wins")) {
269 if ((nv == NULL) || (*nv == 0) || (strcmp(nv, "0.0.0.0") == 0)) {
270 // Samba will serve as a WINS server
271 fprintf(f, "dhcp-option=tag:%s,44,%s\n", nvram_safe_get(lanN_ifname), nvram_safe_get(lanN_ipaddr));
274 #endif
275 } else {
276 if (strcmp(nvram_safe_get(lanN_ifname),"")!=0) {
277 fprintf(f, "interface=%s\n", nvram_safe_get(lanN_ifname));
278 // if no dhcp range is set then no dhcp service will be offered so following
279 // line is superflous.
280 // fprintf(f, "no-dhcp-interface=%s\n", nvram_safe_get(lanN_ifname));
284 // write static lease entries & create hosts file
286 mkdir_if_none(dmhosts);
287 snprintf(buf, sizeof(buf), "%s/hosts", dmhosts);
288 if ((hf = fopen(buf, "w")) != NULL) {
289 if (((nv = nvram_get("wan_hostname")) != NULL) && (*nv))
290 fprintf(hf, "%s %s\n", router_ip, nv);
291 #ifdef TCONFIG_SAMBASRV
292 else if (((nv = nvram_get("lan_hostname")) != NULL) && (*nv))
293 fprintf(hf, "%s %s\n", router_ip, nv);
294 #endif
295 p = (char *)get_wanip();
296 if ((*p == 0) || strcmp(p, "0.0.0.0") == 0)
297 p = "127.0.0.1";
298 fprintf(hf, "%s wan-ip\n", p);
299 if (nv && (*nv))
300 fprintf(hf, "%s %s-wan\n", p, nv);
303 mkdir_if_none(dmdhcp);
304 snprintf(buf, sizeof(buf), "%s/dhcp-hosts", dmdhcp);
305 df = fopen(buf, "w");
307 // PREVIOUS/OLD FORMAT:
308 // 00:aa:bb:cc:dd:ee<123<xxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 53 w/ delim
309 // 00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 85 w/ delim
310 // 00:aa:bb:cc:dd:ee,00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 106 w/ delim
312 // NEW FORMAT (+static ARP binding after hostname):
313 // 00:aa:bb:cc:dd:ee<123<xxxxxxxxxxxxxxxxxxxxxxxxxx.xyz<a> = 55 w/ delim
314 // 00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz<a> = 87 w/ delim
315 // 00:aa:bb:cc:dd:ee,00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz<a> = 108 w/ delim
317 p = nvram_safe_get("dhcpd_static");
318 while ((e = strchr(p, '>')) != NULL) {
319 n = (e - p);
320 if (n > 107) {
321 p = e + 1;
322 continue;
325 strncpy(buf, p, n);
326 buf[n] = 0;
327 p = e + 1;
329 if ((e = strchr(buf, '<')) == NULL) continue;
330 *e = 0;
331 mac = buf;
333 ip = e + 1;
334 if ((e = strchr(ip, '<')) == NULL) continue;
335 *e = 0;
336 if (strchr(ip, '.') == NULL) {
337 ipn = atoi(ip);
338 if ((ipn <= 0) || (ipn > 255)) continue;
339 sprintf(ipbuf, "%s%d", lan, ipn);
340 ip = ipbuf;
342 else {
343 if (inet_addr(ip) == INADDR_NONE) continue;
346 name = e + 1;
348 if ((e = strchr(name, '<')) != NULL) {
349 *e = 0;
352 if ((hf) && (*name != 0)) {
353 fprintf(hf, "%s %s\n", ip, name);
356 if ((do_dhcpd_hosts > 0) && (*mac != 0) && (strcmp(mac, "00:00:00:00:00:00") != 0)) {
357 if (nvram_get_int("dhcpd_slt") == 0) {
358 fprintf(f, "dhcp-host=%s,%s\n", mac, ip);
359 } else {
360 fprintf(f, "dhcp-host=%s,%s,%s\n", mac, ip, sdhcp_lease);
365 if (df) fclose(df);
366 if (hf) fclose(hf);
368 n = nvram_get_int("dhcpd_lmax");
369 fprintf(f,
370 "dhcp-lease-max=%d\n",
371 (n > 0) ? n : 255);
372 if (nvram_get_int("dhcpd_auth") >= 0) {
373 fprintf(f, "dhcp-authoritative\n");
376 #ifdef TCONFIG_DNSSEC
377 if (nvram_match("dnssec_enable", "1")) {
378 fprintf(f, "conf-file=/etc/trust-anchors.conf\n"
379 "dnssec\n"
380 "dnssec-no-timecheck\n");
382 #endif
384 #ifdef TCONFIG_DNSCRYPT
385 if (nvram_match("dnscrypt_proxy", "1")) {
386 if (nvram_match("dnscrypt_priority", "1"))
387 fprintf(f, "strict-order\n");
389 if (nvram_match("dnscrypt_priority", "2"))
390 fprintf(f, "no-resolv\n");
392 #endif
396 #ifdef TCONFIG_OPENVPN
397 write_vpn_dnsmasq_config(f);
398 #endif
400 #ifdef TCONFIG_PPTPD
401 write_pptpd_dnsmasq_config(f);
402 #endif
404 #ifdef TCONFIG_IPV6
405 if (ipv6_enabled()) {
407 service = get_ipv6_service();
408 do_6to4 = (service == IPV6_ANYCAST_6TO4);
409 do_6rd = (service == IPV6_6RD || service == IPV6_6RD_DHCP);
410 mtu = NULL;
412 switch (service) {
413 case IPV6_NATIVE_DHCP:
414 case IPV6_ANYCAST_6TO4:
415 case IPV6_6IN4:
416 case IPV6_6RD:
417 case IPV6_6RD_DHCP:
418 mtu = (nvram_get_int("ipv6_tun_mtu") > 0) ? nvram_safe_get("ipv6_tun_mtu") : "1480";
419 // fall through
420 default:
421 prefix = do_6to4 ? "0:0:0:1::" : nvram_safe_get("ipv6_prefix");
422 break;
424 if (!(*prefix)) prefix = "::";
425 ipv6 = (char *)ipv6_router_address(NULL);
427 fprintf(f, "enable-ra\ndhcp-range=tag:br0,%s, slaac, ra-names, 64\n", prefix);
430 // enable-ra should be enabled in both cases
431 if (nvram_get_int("ipv6_radvd") || nvram_get_int("ipv6_dhcpd"))
432 fprintf(f,"enable-ra\n");
434 // Only SLAAC and NO DHCPv6
435 if (nvram_get_int("ipv6_radvd") && !nvram_get_int("ipv6_dhcpd"))
436 fprintf(f,"dhcp-range=::, constructor:br*, ra-names, ra-stateless, 64, 12h\n");
438 // Only DHCPv6 and NO SLAAC
439 if (nvram_get_int("ipv6_dhcpd") && !nvram_get_int("ipv6_radvd"))
440 fprintf(f,"dhcp-range=::1, ::FFFF:FFFF, constructor:br*, 64, 12h\n");
442 // SLAAC and DHCPv6 (2 IPv6 IPs)
443 if (nvram_get_int("ipv6_radvd") && nvram_get_int("ipv6_dhcpd"))
444 fprintf(f,"dhcp-range=::1, ::FFFF:FFFF, constructor:br*, ra-names, 64, 12h\n");
446 #endif
448 fprintf(f, "%s\n\n", nvram_safe_get("dnsmasq_custom"));
450 fappend(f, "/etc/dnsmasq.custom");
451 fappend(f, "/etc/dnsmasq.ipset");
455 fclose(f);
457 if (do_dns) {
458 unlink("/etc/resolv.conf");
459 symlink("/rom/etc/resolv.conf", "/etc/resolv.conf"); // nameserver 127.0.0.1
462 TRACE_PT("run dnsmasq\n");
464 // Default to some values we like, but allow the user to override them.
465 eval("dnsmasq", "-c", "1500", "--log-async");
467 if (!nvram_contains_word("debug_norestart", "dnsmasq")) {
468 pid_dnsmasq = -2;
471 TRACE_PT("end\n");
473 #ifdef TCONFIG_DNSCRYPT
474 //start dnscrypt-proxy
475 if (nvram_match("dnscrypt_proxy", "1")) {
476 char dnscrypt_local[30];
477 sprintf(dnscrypt_local, "127.0.0.1:%s", nvram_safe_get("dnscrypt_port") );
479 eval("ntp2ip");
481 if (nvram_match("dnscrypt_manual", "1")) {
482 eval("dnscrypt-proxy", "-d",
483 "-a", dnscrypt_local,
484 "-m", nvram_safe_get("dnscrypt_log"),
485 "-N", nvram_safe_get("dnscrypt_provider_name"),
486 "-k", nvram_safe_get("dnscrypt_provider_key"),
487 "-r", nvram_safe_get("dnscrypt_resolver_address") );
488 } else {
489 eval("dnscrypt-proxy", "-d",
490 "-a", dnscrypt_local,
491 "-m", nvram_safe_get("dnscrypt_log"),
492 "-R", nvram_safe_get("dnscrypt_resolver"),
493 "-L", "/etc/dnscrypt-resolvers.csv" );
496 #ifdef TCONFIG_IPV6
497 char dnscrypt_local_ipv6[30];
498 sprintf(dnscrypt_local_ipv6, "::1:%s", nvram_safe_get("dnscrypt_port") );
500 if (get_ipv6_service() != *("NULL")) { // when ipv6 enabled
501 if (nvram_match("dnscrypt_manual", "1")) {
502 eval("dnscrypt-proxy", "-d",
503 "-a", dnscrypt_local,
504 "-m", nvram_safe_get("dnscrypt_log"),
505 "-N", nvram_safe_get("dnscrypt_provider_name"),
506 "-k", nvram_safe_get("dnscrypt_provider_key"),
507 "-r", nvram_safe_get("dnscrypt_resolver_address") );
508 } else {
509 eval("dnscrypt-proxy", "-d",
510 "-a", dnscrypt_local,
511 "-m", nvram_safe_get("dnscrypt_log"),
512 "-R", nvram_safe_get("dnscrypt_resolver"),
513 "-L", "/etc/dnscrypt-resolvers.csv" );
516 #endif
518 #endif
520 #ifdef TCONFIG_DNSSEC
521 if ((time(0) > Y2K) && nvram_match("dnssec_enable", "1")){
522 killall("dnsmasq", SIGHUP);
524 #endif
528 void stop_dnsmasq(void)
530 TRACE_PT("begin\n");
532 if (getpid() != 1) {
533 stop_service("dnsmasq");
534 return;
537 pid_dnsmasq = -1;
539 unlink("/etc/resolv.conf");
540 symlink(dmresolv, "/etc/resolv.conf");
542 killall_tk("dnsmasq");
543 #ifdef TCONFIG_DNSCRYPT
544 killall_tk("dnscrypt-proxy");
545 #endif
547 TRACE_PT("end\n");
550 void clear_resolv(void)
552 f_write(dmresolv, NULL, 0, 0, 0); // blank
555 #ifdef TCONFIG_IPV6
556 static int write_ipv6_dns_servers(FILE *f, const char *prefix, char *dns, const char *suffix, int once)
558 char p[INET6_ADDRSTRLEN + 1], *next = NULL;
559 struct in6_addr addr;
560 int cnt = 0;
562 foreach(p, dns, next) {
563 // verify that this is a valid IPv6 address
564 if (inet_pton(AF_INET6, p, &addr) == 1) {
565 fprintf(f, "%s%s%s", (once && cnt) ? "" : prefix, p, suffix);
566 ++cnt;
570 return cnt;
572 #endif
574 void dns_to_resolv(void)
576 FILE *f;
577 const dns_list_t *dns;
578 int i;
579 mode_t m;
581 m = umask(022); // 077 from pppoecd
582 if ((f = fopen(dmresolv, "w")) != NULL) {
583 // Check for VPN DNS entries
584 if (!write_pptpvpn_resolv(f) && !write_vpn_resolv(f)) {
585 #ifdef TCONFIG_IPV6
586 if (write_ipv6_dns_servers(f, "nameserver ", nvram_safe_get("ipv6_dns"), "\n", 0) == 0 || nvram_get_int("dns_addget"))
587 write_ipv6_dns_servers(f, "nameserver ", nvram_safe_get("ipv6_get_dns"), "\n", 0);
588 #endif
589 dns = get_dns(); // static buffer
590 if (dns->count == 0) {
591 // Put a pseudo DNS IP to trigger Connect On Demand
592 if (nvram_match("ppp_demand", "1")) {
593 switch (get_wan_proto()) {
594 case WP_PPPOE:
595 case WP_PPP3G:
596 case WP_PPTP:
597 case WP_L2TP:
598 fprintf(f, "nameserver 1.1.1.1\n");
599 break;
603 else {
604 for (i = 0; i < dns->count; i++) {
605 if (dns->dns[i].port == 53) { // resolv.conf doesn't allow for an alternate port
606 fprintf(f, "nameserver %s\n", inet_ntoa(dns->dns[i].addr));
611 fclose(f);
613 umask(m);
616 // -----------------------------------------------------------------------------
618 void start_httpd(void)
620 if (getpid() != 1) {
621 start_service("httpd");
622 return;
625 if( nvram_match( "web_css", "online" ) )
626 xstart( "/usr/sbin/ttb" );
628 stop_httpd();
630 // set www dir
631 if ( nvram_match( "web_dir", "jffs" ) ) { chdir("/jffs/www"); }
632 else if ( nvram_match( "web_dir", "opt" ) ) { chdir("/opt/www"); }
633 else if ( nvram_match( "web_dir", "tmp" ) ) { chdir("/tmp/www");}
634 else { chdir("/www"); }
636 eval("httpd");
637 chdir("/");
640 void stop_httpd(void)
642 if (getpid() != 1) {
643 stop_service("httpd");
644 return;
647 killall_tk("httpd");
650 // -----------------------------------------------------------------------------
651 #ifdef TCONFIG_IPV6
653 static void add_ip6_lanaddr(void)
655 char ip[INET6_ADDRSTRLEN + 4];
656 const char *p;
658 p = ipv6_router_address(NULL);
659 if (*p) {
660 snprintf(ip, sizeof(ip), "%s/%d", p, nvram_get_int("ipv6_prefix_length") ? : 64);
661 eval("ip", "-6", "addr", "add", ip, "dev", nvram_safe_get("lan_ifname"));
665 void start_ipv6_tunnel(void)
667 char ip[INET6_ADDRSTRLEN + 4];
668 struct in_addr addr4;
669 struct in6_addr addr;
670 const char *wanip, *mtu, *tun_dev;
671 int service;
673 service = get_ipv6_service();
674 tun_dev = get_wan6face();
675 wanip = get_wanip();
676 mtu = (nvram_get_int("ipv6_tun_mtu") > 0) ? nvram_safe_get("ipv6_tun_mtu") : "1480";
677 modprobe("sit");
679 if (service == IPV6_ANYCAST_6TO4)
680 snprintf(ip, sizeof(ip), "192.88.99.%d", nvram_get_int("ipv6_relay"));
681 else
682 strlcpy(ip, (char *)nvram_safe_get("ipv6_tun_v4end"), sizeof(ip));
683 eval("ip", "tunnel", "add", (char *)tun_dev, "mode", "sit",
684 "remote", ip,
685 "local", (char *)wanip,
686 "ttl", nvram_safe_get("ipv6_tun_ttl"));
688 eval("ip", "link", "set", (char *)tun_dev, "mtu", (char *)mtu, "up");
689 nvram_set("ipv6_ifname", (char *)tun_dev);
691 if (service == IPV6_ANYCAST_6TO4) {
692 add_ip6_lanaddr();
693 addr4.s_addr = 0;
694 memset(&addr, 0, sizeof(addr));
695 inet_aton(wanip, &addr4);
696 addr.s6_addr16[0] = htons(0x2002);
697 ipv6_mapaddr4(&addr, 16, &addr4, 0);
698 addr.s6_addr16[7] = htons(0x0001);
699 inet_ntop(AF_INET6, &addr, ip, sizeof(ip));
700 strncat(ip, "/16", sizeof(ip));
702 else {
703 snprintf(ip, sizeof(ip), "%s/%d",
704 nvram_safe_get("ipv6_tun_addr"),
705 nvram_get_int("ipv6_tun_addrlen") ? : 64);
707 eval("ip", "addr", "add", ip, "dev", (char *)tun_dev);
708 eval("ip", "route", "add", "::/0", "dev", (char *)tun_dev);
710 // (re)start radvd - now dnsmasq provided
711 if (service == IPV6_ANYCAST_6TO4)
712 start_dnsmasq();
715 void stop_ipv6_tunnel(void)
717 eval("ip", "tunnel", "del", (char *)get_wan6face());
718 if (get_ipv6_service() == IPV6_ANYCAST_6TO4) {
719 // get rid of old IPv6 address from lan iface
720 eval("ip", "-6", "addr", "flush", "dev", nvram_safe_get("lan_ifname"), "scope", "global");
722 modprobe_r("sit");
725 void start_6rd_tunnel(void)
727 const char *tun_dev, *wanip;
728 int service, mask_len, prefix_len, local_prefix_len;
729 char mtu[10], prefix[INET6_ADDRSTRLEN], relay[INET_ADDRSTRLEN];
730 struct in_addr netmask_addr, relay_addr, relay_prefix_addr, wanip_addr;
731 struct in6_addr prefix_addr, local_prefix_addr;
732 char local_prefix[INET6_ADDRSTRLEN];
733 char tmp_ipv6[INET6_ADDRSTRLEN + 4], tmp_ipv4[INET_ADDRSTRLEN + 4];
734 char tmp[256];
735 FILE *f;
737 service = get_ipv6_service();
738 wanip = get_wanip();
739 tun_dev = get_wan6face();
740 sprintf(mtu, "%d", (nvram_get_int("wan_mtu") > 0) ? (nvram_get_int("wan_mtu") - 20) : 1280);
742 // maybe we can merge the ipv6_6rd_* variables into a single ipv_6rd_string (ala wan_6rd)
743 // to save nvram space?
744 if (service == IPV6_6RD) {
745 _dprintf("starting 6rd tunnel using manual settings.\n");
746 mask_len = nvram_get_int("ipv6_6rd_ipv4masklen");
747 prefix_len = nvram_get_int("ipv6_6rd_prefix_length");
748 strcpy(prefix, nvram_safe_get("ipv6_6rd_prefix"));
749 strcpy(relay, nvram_safe_get("ipv6_6rd_borderrelay"));
751 else {
752 _dprintf("starting 6rd tunnel using automatic settings.\n");
753 char *wan_6rd = nvram_safe_get("wan_6rd");
754 if (sscanf(wan_6rd, "%d %d %s %s", &mask_len, &prefix_len, prefix, relay) < 4) {
755 _dprintf("wan_6rd string is missing or invalid (%s)\n", wan_6rd);
756 return;
760 // validate values that were passed
761 if (mask_len < 0 || mask_len > 32) {
762 _dprintf("invalid mask_len value (%d)\n", mask_len);
763 return;
765 if (prefix_len < 0 || prefix_len > 128) {
766 _dprintf("invalid prefix_len value (%d)\n", prefix_len);
767 return;
769 if ((32 - mask_len) + prefix_len > 128) {
770 _dprintf("invalid combination of mask_len and prefix_len!\n");
771 return;
774 sprintf(tmp, "ping -q -c 2 %s | grep packet", relay);
775 if ((f = popen(tmp, "r")) == NULL) {
776 _dprintf("error obtaining data\n");
777 return;
779 fgets(tmp, sizeof(tmp), f);
780 pclose(f);
781 if (strstr(tmp, " 0% packet loss") == NULL) {
782 _dprintf("failed to ping border relay\n");
783 return;
786 // get relay prefix from border relay address and mask
787 netmask_addr.s_addr = htonl(0xffffffff << (32 - mask_len));
788 inet_aton(relay, &relay_addr);
789 relay_prefix_addr.s_addr = relay_addr.s_addr & netmask_addr.s_addr;
791 // calculate the local prefix
792 inet_pton(AF_INET6, prefix, &prefix_addr);
793 inet_pton(AF_INET, wanip, &wanip_addr);
794 if (calc_6rd_local_prefix(&prefix_addr, prefix_len, mask_len,
795 &wanip_addr, &local_prefix_addr, &local_prefix_len) == 0) {
796 _dprintf("error calculating local prefix.");
797 return;
799 inet_ntop(AF_INET6, &local_prefix_addr, local_prefix, sizeof(local_prefix));
801 snprintf(tmp_ipv6, sizeof(tmp_ipv6), "%s1", local_prefix);
802 nvram_set("ipv6_rtr_addr", tmp_ipv6);
803 nvram_set("ipv6_prefix", local_prefix);
805 // load sit module needed for the 6rd tunnel
806 modprobe("sit");
808 // creating the 6rd tunnel
809 eval("ip", "tunnel", "add", (char *)tun_dev, "mode", "sit", "local", (char *)wanip, "ttl", nvram_safe_get("ipv6_tun_ttl"));
811 snprintf(tmp_ipv6, sizeof(tmp_ipv6), "%s/%d", prefix, prefix_len);
812 snprintf(tmp_ipv4, sizeof(tmp_ipv4), "%s/%d", inet_ntoa(relay_prefix_addr), mask_len);
813 eval("ip", "tunnel" "6rd", "dev", (char *)tun_dev, "6rd-prefix", tmp_ipv6, "6rd-relay_prefix", tmp_ipv4);
815 // bringing up the link
816 eval("ip", "link", "set", "dev", (char *)tun_dev, "mtu", (char *)mtu, "up");
818 // setting the WAN address Note: IPv6 WAN CIDR should be: ((32 - ip6rd_ipv4masklen) + ip6rd_prefixlen)
819 snprintf(tmp_ipv6, sizeof(tmp_ipv6), "%s1/%d", local_prefix, local_prefix_len);
820 eval("ip", "-6", "addr", "add", tmp_ipv6, "dev", (char *)tun_dev);
822 // setting the LAN address Note: IPv6 LAN CIDR should be 64
823 snprintf(tmp_ipv6, sizeof(tmp_ipv6), "%s1/%d", local_prefix, nvram_get_int("ipv6_prefix_length") ? : 64);
824 eval("ip", "-6", "addr", "add", tmp_ipv6, "dev", nvram_safe_get("lan_ifname"));
826 // adding default route via the border relay
827 snprintf(tmp_ipv6, sizeof(tmp_ipv6), "::%s", relay);
828 eval("ip", "-6", "route", "add", "default", "via", tmp_ipv6, "dev", (char *)tun_dev);
830 nvram_set("ipv6_ifname", (char *)tun_dev);
832 // (re)start radvd now dnsmasq
833 start_dnsmasq();
835 printf("6rd end\n");
838 void stop_6rd_tunnel(void)
840 eval("ip", "tunnel", "del", (char *)get_wan6face());
841 eval("ip", "-6", "addr", "flush", "dev", nvram_safe_get("lan_ifname"), "scope", "global");
842 modprobe_r("sit");
846 void start_ipv6(void)
848 int service;
850 service = get_ipv6_service();
851 enable_ip6_forward();
853 // Check if turned on
854 switch (service) {
855 case IPV6_NATIVE:
856 case IPV6_6IN4:
857 case IPV6_MANUAL:
858 add_ip6_lanaddr();
859 break;
860 case IPV6_NATIVE_DHCP:
861 case IPV6_ANYCAST_6TO4:
862 nvram_set("ipv6_rtr_addr", "");
863 nvram_set("ipv6_prefix", "");
864 break;
867 if (service != IPV6_DISABLED) {
868 if ((nvram_get_int("ipv6_accept_ra") & 2) != 0 && !nvram_get_int("ipv6_radvd"))
869 accept_ra(nvram_safe_get("lan_ifname"));
873 void stop_ipv6(void)
875 stop_ipv6_tunnel();
876 stop_dhcp6c();
877 eval("ip", "-6", "addr", "flush", "scope", "global");
878 eval("ip", "-6", "route", "flush", "scope", "global");
881 #endif
883 // -----------------------------------------------------------------------------
885 void start_upnp(void)
887 if (getpid() != 1) {
888 start_service("upnp");
889 return;
892 if (get_wan_proto() == WP_DISABLED) return;
894 int enable;
895 FILE *f;
896 int upnp_port;
898 if (((enable = nvram_get_int("upnp_enable")) & 3) != 0) {
899 mkdir("/etc/upnp", 0777);
900 if (f_exists("/etc/upnp/config.alt")) {
901 xstart("miniupnpd", "-f", "/etc/upnp/config.alt");
903 else {
904 if ((f = fopen("/etc/upnp/config", "w")) != NULL) {
905 upnp_port = nvram_get_int("upnp_port");
906 if ((upnp_port < 0) || (upnp_port >= 0xFFFF)) upnp_port = 0;
909 fprintf(f,
910 "ext_ifname=%s\n"
911 "port=%d\n"
912 "enable_upnp=%s\n"
913 "enable_natpmp=%s\n"
914 "secure_mode=%s\n"
915 "upnp_forward_chain=upnp\n"
916 "upnp_nat_chain=upnp\n"
917 "notify_interval=%d\n"
918 "system_uptime=yes\n"
919 "friendly_name=%s"" Router\n"
920 "model_name=%s\n"
921 "model_url=http://linksysinfo.org/index.php?forums/tomato-firmware.33/\n"
922 "manufacturer_name=Tomato Firmware\n"
923 "manufacturer_url=http://linksysinfo.org/index.php?forums/tomato-firmware.33/\n"
924 "\n"
926 get_wanface(),
927 upnp_port,
928 (enable & 1) ? "yes" : "no", // upnp enable
929 (enable & 2) ? "yes" : "no", // natpmp enable
930 nvram_get_int("upnp_secure") ? "yes" : "no", // secure_mode (only forward to self)
931 nvram_get_int("upnp_ssdp_interval"),
932 nvram_safe_get("router_name"),
933 nvram_safe_get("t_model_name")
936 if (nvram_get_int("upnp_clean")) {
937 int interval = nvram_get_int("upnp_clean_interval");
938 if (interval < 60) interval = 60;
939 fprintf(f,
940 "clean_ruleset_interval=%d\n"
941 "clean_ruleset_threshold=%d\n",
942 interval,
943 nvram_get_int("upnp_clean_threshold")
946 else
947 fprintf(f,"clean_ruleset_interval=0\n");
949 if (nvram_match("upnp_mnp", "1")) {
950 int https = nvram_get_int("https_enable");
951 fprintf(f, "presentation_url=http%s://%s:%s/forward-upnp.asp\n",
952 https ? "s" : "", nvram_safe_get("lan_ipaddr"),
953 nvram_safe_get(https ? "https_lanport" : "http_lanport"));
955 else {
956 // Empty parameters are not included into XML service description
957 fprintf(f, "presentation_url=\n");
960 char uuid[45];
961 f_read_string("/proc/sys/kernel/random/uuid", uuid, sizeof(uuid));
962 fprintf(f, "uuid=%s\n", uuid);
964 // shibby - move custom configuration before "allow" statements
965 // discussion: http://www.linksysinfo.org/index.php?threads/miniupnpd-custom-config-syntax.70863/#post-256291
966 fappend(f, "/etc/upnp/config.custom");
967 fprintf(f, "%s\n", nvram_safe_get("upnp_custom"));
969 char lanN_ipaddr[] = "lanXX_ipaddr";
970 char lanN_netmask[] = "lanXX_netmask";
971 char upnp_lanN[] = "upnp_lanXX";
972 char br;
974 for(br=0 ; br<4 ; br++) {
975 char bridge[2] = "0";
976 if (br!=0)
977 bridge[0]+=br;
978 else
979 strcpy(bridge, "");
981 sprintf(lanN_ipaddr, "lan%s_ipaddr", bridge);
982 sprintf(lanN_netmask, "lan%s_netmask", bridge);
983 sprintf(upnp_lanN, "upnp_lan%s", bridge);
985 char *lanip = nvram_safe_get(lanN_ipaddr);
986 char *lanmask = nvram_safe_get(lanN_netmask);
987 char *lanlisten = nvram_safe_get(upnp_lanN);
989 if((strcmp(lanlisten,"1")==0) && (strcmp(lanip,"")!=0) && (strcmp(lanip,"0.0.0.0")!=0)) {
990 fprintf(f,
991 "listening_ip=%s/%s\n",
992 lanip, lanmask);
993 int ports[4];
994 if ((ports[0] = nvram_get_int("upnp_min_port_int")) > 0 &&
995 (ports[1] = nvram_get_int("upnp_max_port_int")) > 0 &&
996 (ports[2] = nvram_get_int("upnp_min_port_ext")) > 0 &&
997 (ports[3] = nvram_get_int("upnp_max_port_ext")) > 0) {
998 fprintf(f,
999 "allow %d-%d %s/%s %d-%d\n",
1000 ports[0], ports[1],
1001 lanip, lanmask,
1002 ports[2], ports[3]
1005 else {
1006 // by default allow only redirection of ports above 1024
1007 fprintf(f, "allow 1024-65535 %s/%s 1024-65535\n", lanip, lanmask);
1011 fprintf(f, "\ndeny 0-65535 0.0.0.0/0 0-65535\n");
1012 fclose(f);
1014 xstart("miniupnpd", "-f", "/etc/upnp/config");
1020 void stop_upnp(void)
1022 if (getpid() != 1) {
1023 stop_service("upnp");
1024 return;
1027 killall_tk("miniupnpd");
1030 // -----------------------------------------------------------------------------
1032 static pid_t pid_crond = -1;
1034 void start_cron(void)
1036 stop_cron();
1038 eval("crond", nvram_contains_word("log_events", "crond") ? NULL : "-l", "9");
1039 if (!nvram_contains_word("debug_norestart", "crond")) {
1040 pid_crond = -2;
1044 void stop_cron(void)
1046 pid_crond = -1;
1047 killall_tk("crond");
1050 // -----------------------------------------------------------------------------
1051 #ifdef LINUX26
1053 static pid_t pid_hotplug2 = -1;
1055 void start_hotplug2()
1057 stop_hotplug2();
1059 f_write_string("/proc/sys/kernel/hotplug", "", FW_NEWLINE, 0);
1060 xstart("hotplug2", "--persistent", "--no-coldplug");
1061 // FIXME: Don't remember exactly why I put "sleep" here -
1062 // but it was not for a race with check_services()... - TB
1063 sleep(1);
1065 if (!nvram_contains_word("debug_norestart", "hotplug2")) {
1066 pid_hotplug2 = -2;
1070 void stop_hotplug2(void)
1072 pid_hotplug2 = -1;
1073 killall_tk("hotplug2");
1076 #endif /* LINUX26 */
1077 // -----------------------------------------------------------------------------
1079 // Written by Sparq in 2002/07/16
1080 void start_zebra(void)
1082 #ifdef TCONFIG_ZEBRA
1083 if (getpid() != 1) {
1084 start_service("zebra");
1085 return;
1088 FILE *fp;
1090 char *lan_tx = nvram_safe_get("dr_lan_tx");
1091 char *lan_rx = nvram_safe_get("dr_lan_rx");
1092 char *lan1_tx = nvram_safe_get("dr_lan1_tx");
1093 char *lan1_rx = nvram_safe_get("dr_lan1_rx");
1094 char *lan2_tx = nvram_safe_get("dr_lan2_tx");
1095 char *lan2_rx = nvram_safe_get("dr_lan2_rx");
1096 char *lan3_tx = nvram_safe_get("dr_lan3_tx");
1097 char *lan3_rx = nvram_safe_get("dr_lan3_rx");
1098 char *wan_tx = nvram_safe_get("dr_wan_tx");
1099 char *wan_rx = nvram_safe_get("dr_wan_rx");
1101 if ((*lan_tx == '0') && (*lan_rx == '0') &&
1102 (*lan1_tx == '0') && (*lan1_rx == '0') &&
1103 (*lan2_tx == '0') && (*lan2_rx == '0') &&
1104 (*lan3_tx == '0') && (*lan3_rx == '0') &&
1105 (*wan_tx == '0') && (*wan_rx == '0')) {
1106 return;
1109 // empty
1110 if ((fp = fopen("/etc/zebra.conf", "w")) != NULL) {
1111 fclose(fp);
1115 if ((fp = fopen("/etc/ripd.conf", "w")) != NULL) {
1116 char *lan_ifname = nvram_safe_get("lan_ifname");
1117 char *lan1_ifname = nvram_safe_get("lan1_ifname");
1118 char *lan2_ifname = nvram_safe_get("lan2_ifname");
1119 char *lan3_ifname = nvram_safe_get("lan3_ifname");
1120 char *wan_ifname = nvram_safe_get("wan_ifname");
1122 fprintf(fp, "router rip\n");
1123 if(strcmp(lan_ifname,"")!=0)
1124 fprintf(fp, "network %s\n", lan_ifname);
1125 if(strcmp(lan1_ifname,"")!=0)
1126 fprintf(fp, "network %s\n", lan1_ifname);
1127 if(strcmp(lan2_ifname,"")!=0)
1128 fprintf(fp, "network %s\n", lan2_ifname);
1129 if(strcmp(lan3_ifname,"")!=0)
1130 fprintf(fp, "network %s\n", lan3_ifname);
1131 fprintf(fp, "network %s\n", wan_ifname);
1132 fprintf(fp, "redistribute connected\n");
1133 //fprintf(fp, "redistribute static\n");
1135 // 43011: modify by zg 2006.10.18 for cdrouter3.3 item 173(cdrouter_rip_30) bug
1136 // fprintf(fp, "redistribute kernel\n"); // 1.11: removed, redistributes indirect -- zzz
1138 if(strcmp(lan_ifname,"")!=0) {
1139 fprintf(fp, "interface %s\n", lan_ifname);
1140 if (*lan_tx != '0') fprintf(fp, "ip rip send version %s\n", lan_tx);
1141 if (*lan_rx != '0') fprintf(fp, "ip rip receive version %s\n", lan_rx);
1143 if(strcmp(lan1_ifname,"")!=0) {
1144 fprintf(fp, "interface %s\n", lan1_ifname);
1145 if (*lan1_tx != '0') fprintf(fp, "ip rip send version %s\n", lan1_tx);
1146 if (*lan1_rx != '0') fprintf(fp, "ip rip receive version %s\n", lan1_rx);
1148 if(strcmp(lan2_ifname,"")!=0) {
1149 fprintf(fp, "interface %s\n", lan2_ifname);
1150 if (*lan2_tx != '0') fprintf(fp, "ip rip send version %s\n", lan2_tx);
1151 if (*lan2_rx != '0') fprintf(fp, "ip rip receive version %s\n", lan2_rx);
1153 if(strcmp(lan3_ifname,"")!=0) {
1154 fprintf(fp, "interface %s\n", lan3_ifname);
1155 if (*lan3_tx != '0') fprintf(fp, "ip rip send version %s\n", lan3_tx);
1156 if (*lan3_rx != '0') fprintf(fp, "ip rip receive version %s\n", lan3_rx);
1158 fprintf(fp, "interface %s\n", wan_ifname);
1159 if (*wan_tx != '0') fprintf(fp, "ip rip send version %s\n", wan_tx);
1160 if (*wan_rx != '0') fprintf(fp, "ip rip receive version %s\n", wan_rx);
1162 fprintf(fp, "router rip\n");
1163 if(strcmp(lan_ifname,"")!=0) {
1164 if (*lan_tx == '0') fprintf(fp, "distribute-list private out %s\n", lan_ifname);
1165 if (*lan_rx == '0') fprintf(fp, "distribute-list private in %s\n", lan_ifname);
1167 if(strcmp(lan1_ifname,"")!=0) {
1168 if (*lan1_tx == '0') fprintf(fp, "distribute-list private out %s\n", lan1_ifname);
1169 if (*lan1_rx == '0') fprintf(fp, "distribute-list private in %s\n", lan1_ifname);
1171 if(strcmp(lan2_ifname,"")!=0) {
1172 if (*lan2_tx == '0') fprintf(fp, "distribute-list private out %s\n", lan2_ifname);
1173 if (*lan2_rx == '0') fprintf(fp, "distribute-list private in %s\n", lan2_ifname);
1175 if(strcmp(lan3_ifname,"")!=0) {
1176 if (*lan3_tx == '0') fprintf(fp, "distribute-list private out %s\n", lan3_ifname);
1177 if (*lan3_rx == '0') fprintf(fp, "distribute-list private in %s\n", lan3_ifname);
1179 if (*wan_tx == '0') fprintf(fp, "distribute-list private out %s\n", wan_ifname);
1180 if (*wan_rx == '0') fprintf(fp, "distribute-list private in %s\n", wan_ifname);
1181 fprintf(fp, "access-list private deny any\n");
1183 //fprintf(fp, "debug rip events\n");
1184 //fprintf(fp, "log file /etc/ripd.log\n");
1185 fclose(fp);
1188 xstart("zebra", "-d");
1189 xstart("ripd", "-d");
1190 #endif
1193 void stop_zebra(void)
1195 #ifdef TCONFIG_ZEBRA
1196 if (getpid() != 1) {
1197 stop_service("zebra");
1198 return;
1201 killall("zebra", SIGTERM);
1202 killall("ripd", SIGTERM);
1204 unlink("/etc/zebra.conf");
1205 unlink("/etc/ripd.conf");
1206 #endif
1209 // -----------------------------------------------------------------------------
1211 void start_syslog(void)
1213 char *argv[16];
1214 int argc;
1215 char *nv;
1216 char *b_opt = "";
1217 char rem[256];
1218 int n;
1219 char s[64];
1220 char cfg[256];
1221 char *rot_siz = "50";
1222 char *rot_keep = "1";
1223 char *log_file_path;
1225 argv[0] = "syslogd";
1226 argc = 1;
1228 if (nvram_match("log_remote", "1")) {
1229 nv = nvram_safe_get("log_remoteip");
1230 if (*nv) {
1231 snprintf(rem, sizeof(rem), "%s:%s", nv, nvram_safe_get("log_remoteport"));
1232 argv[argc++] = "-R";
1233 argv[argc++] = rem;
1237 if (nvram_match("log_file", "1")) {
1238 argv[argc++] = "-L";
1240 if (strcmp(nvram_safe_get("log_file_size"), "") != 0) {
1241 rot_siz = nvram_safe_get("log_file_size");
1243 if (nvram_get_int("log_file_size") > 0) {
1244 rot_keep = nvram_safe_get("log_file_keep");
1247 // log to custom path - shibby
1248 if (nvram_match("log_file_custom", "1")) {
1249 log_file_path = nvram_safe_get("log_file_path");
1250 argv[argc++] = "-s";
1251 argv[argc++] = rot_siz;
1252 argv[argc++] = "-O";
1253 argv[argc++] = log_file_path;
1254 if (strcmp(nvram_safe_get("log_file_path"), "/var/log/messages") != 0) {
1255 remove("/var/log/messages");
1256 symlink(log_file_path, "/var/log/messages");
1259 else
1261 /* Read options: rotate_size(kb) num_backups logfilename.
1262 * Ignore these settings and use defaults if the logfile cannot be written to.
1264 if (f_read_string("/etc/syslogd.cfg", cfg, sizeof(cfg)) > 0) {
1265 if ((nv = strchr(cfg, '\n')))
1266 *nv = 0;
1268 if ((nv = strtok(cfg, " \t"))) {
1269 if (isdigit(*nv))
1270 rot_siz = nv;
1273 if ((nv = strtok(NULL, " \t")))
1274 b_opt = nv;
1276 if ((nv = strtok(NULL, " \t")) && *nv == '/') {
1277 if (f_write(nv, cfg, 0, FW_APPEND, 0) >= 0) {
1278 argv[argc++] = "-O";
1279 argv[argc++] = nv;
1281 else {
1282 rot_siz = "50";
1283 b_opt = "";
1288 if (nvram_match("log_file_custom", "0")) {
1289 argv[argc++] = "-s";
1290 argv[argc++] = rot_siz;
1291 struct stat sb;
1292 if (lstat("/var/log/messages", &sb) != -1)
1293 if (S_ISLNK(sb.st_mode))
1294 remove("/var/log/messages");
1297 if (isdigit(*b_opt)) {
1298 argv[argc++] = "-b";
1299 argv[argc++] = b_opt;
1300 } else
1301 if (nvram_get_int("log_file_size") > 0) {
1302 argv[argc++] = "-b";
1303 argv[argc++] = rot_keep;
1307 if (argc > 1) {
1308 argv[argc] = NULL;
1309 _eval(argv, NULL, 0, NULL);
1311 argv[0] = "klogd";
1312 argv[1] = NULL;
1313 _eval(argv, NULL, 0, NULL);
1315 // used to be available in syslogd -m
1316 n = nvram_get_int("log_mark");
1317 if (n > 0) {
1318 // n is in minutes
1319 if (n < 60)
1320 sprintf(rem, "*/%d * * * *", n);
1321 else if (n < 60 * 24)
1322 sprintf(rem, "0 */%d * * *", n / 60);
1323 else
1324 sprintf(rem, "0 0 */%d * *", n / (60 * 24));
1325 sprintf(s, "%s logger -p syslog.info -- -- MARK --", rem);
1326 eval("cru", "a", "syslogdmark", s);
1328 else {
1329 eval("cru", "d", "syslogdmark");
1334 void stop_syslog(void)
1336 killall("klogd", SIGTERM);
1337 killall("syslogd", SIGTERM);
1340 // -----------------------------------------------------------------------------
1342 static pid_t pid_igmp = -1;
1344 void start_igmp_proxy(void)
1346 FILE *fp;
1348 pid_igmp = -1;
1349 if (nvram_match("multicast_pass", "1")) {
1350 if (get_wan_proto() == WP_DISABLED)
1351 return;
1353 if (f_exists("/etc/igmp.alt")) {
1354 eval("igmpproxy", "/etc/igmp.alt");
1356 else if ((fp = fopen("/etc/igmp.conf", "w")) != NULL) {
1357 fprintf(fp,
1358 "quickleave\n"
1359 "phyint %s upstream\n"
1360 "\taltnet %s\n",
1361 // "phyint %s downstream ratelimit 0\n",
1362 get_wanface(),
1363 nvram_get("multicast_altnet") ? : "0.0.0.0/0");
1364 // nvram_safe_get("lan_ifname"));
1366 char lanN_ifname[] = "lanXX_ifname";
1367 char multicast_lanN[] = "multicast_lanXX";
1368 char br;
1370 for(br=0 ; br<4 ; br++) {
1371 char bridge[2] = "0";
1372 if (br!=0)
1373 bridge[0]+=br;
1374 else
1375 strcpy(bridge, "");
1377 sprintf(lanN_ifname, "lan%s_ifname", bridge);
1378 sprintf(multicast_lanN, "multicast_lan%s", bridge);
1380 if((strcmp(nvram_safe_get(multicast_lanN),"1")==0) && (strcmp(nvram_safe_get(lanN_ifname),"")!=0)) {
1381 fprintf(fp,
1382 "phyint %s downstream ratelimit 0\n",
1383 nvram_safe_get(lanN_ifname));
1386 fclose(fp);
1387 eval("igmpproxy", "/etc/igmp.conf");
1389 else {
1390 return;
1392 if (!nvram_contains_word("debug_norestart", "igmprt")) {
1393 pid_igmp = -2;
1398 void stop_igmp_proxy(void)
1400 pid_igmp = -1;
1401 killall_tk("igmpproxy");
1404 // -----------------------------------------------------------------------------
1406 void start_udpxy(void)
1408 if (nvram_match("udpxy_enable", "1")) {
1409 if (get_wan_proto() == WP_DISABLED)
1410 return;
1411 eval("udpxy", (nvram_get_int("udpxy_stats") ? "-S" : ""), "-p", nvram_safe_get("udpxy_port"), "-c", nvram_safe_get("udpxy_clients"), "-m", nvram_safe_get("wan_ifname") );
1415 void stop_udpxy(void)
1417 killall_tk("udpxy");
1420 // -----------------------------------------------------------------------------
1422 #ifdef TCONFIG_NOCAT
1424 static pid_t pid_splashd = -1;
1425 void start_splashd(void)
1427 pid_splashd = -1;
1428 start_nocat();
1429 if (!nvram_contains_word("debug_norestart", "splashd")) {
1430 pid_splashd = -2;
1434 void stop_splashd(void)
1436 pid_splashd = -1;
1437 stop_nocat();
1438 start_wan(BOOT);
1440 #endif
1442 // -----------------------------------------------------------------------------
1443 #ifdef TCONFIG_NGINX
1445 static pid_t pid_nginx = -1;
1446 void start_enginex(void)
1448 pid_nginx =-1;
1449 start_nginx();
1450 if (!nvram_contains_word("debug_norestart","enginex")) {
1451 pid_nginx = -2;
1455 void stop_enginex(void)
1457 pid_nginx = -1;
1458 stop_nginx();
1461 void start_nginxfastpath(void)
1463 pid_nginx =-1;
1464 start_nginxfp();
1465 if (!nvram_contains_word("debug_norestart","nginxfp")) {
1466 pid_nginx = -2;
1469 void stop_nginxfastpath(void)
1471 pid_nginx = -1;
1472 stop_nginxfp();
1474 #endif
1476 // -----------------------------------------------------------------------------
1478 void set_tz(void)
1480 f_write_string("/etc/TZ", nvram_safe_get("tm_tz"), FW_CREATE|FW_NEWLINE, 0644);
1483 void start_ntpc(void)
1485 set_tz();
1487 stop_ntpc();
1489 if (nvram_match("dnscrypt_proxy", "1"))
1490 eval("ntp2ip");
1492 if (nvram_get_int("ntp_updates") >= 0) {
1493 xstart("ntpsync", "--init");
1497 void stop_ntpc(void)
1499 killall("ntpsync", SIGTERM);
1502 // -----------------------------------------------------------------------------
1504 static void stop_rstats(void)
1506 int n, m;
1507 int pid;
1508 int pidz;
1509 int ppidz;
1510 int w = 0;
1512 n = 60;
1513 m = 15;
1514 while ((n-- > 0) && ((pid = pidof("rstats")) > 0)) {
1515 w = 1;
1516 pidz = pidof("gzip");
1517 if (pidz < 1) pidz = pidof("cp");
1518 ppidz = ppid(ppid(pidz));
1519 if ((m > 0) && (pidz > 0) && (pid == ppidz)) {
1520 syslog(LOG_DEBUG, "rstats(PID %d) shutting down, waiting for helper process to complete(PID %d, PPID %d).\n", pid, pidz, ppidz);
1521 --m;
1522 } else {
1523 kill(pid, SIGTERM);
1525 sleep(1);
1527 if ((w == 1) && (n > 0))
1528 syslog(LOG_DEBUG, "rstats stopped.\n");
1531 static void start_rstats(int new)
1533 if (nvram_match("rstats_enable", "1")) {
1534 stop_rstats();
1535 if (new) {
1536 syslog(LOG_DEBUG, "starting rstats (new datafile).\n");
1537 xstart("rstats", "--new");
1538 } else {
1539 syslog(LOG_DEBUG, "starting rstats.\n");
1540 xstart("rstats");
1545 static void stop_cstats(void)
1547 int n, m;
1548 int pid;
1549 int pidz;
1550 int ppidz;
1551 int w = 0;
1553 n = 60;
1554 m = 15;
1555 while ((n-- > 0) && ((pid = pidof("cstats")) > 0)) {
1556 w = 1;
1557 pidz = pidof("gzip");
1558 if (pidz < 1) pidz = pidof("cp");
1559 ppidz = ppid(ppid(pidz));
1560 if ((m > 0) && (pidz > 0) && (pid == ppidz)) {
1561 syslog(LOG_DEBUG, "cstats(PID %d) shutting down, waiting for helper process to complete(PID %d, PPID %d).\n", pid, pidz, ppidz);
1562 --m;
1563 } else {
1564 kill(pid, SIGTERM);
1566 sleep(1);
1568 if ((w == 1) && (n > 0))
1569 syslog(LOG_DEBUG, "cstats stopped.\n");
1572 static void start_cstats(int new)
1574 if (nvram_match("cstats_enable", "1")) {
1575 stop_cstats();
1576 if (new) {
1577 syslog(LOG_DEBUG, "starting cstats (new datafile).\n");
1578 xstart("cstats", "--new");
1579 } else {
1580 syslog(LOG_DEBUG, "starting cstats.\n");
1581 xstart("cstats");
1586 // -----------------------------------------------------------------------------
1588 // !!TB - FTP Server
1590 #ifdef TCONFIG_FTP
1591 static char *get_full_storage_path(char *val)
1593 static char buf[128];
1594 int len;
1596 if (val[0] == '/')
1597 len = sprintf(buf, "%s", val);
1598 else
1599 len = sprintf(buf, "%s/%s", MOUNT_ROOT, val);
1601 if (len > 1 && buf[len - 1] == '/')
1602 buf[len - 1] = 0;
1604 return buf;
1607 static char *nvram_storage_path(char *var)
1609 char *val = nvram_safe_get(var);
1610 return get_full_storage_path(val);
1613 char vsftpd_conf[] = "/etc/vsftpd.conf";
1614 char vsftpd_users[] = "/etc/vsftpd.users";
1615 char vsftpd_passwd[] = "/etc/vsftpd.passwd";
1617 /* VSFTPD code mostly stolen from Oleg's ASUS Custom Firmware GPL sources */
1619 static void start_ftpd(void)
1621 char tmp[256];
1622 FILE *fp, *f;
1623 char *buf;
1624 char *p, *q;
1625 int i;
1626 char *user, *pass, *rights, *root_dir;
1628 if (getpid() != 1) {
1629 start_service("ftpd");
1630 return;
1633 if (!nvram_get_int("ftp_enable")) return;
1635 mkdir_if_none(vsftpd_users);
1636 mkdir_if_none("/var/run/vsftpd");
1638 if ((fp = fopen(vsftpd_conf, "w")) == NULL)
1639 return;
1641 if (nvram_get_int("ftp_super"))
1643 /* rights */
1644 sprintf(tmp, "%s/%s", vsftpd_users, "admin");
1645 if ((f = fopen(tmp, "w")))
1647 fprintf(f,
1648 "dirlist_enable=yes\n"
1649 "write_enable=yes\n"
1650 "download_enable=yes\n");
1651 fclose(f);
1655 if (nvram_invmatch("ftp_anonymous", "0"))
1657 fprintf(fp,
1658 "anon_allow_writable_root=yes\n"
1659 "anon_world_readable_only=no\n"
1660 "anon_umask=022\n");
1662 /* rights */
1663 sprintf(tmp, "%s/ftp", vsftpd_users);
1664 if ((f = fopen(tmp, "w")))
1666 if (nvram_match("ftp_dirlist", "0"))
1667 fprintf(f, "dirlist_enable=yes\n");
1668 if (nvram_match("ftp_anonymous", "1") ||
1669 nvram_match("ftp_anonymous", "3"))
1670 fprintf(f, "write_enable=yes\n");
1671 if (nvram_match("ftp_anonymous", "1") ||
1672 nvram_match("ftp_anonymous", "2"))
1673 fprintf(f, "download_enable=yes\n");
1674 fclose(f);
1676 if (nvram_match("ftp_anonymous", "1") ||
1677 nvram_match("ftp_anonymous", "3"))
1678 fprintf(fp,
1679 "anon_upload_enable=yes\n"
1680 "anon_mkdir_write_enable=yes\n"
1681 "anon_other_write_enable=yes\n");
1682 } else {
1683 fprintf(fp, "anonymous_enable=no\n");
1686 fprintf(fp,
1687 "dirmessage_enable=yes\n"
1688 "download_enable=no\n"
1689 "dirlist_enable=no\n"
1690 "hide_ids=yes\n"
1691 "syslog_enable=yes\n"
1692 "local_enable=yes\n"
1693 "local_umask=022\n"
1694 "chmod_enable=no\n"
1695 "chroot_local_user=yes\n"
1696 "check_shell=no\n"
1697 "log_ftp_protocol=%s\n"
1698 "user_config_dir=%s\n"
1699 "passwd_file=%s\n"
1700 "listen%s=yes\n"
1701 "listen%s=no\n"
1702 "listen_port=%s\n"
1703 "background=yes\n"
1704 "isolate=no\n"
1705 "max_clients=%d\n"
1706 "max_per_ip=%d\n"
1707 "max_login_fails=1\n"
1708 "idle_session_timeout=%s\n"
1709 "use_sendfile=no\n"
1710 "anon_max_rate=%d\n"
1711 "local_max_rate=%d\n"
1712 "%s\n",
1713 nvram_get_int("log_ftp") ? "yes" : "no",
1714 vsftpd_users, vsftpd_passwd,
1715 #ifdef TCONFIG_IPV6
1716 ipv6_enabled() ? "_ipv6" : "",
1717 ipv6_enabled() ? "" : "_ipv6",
1718 #else
1720 "_ipv6",
1721 #endif
1722 nvram_get("ftp_port") ? : "21",
1723 nvram_get_int("ftp_max"),
1724 nvram_get_int("ftp_ipmax"),
1725 nvram_get("ftp_staytimeout") ? : "300",
1726 nvram_get_int("ftp_anonrate") * 1024,
1727 nvram_get_int("ftp_rate") * 1024,
1728 nvram_safe_get("ftp_custom"));
1730 fclose(fp);
1732 /* prepare passwd file and default users */
1733 if ((fp = fopen(vsftpd_passwd, "w")) == NULL)
1734 return;
1736 if (((user = nvram_get("http_username")) == NULL) || (*user == 0)) user = "admin";
1737 if (((pass = nvram_get("http_passwd")) == NULL) || (*pass == 0)) pass = "admin";
1739 fprintf(fp, /* anonymous, admin, nobody */
1740 "ftp:x:0:0:ftp:%s:/sbin/nologin\n"
1741 "%s:%s:0:0:root:/:/sbin/nologin\n"
1742 "nobody:x:65534:65534:nobody:%s/:/sbin/nologin\n",
1743 nvram_storage_path("ftp_anonroot"), user,
1744 nvram_get_int("ftp_super") ? crypt(pass, "$1$") : "x",
1745 MOUNT_ROOT);
1747 if ((buf = strdup(nvram_safe_get("ftp_users"))) != NULL)
1750 username<password<rights[<root_dir>]
1751 rights:
1752 Read/Write
1753 Read Only
1754 View Only
1755 Private
1757 p = buf;
1758 while ((q = strsep(&p, ">")) != NULL) {
1759 i = vstrsep(q, "<", &user, &pass, &rights, &root_dir);
1760 if (i < 3 || i > 4) continue;
1761 if (!user || !pass) continue;
1763 if (i == 3 || !root_dir || !(*root_dir))
1765 root_dir = nvram_safe_get("ftp_pubroot");
1767 /* directory */
1768 if (strncmp(rights, "Private", 7) == 0)
1770 sprintf(tmp, "%s/%s", nvram_storage_path("ftp_pvtroot"), user);
1771 mkdir_if_none(tmp);
1773 else
1774 sprintf(tmp, "%s", get_full_storage_path(root_dir));
1776 fprintf(fp, "%s:%s:0:0:%s:%s:/sbin/nologin\n",
1777 user, crypt(pass, "$1$"), user, tmp);
1779 /* rights */
1780 sprintf(tmp, "%s/%s", vsftpd_users, user);
1781 if ((f = fopen(tmp, "w")))
1783 tmp[0] = 0;
1784 if (nvram_invmatch("ftp_dirlist", "1"))
1785 strcat(tmp, "dirlist_enable=yes\n");
1786 if (strstr(rights, "Read") || !strcmp(rights, "Private"))
1787 strcat(tmp, "download_enable=yes\n");
1788 if (strstr(rights, "Write") || !strncmp(rights, "Private", 7))
1789 strcat(tmp, "write_enable=yes\n");
1791 fputs(tmp, f);
1792 fclose(f);
1795 free(buf);
1798 fclose(fp);
1799 killall("vsftpd", SIGHUP);
1801 /* start vsftpd if it's not already running */
1802 if (pidof("vsftpd") <= 0)
1803 xstart("vsftpd");
1806 static void stop_ftpd(void)
1808 if (getpid() != 1) {
1809 stop_service("ftpd");
1810 return;
1813 killall_tk("vsftpd");
1814 unlink(vsftpd_passwd);
1815 unlink(vsftpd_conf);
1816 eval("rm", "-rf", vsftpd_users);
1818 #endif // TCONFIG_FTP
1820 // -----------------------------------------------------------------------------
1822 // !!TB - Samba
1824 #ifdef TCONFIG_SAMBASRV
1825 static void kill_samba(int sig)
1827 if (sig == SIGTERM) {
1828 killall_tk("smbd");
1829 killall_tk("nmbd");
1831 else {
1832 killall("smbd", sig);
1833 killall("nmbd", sig);
1837 static void start_samba(void)
1839 FILE *fp;
1840 DIR *dir = NULL;
1841 struct dirent *dp;
1842 char nlsmod[15];
1843 int mode;
1844 char *nv;
1846 if (getpid() != 1) {
1847 start_service("smbd");
1848 return;
1851 mode = nvram_get_int("smbd_enable");
1852 if (!mode || !nvram_invmatch("lan_hostname", ""))
1853 return;
1855 if ((fp = fopen("/etc/smb.conf", "w")) == NULL)
1856 return;
1858 fprintf(fp, "[global]\n"
1859 " interfaces = %s\n"
1860 " bind interfaces only = yes\n"
1861 " workgroup = %s\n"
1862 " netbios name = %s\n"
1863 " server string = %s\n"
1864 " guest account = nobody\n"
1865 " security = user\n"
1866 " %s\n"
1867 " guest ok = %s\n"
1868 " guest only = no\n"
1869 " browseable = yes\n"
1870 " syslog only = yes\n"
1871 " timestamp logs = no\n"
1872 " syslog = 1\n"
1873 " encrypt passwords = yes\n"
1874 " preserve case = yes\n"
1875 " short preserve case = yes\n",
1876 nvram_safe_get("lan_ifname"),
1877 nvram_get("smbd_wgroup") ? : "WORKGROUP",
1878 nvram_safe_get("lan_hostname"),
1879 nvram_get("router_name") ? : "Tomato",
1880 mode == 2 ? "" : "map to guest = Bad User",
1881 mode == 2 ? "no" : "yes" // guest ok
1884 if (nvram_get_int("smbd_wins")) {
1885 nv = nvram_safe_get("wan_wins");
1886 if ((*nv == 0) || (strcmp(nv, "0.0.0.0") == 0)) {
1887 fprintf(fp, " wins support = yes\n");
1891 if (nvram_get_int("smbd_master")) {
1892 fprintf(fp,
1893 " domain master = yes\n"
1894 " local master = yes\n"
1895 " preferred master = yes\n"
1896 " os level = 65\n");
1899 nv = nvram_safe_get("smbd_cpage");
1900 if (*nv) {
1901 #ifndef TCONFIG_SAMBA3
1902 fprintf(fp, " client code page = %s\n", nv);
1903 #endif
1904 sprintf(nlsmod, "nls_cp%s", nv);
1906 nv = nvram_safe_get("smbd_nlsmod");
1907 if ((*nv) && (strcmp(nv, nlsmod) != 0))
1908 modprobe_r(nv);
1910 modprobe(nlsmod);
1911 nvram_set("smbd_nlsmod", nlsmod);
1914 #ifndef TCONFIG_SAMBA3
1915 if (nvram_match("smbd_cset", "utf8"))
1916 fprintf(fp, " coding system = utf8\n");
1917 else if (nvram_invmatch("smbd_cset", ""))
1918 fprintf(fp, " character set = %s\n", nvram_safe_get("smbd_cset"));
1919 #endif
1921 nv = nvram_safe_get("smbd_custom");
1922 /* add socket options unless overriden by the user */
1923 if (strstr(nv, "socket options") == NULL) {
1924 fprintf(fp, " socket options = TCP_NODELAY SO_KEEPALIVE IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536\n");
1926 fprintf(fp, "%s\n\n", nv);
1928 /* configure shares */
1930 char *buf;
1931 char *p, *q;
1932 char *name, *path, *comment, *writeable, *hidden;
1933 int cnt = 0;
1935 if ((buf = strdup(nvram_safe_get("smbd_shares"))) != NULL)
1937 /* sharename<path<comment<writeable[0|1]<hidden[0|1] */
1939 p = buf;
1940 while ((q = strsep(&p, ">")) != NULL) {
1941 if (vstrsep(q, "<", &name, &path, &comment, &writeable, &hidden) != 5) continue;
1942 if (!path || !name) continue;
1944 /* share name */
1945 fprintf(fp, "\n[%s]\n", name);
1947 /* path */
1948 fprintf(fp, " path = %s\n", path);
1950 /* access level */
1951 if (!strcmp(writeable, "1"))
1952 fprintf(fp, " writable = yes\n delete readonly = yes\n force user = root\n");
1953 if (!strcmp(hidden, "1"))
1954 fprintf(fp, " browseable = no\n");
1956 /* comment */
1957 if (comment)
1958 fprintf(fp, " comment = %s\n", comment);
1960 cnt++;
1962 free(buf);
1965 /* Share every mountpoint below MOUNT_ROOT */
1966 if (nvram_get_int("smbd_autoshare") && (dir = opendir(MOUNT_ROOT))) {
1967 while ((dp = readdir(dir))) {
1968 if (strcmp(dp->d_name, ".") && strcmp(dp->d_name, "..")) {
1970 /* Only if is a directory and is mounted */
1971 if (!dir_is_mountpoint(MOUNT_ROOT, dp->d_name))
1972 continue;
1974 /* smbd_autoshare: 0 - disable, 1 - read-only, 2 - writable, 3 - hidden writable */
1975 fprintf(fp, "\n[%s]\n path = %s/%s\n comment = %s\n",
1976 dp->d_name, MOUNT_ROOT, dp->d_name, dp->d_name);
1977 if (nvram_match("smbd_autoshare", "3")) // Hidden
1978 fprintf(fp, "\n[%s$]\n path = %s/%s\n browseable = no\n",
1979 dp->d_name, MOUNT_ROOT, dp->d_name);
1980 if (nvram_match("smbd_autoshare", "2") || nvram_match("smbd_autoshare", "3")) // RW
1981 fprintf(fp, " writable = yes\n delete readonly = yes\n force user = root\n");
1983 cnt++;
1987 if (dir) closedir(dir);
1989 if (cnt == 0) {
1990 /* by default share MOUNT_ROOT as read-only */
1991 fprintf(fp, "\n[share]\n"
1992 " path = %s\n"
1993 " writable = no\n",
1994 MOUNT_ROOT);
1997 fclose(fp);
1999 mkdir_if_none("/var/run/samba");
2000 mkdir_if_none("/etc/samba");
2002 /* write smbpasswd */
2003 #ifdef TCONFIG_SAMBA3
2004 eval("smbpasswd", "nobody", "\"\"");
2005 #else
2006 eval("smbpasswd", "-a", "nobody", "\"\"");
2007 #endif
2008 if (mode == 2) {
2009 char *smbd_user;
2010 if (((smbd_user = nvram_get("smbd_user")) == NULL) || (*smbd_user == 0) || !strcmp(smbd_user, "root"))
2011 smbd_user = "nas";
2012 #ifdef TCONFIG_SAMBA3
2013 eval("smbpasswd", smbd_user, nvram_safe_get("smbd_passwd"));
2014 #else
2015 eval("smbpasswd", "-a", smbd_user, nvram_safe_get("smbd_passwd"));
2016 #endif
2019 kill_samba(SIGHUP);
2020 int ret1 = 0, ret2 = 0;
2021 /* start samba if it's not already running */
2022 if (pidof("nmbd") <= 0)
2023 ret1 = xstart("nmbd", "-D");
2024 if (pidof("smbd") <= 0)
2025 ret2 = xstart("smbd", "-D");
2027 if (ret1 || ret2) kill_samba(SIGTERM);
2030 static void stop_samba(void)
2032 if (getpid() != 1) {
2033 stop_service("smbd");
2034 return;
2037 kill_samba(SIGTERM);
2038 /* clean up */
2039 unlink("/var/log/smb");
2040 unlink("/var/log/nmb");
2041 eval("rm", "-rf", "/var/run/samba");
2043 #endif // TCONFIG_SAMBASRV
2045 #ifdef TCONFIG_MEDIA_SERVER
2046 #define MEDIA_SERVER_APP "minidlna"
2048 static void start_media_server(void)
2050 FILE *f;
2051 int port, pid, https;
2052 char *dbdir;
2053 char *argv[] = { MEDIA_SERVER_APP, "-f", "/etc/"MEDIA_SERVER_APP".conf", "-R", NULL };
2054 static int once = 1;
2056 if (getpid() != 1) {
2057 start_service("media");
2058 return;
2061 if (nvram_get_int("ms_sas") == 0)
2062 once = 0;
2064 if (nvram_get_int("ms_enable") != 0) {
2065 if ((!once) && (nvram_get_int("ms_rescan") == 0)) {
2066 // no forced rescan
2067 argv[3] = NULL;
2069 nvram_unset("ms_rescan");
2071 if (f_exists("/etc/"MEDIA_SERVER_APP".alt")) {
2072 argv[2] = "/etc/"MEDIA_SERVER_APP".alt";
2074 else {
2075 if ((f = fopen(argv[2], "w")) != NULL) {
2076 port = nvram_get_int("ms_port");
2077 https = nvram_get_int("https_enable");
2078 dbdir = nvram_safe_get("ms_dbdir");
2079 if (!(*dbdir)) dbdir = NULL;
2080 mkdir_if_none(dbdir ? : "/var/run/"MEDIA_SERVER_APP);
2082 fprintf(f,
2083 "network_interface=%s\n"
2084 "port=%d\n"
2085 "friendly_name=%s\n"
2086 "db_dir=%s/.db\n"
2087 "enable_tivo=%s\n"
2088 "strict_dlna=%s\n"
2089 "presentation_url=http%s://%s:%s/nas-media.asp\n"
2090 "inotify=yes\n"
2091 "notify_interval=600\n"
2092 "album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg\n"
2093 "log_dir=/var/log\n"
2094 "log_level=general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=warn\n"
2095 "\n",
2096 nvram_safe_get("lan_ifname"),
2097 (port < 0) || (port >= 0xffff) ? 0 : port,
2098 nvram_get("router_name") ? : "Tomato",
2099 dbdir ? : "/var/run/"MEDIA_SERVER_APP,
2100 nvram_get_int("ms_tivo") ? "yes" : "no",
2101 nvram_get_int("ms_stdlna") ? "yes" : "no",
2102 https ? "s" : "", nvram_safe_get("lan_ipaddr"), nvram_safe_get(https ? "https_lanport" : "http_lanport")
2105 // media directories
2106 char *buf, *p, *q;
2107 char *path, *restrict;
2109 if ((buf = strdup(nvram_safe_get("ms_dirs"))) != NULL) {
2110 /* path<restrict[A|V|P|] */
2112 p = buf;
2113 while ((q = strsep(&p, ">")) != NULL) {
2114 if (vstrsep(q, "<", &path, &restrict) < 1 || !path || !(*path))
2115 continue;
2116 fprintf(f, "media_dir=%s%s%s\n",
2117 restrict ? : "", (restrict && *restrict) ? "," : "", path);
2119 free(buf);
2122 fclose(f);
2126 /* start media server if it's not already running */
2127 if (pidof(MEDIA_SERVER_APP) <= 0) {
2128 if ((_eval(argv, NULL, 0, &pid) == 0) && (once)) {
2129 /* If we started the media server successfully, wait 1 sec
2130 * to let it die if it can't open the database file.
2131 * If it's still alive after that, assume it's running and
2132 * disable forced once-after-reboot rescan.
2134 sleep(1);
2135 if (pidof(MEDIA_SERVER_APP) > 0)
2136 once = 0;
2142 static void stop_media_server(void)
2144 if (getpid() != 1) {
2145 stop_service("media");
2146 return;
2149 killall_tk(MEDIA_SERVER_APP);
2151 #endif // TCONFIG_MEDIA_SERVER
2153 #ifdef TCONFIG_USB
2154 static void start_nas_services(void)
2156 if (getpid() != 1) {
2157 start_service("usbapps");
2158 return;
2161 #ifdef TCONFIG_SAMBASRV
2162 start_samba();
2163 #endif
2164 #ifdef TCONFIG_FTP
2165 start_ftpd();
2166 #endif
2167 #ifdef TCONFIG_MEDIA_SERVER
2168 start_media_server();
2169 #endif
2172 static void stop_nas_services(void)
2174 if (getpid() != 1) {
2175 stop_service("usbapps");
2176 return;
2179 #ifdef TCONFIG_MEDIA_SERVER
2180 stop_media_server();
2181 #endif
2182 #ifdef TCONFIG_FTP
2183 stop_ftpd();
2184 #endif
2185 #ifdef TCONFIG_SAMBASRV
2186 stop_samba();
2187 #endif
2190 void restart_nas_services(int stop, int start)
2192 int fd = file_lock("usb");
2193 /* restart all NAS applications */
2194 if (stop)
2195 stop_nas_services();
2196 if (start)
2197 start_nas_services();
2198 file_unlock(fd);
2200 #endif // TCONFIG_USB
2202 // -----------------------------------------------------------------------------
2204 /* -1 = Don't check for this program, it is not expected to be running.
2205 * Other = This program has been started and should be kept running. If no
2206 * process with the name is running, call func to restart it.
2207 * Note: At startup, dnsmasq forks a short-lived child which forks a
2208 * long-lived (grand)child. The parents terminate.
2209 * Many daemons use this technique.
2211 static void _check(pid_t pid, const char *name, void (*func)(void))
2213 if (pid == -1) return;
2215 if (pidof(name) > 0) return;
2217 syslog(LOG_DEBUG, "%s terminated unexpectedly, restarting.\n", name);
2218 func();
2220 // Force recheck in 500 msec
2221 setitimer(ITIMER_REAL, &pop_tv, NULL);
2224 void check_services(void)
2226 TRACE_PT("keep alive\n");
2228 // Periodically reap any zombies
2229 setitimer(ITIMER_REAL, &zombie_tv, NULL);
2231 #ifdef LINUX26
2232 _check(pid_hotplug2, "hotplug2", start_hotplug2);
2233 #endif
2234 _check(pid_dnsmasq, "dnsmasq", start_dnsmasq);
2235 _check(pid_crond, "crond", start_cron);
2236 _check(pid_igmp, "igmpproxy", start_igmp_proxy);
2238 //#ifdef TCONFIG_NOCAT
2239 // if (nvram_get_int("NC_enable"))
2240 // _check(&pid_splashd, "splashd", start_splashd);
2241 //#endif
2245 // -----------------------------------------------------------------------------
2247 void start_services(void)
2249 static int once = 1;
2251 if (once) {
2252 once = 0;
2254 if (nvram_get_int("telnetd_eas")) start_telnetd();
2255 if (nvram_get_int("sshd_eas")) start_sshd();
2258 // start_syslog();
2259 start_nas();
2260 start_zebra();
2261 #ifdef TCONFIG_SDHC
2262 start_mmc();
2263 #endif
2264 start_dnsmasq();
2265 start_cifs();
2266 start_httpd();
2267 #ifdef TCONFIG_NGINX
2268 start_enginex();
2269 start_mysql();
2270 #endif
2271 start_cron();
2272 // start_upnp();
2273 start_rstats(0);
2274 start_cstats(0);
2275 start_sched();
2276 #ifdef TCONFIG_PPTPD
2277 start_pptpd();
2278 #endif
2279 restart_nas_services(1, 1); // !!TB - Samba, FTP and Media Server
2281 #ifdef TCONFIG_SNMP
2282 start_snmp();
2283 #endif
2285 #ifdef TCONFIG_TOR
2286 start_tor();
2287 #endif
2289 #ifdef TCONFIG_BT
2290 start_bittorrent();
2291 #endif
2293 #ifdef TCONFIG_NOCAT
2294 start_splashd();
2295 #endif
2297 #ifdef TCONFIG_NFS
2298 start_nfs();
2299 #endif
2302 void stop_services(void)
2304 clear_resolv();
2306 #ifdef TCONFIG_BT
2307 stop_bittorrent();
2308 #endif
2310 #ifdef TCONFIG_NOCAT
2311 stop_splashd();
2312 #endif
2314 #ifdef TCONFIG_SNMP
2315 stop_snmp();
2316 #endif
2318 #ifdef TCONFIG_TOR
2319 stop_tor();
2320 #endif
2322 #ifdef TCONFIG_NFS
2323 stop_nfs();
2324 #endif
2325 restart_nas_services(1, 0); // stop Samba, FTP and Media Server
2326 #ifdef TCONFIG_PPTPD
2327 stop_pptpd();
2328 #endif
2329 stop_sched();
2330 stop_rstats();
2331 stop_cstats();
2332 // stop_upnp();
2333 stop_cron();
2334 stop_httpd();
2335 #ifdef TCONFIG_NGINX
2336 stop_mysql();
2337 stop_enginex();
2338 #endif
2339 #ifdef TCONFIG_SDHC
2340 stop_mmc();
2341 #endif
2342 stop_cifs();
2343 stop_dnsmasq();
2344 stop_zebra();
2345 stop_nas();
2346 // stop_syslog();
2349 // -----------------------------------------------------------------------------
2351 /* nvram "action_service" is: "service-action[-modifier]"
2352 * action is something like "stop" or "start" or "restart"
2353 * optional modifier is "c" for the "service" command-line command
2355 void exec_service(void)
2357 const int A_START = 1;
2358 const int A_STOP = 2;
2359 const int A_RESTART = 1|2;
2360 char buffer[128];
2361 char *service;
2362 char *act;
2363 char *next;
2364 char *modifier;
2365 int action, user;
2366 int i;
2368 strlcpy(buffer, nvram_safe_get("action_service"), sizeof(buffer));
2369 next = buffer;
2371 TOP:
2372 act = strsep(&next, ",");
2373 service = strsep(&act, "-");
2374 if (act == NULL) {
2375 next = NULL;
2376 goto CLEAR;
2378 modifier = act;
2379 strsep(&modifier, "-");
2381 TRACE_PT("service=%s action=%s modifier=%s\n", service, act, modifier ? : "");
2383 if (strcmp(act, "start") == 0) action = A_START;
2384 else if (strcmp(act, "stop") == 0) action = A_STOP;
2385 else if (strcmp(act, "restart") == 0) action = A_RESTART;
2386 else action = 0;
2387 user = (modifier != NULL && *modifier == 'c');
2389 if (strcmp(service, "dhcpc") == 0) {
2390 if (action & A_STOP) stop_dhcpc();
2391 if (action & A_START) start_dhcpc();
2392 goto CLEAR;
2395 if ((strcmp(service, "dhcpd") == 0) || (strcmp(service, "dns") == 0) || (strcmp(service, "dnsmasq") == 0)) {
2396 if (action & A_STOP) stop_dnsmasq();
2397 if (action & A_START) {
2398 dns_to_resolv();
2399 start_dnsmasq();
2401 goto CLEAR;
2404 if (strcmp(service, "firewall") == 0) {
2405 if (action & A_STOP) {
2406 stop_firewall();
2407 stop_igmp_proxy();
2408 stop_udpxy();
2410 if (action & A_START) {
2411 start_firewall();
2412 start_igmp_proxy();
2413 start_udpxy();
2415 goto CLEAR;
2418 if (strcmp(service, "restrict") == 0) {
2419 if (action & A_STOP) {
2420 stop_firewall();
2422 if (action & A_START) {
2423 i = nvram_get_int("rrules_radio"); // -1 = not used, 0 = enabled by rule, 1 = disabled by rule
2425 start_firewall();
2427 // if radio was disabled by access restriction, but no rule is handling it now, enable it
2428 if (i == 1) {
2429 if (nvram_get_int("rrules_radio") < 0) {
2430 eval("radio", "on");
2434 goto CLEAR;
2437 if (strcmp(service, "arpbind") == 0) {
2438 if (action & A_STOP) stop_arpbind();
2439 if (action & A_START) start_arpbind();
2440 goto CLEAR;
2443 if (strcmp(service, "qos") == 0) {
2444 if (action & A_STOP) {
2445 stop_qos();
2447 stop_firewall(); start_firewall(); // always restarted
2448 if (action & A_START) {
2449 start_qos();
2450 if (nvram_match("qos_reset", "1")) f_write_string("/proc/net/clear_marks", "1", 0, 0);
2452 goto CLEAR;
2455 if (strcmp(service, "qoslimit") == 0) {
2456 if (action & A_STOP) {
2457 new_qoslimit_stop();
2459 #ifdef TCONFIG_NOCAT
2460 stop_splashd();
2461 #endif
2462 stop_firewall(); start_firewall(); // always restarted
2463 if (action & A_START) {
2464 new_qoslimit_start();
2466 #ifdef TCONFIG_NOCAT
2467 start_splashd();
2468 #endif
2469 goto CLEAR;
2472 if (strcmp(service, "upnp") == 0) {
2473 if (action & A_STOP) {
2474 stop_upnp();
2476 stop_firewall(); start_firewall(); // always restarted
2477 if (action & A_START) {
2478 start_upnp();
2480 goto CLEAR;
2483 if (strcmp(service, "telnetd") == 0) {
2484 if (action & A_STOP) stop_telnetd();
2485 if (action & A_START) start_telnetd();
2486 goto CLEAR;
2489 if (strcmp(service, "sshd") == 0) {
2490 if (action & A_STOP) stop_sshd();
2491 if (action & A_START) start_sshd();
2492 goto CLEAR;
2495 if (strcmp(service, "httpd") == 0) {
2496 if (action & A_STOP) stop_httpd();
2497 if (action & A_START) start_httpd();
2498 goto CLEAR;
2501 #ifdef TCONFIG_IPV6
2502 if (strcmp(service, "ipv6") == 0) {
2503 if (action & A_STOP) {
2504 stop_dnsmasq();
2505 stop_ipv6();
2507 if (action & A_START) {
2508 start_ipv6();
2509 start_dnsmasq();
2511 goto CLEAR;
2514 if (strncmp(service, "dhcp6", 5) == 0) {
2515 if (action & A_STOP) {
2516 stop_dhcp6c();
2518 if (action & A_START) {
2519 start_dhcp6c();
2521 goto CLEAR;
2523 #endif
2525 if (strcmp(service, "admin") == 0) {
2526 if (action & A_STOP) {
2527 stop_sshd();
2528 stop_telnetd();
2529 stop_httpd();
2531 stop_firewall(); start_firewall(); // always restarted
2532 if (action & A_START) {
2533 start_httpd();
2534 create_passwd();
2535 if (nvram_match("telnetd_eas", "1")) start_telnetd();
2536 if (nvram_match("sshd_eas", "1")) start_sshd();
2538 goto CLEAR;
2541 if (strcmp(service, "ddns") == 0) {
2542 if (action & A_STOP) stop_ddns();
2543 if (action & A_START) start_ddns();
2544 goto CLEAR;
2547 if (strcmp(service, "ntpc") == 0) {
2548 if (action & A_STOP) stop_ntpc();
2549 if (action & A_START) start_ntpc();
2550 goto CLEAR;
2553 if (strcmp(service, "logging") == 0) {
2554 if (action & A_STOP) {
2555 stop_syslog();
2557 if (action & A_START) {
2558 start_syslog();
2560 if (!user) {
2561 // always restarted except from "service" command
2562 stop_cron(); start_cron();
2563 stop_firewall(); start_firewall();
2565 goto CLEAR;
2568 if (strcmp(service, "crond") == 0) {
2569 if (action & A_STOP) {
2570 stop_cron();
2572 if (action & A_START) {
2573 start_cron();
2575 goto CLEAR;
2578 #ifdef LINUX26
2579 if (strncmp(service, "hotplug", 7) == 0) {
2580 if (action & A_STOP) {
2581 stop_hotplug2();
2583 if (action & A_START) {
2584 start_hotplug2(1);
2586 goto CLEAR;
2588 #endif
2590 if (strcmp(service, "upgrade") == 0) {
2591 if (action & A_START) {
2592 #if TOMATO_SL
2593 stop_usbevent();
2594 stop_smbd();
2595 #endif
2596 restart_nas_services(1, 0); // stop Samba, FTP and Media Server
2597 stop_jffs2();
2598 // stop_cifs();
2599 stop_zebra();
2600 stop_cron();
2601 stop_ntpc();
2602 stop_upnp();
2603 // stop_dhcpc();
2604 killall("rstats", SIGTERM);
2605 killall("cstats", SIGTERM);
2606 killall("buttons", SIGTERM);
2607 stop_syslog();
2608 remove_storage_main(1); // !!TB - USB Support
2609 stop_usb(); // !!TB - USB Support
2611 goto CLEAR;
2614 #ifdef TCONFIG_CIFS
2615 if (strcmp(service, "cifs") == 0) {
2616 if (action & A_STOP) stop_cifs();
2617 if (action & A_START) start_cifs();
2618 goto CLEAR;
2620 #endif
2622 #ifdef TCONFIG_JFFS2
2623 if (strncmp(service, "jffs", 4) == 0) {
2624 if (action & A_STOP) stop_jffs2();
2625 if (action & A_START) start_jffs2();
2626 goto CLEAR;
2628 #endif
2630 if (strcmp(service, "zebra") == 0) {
2631 if (action & A_STOP) stop_zebra();
2632 if (action & A_START) start_zebra();
2633 goto CLEAR;
2636 #ifdef TCONFIG_SDHC
2637 if (strcmp(service, "mmc") == 0) {
2638 if (action & A_STOP) stop_mmc();
2639 if (action & A_START) start_mmc();
2640 goto CLEAR;
2642 #endif
2644 if (strcmp(service, "routing") == 0) {
2645 if (action & A_STOP) {
2646 stop_zebra();
2647 do_static_routes(0); // remove old '_saved'
2648 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "0");
2649 if(strcmp(nvram_safe_get("lan1_ifname"),"")!=0)
2650 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "0");
2651 if(strcmp(nvram_safe_get("lan2_ifname"),"")!=0)
2652 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "0");
2653 if(strcmp(nvram_safe_get("lan3_ifname"),"")!=0)
2654 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "0");
2656 stop_firewall();
2657 start_firewall();
2658 if (action & A_START) {
2659 do_static_routes(1); // add new
2660 start_zebra();
2661 eval("brctl", "stp", nvram_safe_get("lan_ifname"), nvram_safe_get("lan_stp"));
2662 if(strcmp(nvram_safe_get("lan1_ifname"),"")!=0)
2663 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), nvram_safe_get("lan1_stp"));
2664 if(strcmp(nvram_safe_get("lan2_ifname"),"")!=0)
2665 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), nvram_safe_get("lan2_stp"));
2666 if(strcmp(nvram_safe_get("lan3_ifname"),"")!=0)
2667 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), nvram_safe_get("lan3_stp"));
2669 goto CLEAR;
2672 if (strcmp(service, "ctnf") == 0) {
2673 if (action & A_START) {
2674 setup_conntrack();
2675 stop_firewall();
2676 start_firewall();
2678 goto CLEAR;
2681 if (strcmp(service, "wan") == 0) {
2682 if (action & A_STOP) {
2683 stop_wan();
2686 if (action & A_START) {
2687 rename("/tmp/ppp/log", "/tmp/ppp/log.~");
2688 start_wan(BOOT);
2689 sleep(2);
2690 force_to_dial();
2692 goto CLEAR;
2695 if (strcmp(service, "net") == 0) {
2696 if (action & A_STOP) {
2697 #ifdef TCONFIG_USB
2698 stop_nas_services();
2699 #endif
2700 stop_httpd();
2701 stop_dnsmasq();
2702 stop_nas();
2703 stop_wan();
2704 stop_arpbind();
2705 stop_lan();
2706 stop_vlan();
2708 if (action & A_START) {
2709 start_vlan();
2710 start_lan();
2711 start_arpbind();
2712 start_wan(BOOT);
2713 start_nas();
2714 start_dnsmasq();
2715 start_httpd();
2716 start_wl();
2717 #ifdef TCONFIG_USB
2718 start_nas_services();
2719 #endif
2721 goto CLEAR;
2724 if (strcmp(service, "wireless") == 0) {
2725 if(action & A_STOP) {
2726 stop_wireless();
2728 if(action & A_START) {
2729 start_wireless();
2731 goto CLEAR;
2734 if (strcmp(service, "wl") == 0) {
2735 if(action & A_STOP) {
2736 stop_wireless();
2737 unload_wl();
2739 if(action & A_START) {
2740 load_wl();
2741 start_wireless();
2742 stop_wireless();
2743 start_wireless();
2745 goto CLEAR;
2748 if (strcmp(service, "nas") == 0) {
2749 if (action & A_STOP) {
2750 stop_nas();
2752 if (action & A_START) {
2753 start_nas();
2754 start_wl();
2756 goto CLEAR;
2759 if (strcmp(service, "rstats") == 0) {
2760 if (action & A_STOP) stop_rstats();
2761 if (action & A_START) start_rstats(0);
2762 goto CLEAR;
2765 if (strcmp(service, "rstatsnew") == 0) {
2766 if (action & A_STOP) stop_rstats();
2767 if (action & A_START) start_rstats(1);
2768 goto CLEAR;
2771 if (strcmp(service, "cstats") == 0) {
2772 if (action & A_STOP) stop_cstats();
2773 if (action & A_START) start_cstats(0);
2774 goto CLEAR;
2777 if (strcmp(service, "cstatsnew") == 0) {
2778 if (action & A_STOP) stop_cstats();
2779 if (action & A_START) start_cstats(1);
2780 goto CLEAR;
2783 if (strcmp(service, "sched") == 0) {
2784 if (action & A_STOP) stop_sched();
2785 if (action & A_START) start_sched();
2786 goto CLEAR;
2789 #ifdef TCONFIG_BT
2790 if (strcmp(service, "bittorrent") == 0) {
2791 if (action & A_STOP) {
2792 stop_bittorrent();
2794 stop_firewall(); start_firewall(); // always restarted
2795 if (action & A_START) {
2796 start_bittorrent();
2798 goto CLEAR;
2800 #endif
2802 #ifdef TCONFIG_NFS
2803 if (strcmp(service, "nfs") == 0) {
2804 if (action & A_STOP) stop_nfs();
2805 if (action & A_START) start_nfs();
2806 goto CLEAR;
2808 #endif
2810 #ifdef TCONFIG_SNMP
2811 if (strcmp(service, "snmp") == 0) {
2812 if (action & A_STOP) stop_snmp();
2813 if (action & A_START) start_snmp();
2814 goto CLEAR;
2816 #endif
2818 #ifdef TCONFIG_TOR
2819 if (strcmp(service, "tor") == 0) {
2820 if (action & A_STOP) stop_tor();
2822 stop_firewall(); start_firewall(); // always restarted
2824 if (action & A_START) start_tor();
2825 goto CLEAR;
2827 #endif
2829 #ifdef TCONFIG_UPS
2830 if (strcmp(service, "ups") == 0) {
2831 if (action & A_STOP) stop_ups();
2832 if (action & A_START) start_ups();
2833 goto CLEAR;
2835 #endif
2837 #ifdef TCONFIG_USB
2838 // !!TB - USB Support
2839 if (strcmp(service, "usb") == 0) {
2840 if (action & A_STOP) stop_usb();
2841 if (action & A_START) {
2842 start_usb();
2843 // restart Samba and ftp since they may be killed by stop_usb()
2844 restart_nas_services(0, 1);
2845 // remount all partitions by simulating hotplug event
2846 add_remove_usbhost("-1", 1);
2848 goto CLEAR;
2851 if (strcmp(service, "usbapps") == 0) {
2852 if (action & A_STOP) stop_nas_services();
2853 if (action & A_START) start_nas_services();
2854 goto CLEAR;
2856 #endif
2858 #ifdef TCONFIG_FTP
2859 // !!TB - FTP Server
2860 if (strcmp(service, "ftpd") == 0) {
2861 if (action & A_STOP) stop_ftpd();
2862 setup_conntrack();
2863 stop_firewall();
2864 start_firewall();
2865 if (action & A_START) start_ftpd();
2866 goto CLEAR;
2868 #endif
2870 #ifdef TCONFIG_MEDIA_SERVER
2871 if (strcmp(service, "media") == 0 || strcmp(service, "dlna") == 0) {
2872 if (action & A_STOP) stop_media_server();
2873 if (action & A_START) start_media_server();
2874 goto CLEAR;
2876 #endif
2878 #ifdef TCONFIG_SAMBASRV
2879 // !!TB - Samba
2880 if (strcmp(service, "samba") == 0 || strcmp(service, "smbd") == 0) {
2881 if (action & A_STOP) stop_samba();
2882 if (action & A_START) {
2883 create_passwd();
2884 stop_dnsmasq();
2885 start_dnsmasq();
2886 start_samba();
2888 goto CLEAR;
2890 #endif
2892 #ifdef TCONFIG_OPENVPN
2893 if (strncmp(service, "vpnclient", 9) == 0) {
2894 if (action & A_STOP) stop_vpnclient(atoi(&service[9]));
2895 if (action & A_START) start_vpnclient(atoi(&service[9]));
2896 goto CLEAR;
2899 if (strncmp(service, "vpnserver", 9) == 0) {
2900 if (action & A_STOP) stop_vpnserver(atoi(&service[9]));
2901 if (action & A_START) start_vpnserver(atoi(&service[9]));
2902 goto CLEAR;
2904 #endif
2906 #ifdef TCONFIG_TINC
2907 if (strcmp(service, "tinc") == 0) {
2908 if (action & A_STOP) stop_tinc();
2909 if (action & A_START) start_tinc();
2910 goto CLEAR;
2912 #endif
2914 #ifdef TCONFIG_NOCAT
2915 if (strcmp(service, "splashd") == 0) {
2916 if (action & A_STOP) stop_splashd();
2917 if (action & A_START) start_splashd();
2918 goto CLEAR;
2920 #endif
2922 #ifdef TCONFIG_NGINX
2923 if (strcmp(service, "enginex") == 0) {
2924 if (action & A_STOP) stop_enginex();
2925 stop_firewall(); start_firewall(); // always restarted
2926 if (action & A_START) start_enginex();
2927 goto CLEAR;
2929 if (strcmp(service, "nginxfp") == 0) {
2930 if (action & A_STOP) stop_nginxfastpath();
2931 stop_firewall(); start_firewall(); // always restarted
2932 if (action & A_START) start_nginxfastpath();
2933 goto CLEAR;
2935 if (strcmp(service, "mysql") == 0) {
2936 if (action & A_STOP) stop_mysql();
2937 stop_firewall(); start_firewall(); // always restarted
2938 if (action & A_START) start_mysql();
2939 goto CLEAR;
2941 #endif
2943 #ifdef TCONFIG_PPTPD
2944 if (strcmp(service, "pptpd") == 0) {
2945 if (action & A_STOP) stop_pptpd();
2946 if (action & A_START) start_pptpd();
2947 goto CLEAR;
2949 #endif
2951 #ifdef TCONFIG_PPTPD
2952 if (strcmp(service, "pptpclient") == 0) {
2953 if (action & A_STOP) stop_pptp_client();
2954 if (action & A_START) start_pptp_client();
2955 if (action & (A_START | A_STOP))
2957 stop_dnsmasq();
2958 dns_to_resolv();
2959 start_dnsmasq();
2960 if ((action & A_START) == 0)
2961 clear_pptp_route();
2963 goto CLEAR;
2965 #endif
2967 CLEAR:
2968 if (next) goto TOP;
2970 // some functions check action_service and must be cleared at end -- zzz
2971 nvram_set("action_service", "");
2973 // Force recheck in 500 msec
2974 setitimer(ITIMER_REAL, &pop_tv, NULL);
2977 static void do_service(const char *name, const char *action, int user)
2979 int n;
2980 char s[64];
2982 n = 150;
2983 while (!nvram_match("action_service", "")) {
2984 if (user) {
2985 putchar('*');
2986 fflush(stdout);
2988 else if (--n < 0) break;
2989 usleep(100 * 1000);
2992 snprintf(s, sizeof(s), "%s-%s%s", name, action, (user ? "-c" : ""));
2993 nvram_set("action_service", s);
2995 if (nvram_match("debug_rc_svc", "1")) {
2996 nvram_unset("debug_rc_svc");
2997 exec_service();
2998 } else {
2999 kill(1, SIGUSR1);
3002 n = 150;
3003 while (nvram_match("action_service", s)) {
3004 if (user) {
3005 putchar('.');
3006 fflush(stdout);
3008 else if (--n < 0) {
3009 break;
3011 usleep(100 * 1000);
3015 int service_main(int argc, char *argv[])
3017 if (argc != 3) usage_exit(argv[0], "<service> <action>");
3018 do_service(argv[1], argv[2], 1);
3019 printf("\nDone.\n");
3020 return 0;
3023 void start_service(const char *name)
3025 do_service(name, "start", 0);
3028 void stop_service(const char *name)
3030 do_service(name, "stop", 0);
3034 void restart_service(const char *name)
3036 do_service(name, "restart", 0);