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
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
38 #include <arpa/inet.h>
44 #include <sys/mount.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");
73 const char *router_ip
;
74 const char *lan_ifname
;
78 char *mac
, *ip
, *name
;
92 start_service("dnsmasq");
98 if (foreach_wif(1, NULL
, is_wet
)) return;
100 if ((f
= fopen("/etc/dnsmasq.conf", "w")) == NULL
) return;
102 lan_ifname
= nvram_safe_get("lan_ifname");
103 router_ip
= nvram_safe_get("lan_ipaddr");
104 strlcpy(lan
, router_ip
, sizeof(lan
));
105 if ((p
= strrchr(lan
, '.')) != NULL
) *(p
+ 1) = 0;
108 "pid-file=/var/run/dnsmasq.pid\n"
111 if (((nv
= nvram_get("wan_domain")) != NULL
) || ((nv
= nvram_get("wan_get_domain")) != NULL
)) {
112 if (*nv
) fprintf(f
, "domain=%s\n", nv
);
116 const dns_list_t
*dns
= get_dns(); // this always points to a static buffer
118 if (((nv
= nvram_get("dns_minport")) != NULL
) && (*nv
)) n
= atoi(nv
);
121 "resolv-file=%s\n" // the real stuff is here
122 "addn-hosts=%s\n" // directory with additional hosts files
123 "dhcp-hostsfile=%s\n" // directory with dhcp hosts files
124 "expand-hosts\n" // expand hostnames in hosts file
125 "min-port=%u\n", // min port used for random src port
126 dmresolv
, dmhosts
, dmdhcp
, n
);
127 do_dns
= nvram_match("dhcpd_dmdns", "1");
129 // DNS rebinding protection, will discard upstream RFC1918 responses
130 if (nvram_get_int("dns_norebind")) {
133 "rebind-localhost-ok\n");
134 // allow RFC1918 responses for server domain
135 switch (get_wan_proto()) {
137 nv
= nvram_get("pptp_server_ip");
140 nv
= nvram_get("l2tp_server_ip");
146 if (nv
&& *nv
) fprintf(f
, "rebind-domain-ok=%s\n", nv
);
149 for (n
= 0 ; n
< dns
->count
; ++n
) {
150 if (dns
->dns
[n
].port
!= 53) {
151 fprintf(f
, "server=%s#%u\n", inet_ntoa(dns
->dns
[n
].addr
), dns
->dns
[n
].port
);
156 do_dhcpd
= nvram_match("lan_proto", "dhcp");
158 dhcp_lease
= nvram_get_int("dhcp_lease");
159 if (dhcp_lease
<= 0) dhcp_lease
= 1440;
161 if ((e
= nvram_get("dhcpd_slt")) != NULL
) n
= atoi(e
); else n
= 0;
162 if (n
< 0) strcpy(sdhcp_lease
, "infinite");
163 else sprintf(sdhcp_lease
, "%dm", (n
> 0) ? n
: dhcp_lease
);
166 // if not using dnsmasq for dns
168 if ((dns
->count
== 0) && (nvram_get_int("dhcpd_llndns"))) {
169 // no DNS might be temporary. use a low lease time to force clients to update.
171 strcpy(sdhcp_lease
, "2m");
175 // pass the dns directly
177 for (n
= 0 ; n
< dns
->count
; ++n
) {
178 if (dns
->dns
[n
].port
== 53) { // check: option 6 doesn't seem to support other ports
179 sprintf(buf
+ strlen(buf
), ",%s", inet_ntoa(dns
->dns
[n
].addr
));
182 fprintf(f
, "dhcp-option=6%s\n", buf
);
186 if ((p
= nvram_get("dhcpd_startip")) && (*p
) && (e
= nvram_get("dhcpd_endip")) && (*e
)) {
187 fprintf(f
, "dhcp-range=%s,%s,%s,%dm\n", p
, e
, nvram_safe_get("lan_netmask"), dhcp_lease
);
191 dhcp_start
= nvram_get_int("dhcp_start");
192 dhcp_count
= nvram_get_int("dhcp_num");
193 fprintf(f
, "dhcp-range=%s%d,%s%d,%s,%dm\n",
194 lan
, dhcp_start
, lan
, dhcp_start
+ dhcp_count
- 1, nvram_safe_get("lan_netmask"), dhcp_lease
);
198 if ((nvram_get_int("dhcpd_gwmode") == 1) && (get_wan_proto() == WP_DISABLED
)) {
199 p
= nvram_safe_get("lan_gateway");
200 if ((*p
) && (strcmp(p
, "0.0.0.0") != 0)) nv
= p
;
203 n
= nvram_get_int("dhcpd_lmax");
205 "dhcp-option=3,%s\n" // gateway
206 "dhcp-lease-max=%d\n",
210 if (nvram_get_int("dhcpd_auth") >= 0) {
211 fprintf(f
, "dhcp-authoritative\n");
214 if (((nv
= nvram_get("wan_wins")) != NULL
) && (*nv
) && (strcmp(nv
, "0.0.0.0") != 0)) {
215 fprintf(f
, "dhcp-option=44,%s\n", nv
);
217 #ifdef TCONFIG_SAMBASRV
218 else if (nvram_get_int("smbd_enable") && nvram_invmatch("lan_hostname", "") && nvram_get_int("smbd_wins")) {
219 if ((nv
== NULL
) || (*nv
== 0) || (strcmp(nv
, "0.0.0.0") == 0)) {
220 // Samba will serve as a WINS server
221 fprintf(f
, "dhcp-option=44,0.0.0.0\n");
227 fprintf(f
, "no-dhcp-interface=%s\n", lan_ifname
);
230 // write static lease entries & create hosts file
232 mkdir_if_none(dmhosts
);
233 snprintf(buf
, sizeof(buf
), "%s/hosts", dmhosts
);
234 if ((hf
= fopen(buf
, "w")) != NULL
) {
235 if (((nv
= nvram_get("wan_hostname")) != NULL
) && (*nv
))
236 fprintf(hf
, "%s %s\n", router_ip
, nv
);
237 #ifdef TCONFIG_SAMBASRV
238 else if (((nv
= nvram_get("lan_hostname")) != NULL
) && (*nv
))
239 fprintf(hf
, "%s %s\n", router_ip
, nv
);
241 p
= (char *)get_wanip();
242 if ((*p
== 0) || strcmp(p
, "0.0.0.0") == 0)
244 fprintf(hf
, "%s wan-ip\n", p
);
246 fprintf(hf
, "%s %s-wan\n", p
, nv
);
249 mkdir_if_none(dmdhcp
);
250 snprintf(buf
, sizeof(buf
), "%s/dhcp-hosts", dmdhcp
);
251 df
= fopen(buf
, "w");
253 // 00:aa:bb:cc:dd:ee<123<xxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 53 w/ delim
254 // 00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 85 w/ delim
255 // 00:aa:bb:cc:dd:ee,00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 106 w/ delim
256 p
= nvram_safe_get("dhcpd_static");
257 while ((e
= strchr(p
, '>')) != NULL
) {
268 if ((e
= strchr(buf
, '<')) == NULL
) continue;
273 if ((e
= strchr(ip
, '<')) == NULL
) continue;
275 if (strchr(ip
, '.') == NULL
) {
277 if ((ipn
<= 0) || (ipn
> 255)) continue;
278 sprintf(ipbuf
, "%s%d", lan
, ipn
);
282 if (inet_addr(ip
) == INADDR_NONE
) continue;
287 if ((hf
) && (*name
!= 0)) {
288 fprintf(hf
, "%s %s\n", ip
, name
);
291 if ((do_dhcpd
) && (*mac
!= 0) && (strcmp(mac
, "00:00:00:00:00:00") != 0)) {
293 fprintf(df
, "%s,%s,%s\n", mac
, ip
, sdhcp_lease
);
295 fprintf(f
, "dhcp-host=%s,%s,%s\n", mac
, ip
, sdhcp_lease
);
304 #ifdef TCONFIG_OPENVPN
305 write_vpn_dnsmasq_config(f
);
308 fprintf(f
, "%s\n\n", nvram_safe_get("dnsmasq_custom"));
310 fappend(f
, "/etc/dnsmasq.custom");
317 unlink("/etc/resolv.conf");
318 symlink("/rom/etc/resolv.conf", "/etc/resolv.conf"); // nameserver 127.0.0.1
321 TRACE_PT("run dnsmasq\n");
323 // Default to some values we like, but allow the user to override them.
324 eval("dnsmasq", "-c", "1500", "--log-async");
326 if (!nvram_contains_word("debug_norestart", "dnsmasq")) {
333 void stop_dnsmasq(void)
338 stop_service("dnsmasq");
344 unlink("/etc/resolv.conf");
345 symlink(dmresolv
, "/etc/resolv.conf");
347 killall_tk("dnsmasq");
352 void clear_resolv(void)
354 f_write(dmresolv
, NULL
, 0, 0, 0); // blank
358 static int write_ipv6_dns_servers(FILE *f
, const char *prefix
, char *dns
, const char *suffix
, int once
)
360 char p
[INET6_ADDRSTRLEN
+ 1], *next
= NULL
;
361 struct in6_addr addr
;
364 foreach(p
, dns
, next
) {
365 // verify that this is a valid IPv6 address
366 if (inet_pton(AF_INET6
, p
, &addr
) == 1) {
367 fprintf(f
, "%s%s%s", (once
&& cnt
) ? "" : prefix
, p
, suffix
);
376 void dns_to_resolv(void)
379 const dns_list_t
*dns
;
383 m
= umask(022); // 077 from pppoecd
384 if ((f
= fopen(dmresolv
, "w")) != NULL
) {
385 // Check for VPN DNS entries
386 if (!write_vpn_resolv(f
)) {
388 if (write_ipv6_dns_servers(f
, "nameserver ", nvram_safe_get("ipv6_dns"), "\n", 0) == 0 || nvram_get_int("dns_addget"))
389 write_ipv6_dns_servers(f
, "nameserver ", nvram_safe_get("ipv6_get_dns"), "\n", 0);
391 dns
= get_dns(); // static buffer
392 if (dns
->count
== 0) {
393 // Put a pseudo DNS IP to trigger Connect On Demand
394 if (nvram_match("ppp_demand", "1")) {
395 switch (get_wan_proto()) {
399 fprintf(f
, "nameserver 1.1.1.1\n");
405 for (i
= 0; i
< dns
->count
; i
++) {
406 if (dns
->dns
[i
].port
== 53) { // resolv.conf doesn't allow for an alternate port
407 fprintf(f
, "nameserver %s\n", inet_ntoa(dns
->dns
[i
].addr
));
417 // -----------------------------------------------------------------------------
419 void start_httpd(void)
422 start_service("httpd");
432 void stop_httpd(void)
435 stop_service("httpd");
442 // -----------------------------------------------------------------------------
445 static void add_ip6_lanaddr(void)
447 char ip
[INET6_ADDRSTRLEN
+ 4];
450 p
= ipv6_router_address(NULL
);
452 snprintf(ip
, sizeof(ip
), "%s/%d", p
, nvram_get_int("ipv6_prefix_length") ? : 64);
453 eval("ip", "-6", "addr", "add", ip
, "dev", nvram_safe_get("lan_ifname"));
457 void start_ipv6_tunnel(void)
459 char ip
[INET6_ADDRSTRLEN
+ 4];
460 struct in_addr addr4
;
461 struct in6_addr addr
;
462 const char *wanip
, *mtu
, *tun_dev
;
465 service
= get_ipv6_service();
466 tun_dev
= get_wan6face();
468 mtu
= (nvram_get_int("ipv6_tun_mtu") > 0) ? nvram_safe_get("ipv6_tun_mtu") : "1480";
471 if (service
== IPV6_ANYCAST_6TO4
)
472 snprintf(ip
, sizeof(ip
), "192.88.99.%d", nvram_get_int("ipv6_relay"));
474 strlcpy(ip
, (char *)nvram_safe_get("ipv6_tun_v4end"), sizeof(ip
));
475 eval("ip", "tunnel", "add", (char *)tun_dev
, "mode", "sit",
477 "local", (char *)wanip
,
478 "ttl", nvram_safe_get("ipv6_tun_ttl"));
480 eval("ip", "link", "set", (char *)tun_dev
, "mtu", (char *)mtu
, "up");
481 nvram_set("ipv6_ifname", (char *)tun_dev
);
483 if (service
== IPV6_ANYCAST_6TO4
) {
486 memset(&addr
, 0, sizeof(addr
));
487 inet_aton(wanip
, &addr4
);
488 addr
.s6_addr16
[0] = htons(0x2002);
489 ipv6_mapaddr4(&addr
, 16, &addr4
, 0);
490 addr
.s6_addr16
[7] = htons(0x0001);
491 inet_ntop(AF_INET6
, &addr
, ip
, sizeof(ip
));
492 strncat(ip
, "/16", sizeof(ip
));
495 snprintf(ip
, sizeof(ip
), "%s/%d",
496 nvram_safe_get("ipv6_tun_addr"),
497 nvram_get_int("ipv6_tun_addrlen") ? : 64);
499 eval("ip", "addr", "add", ip
, "dev", (char *)tun_dev
);
500 eval("ip", "route", "add", "::/0", "dev", (char *)tun_dev
);
503 if (service
== IPV6_ANYCAST_6TO4
)
507 void stop_ipv6_tunnel(void)
509 eval("ip", "tunnel", "del", (char *)get_wan6face());
510 if (get_ipv6_service() == IPV6_ANYCAST_6TO4
) {
511 // get rid of old IPv6 address from lan iface
512 eval("ip", "-6", "addr", "flush", "dev", nvram_safe_get("lan_ifname"), "scope", "global");
517 static pid_t pid_radvd
= -1;
519 void start_radvd(void)
522 char *prefix
, *ip
, *mtu
;
524 char *argv
[] = { "radvd", NULL
, NULL
, NULL
};
525 int pid
, argc
, service
, cnt
;
528 start_service("radvd");
534 if (ipv6_enabled() && nvram_get_int("ipv6_radvd")) {
535 service
= get_ipv6_service();
536 do_6to4
= (service
== IPV6_ANYCAST_6TO4
);
540 case IPV6_NATIVE_DHCP
:
543 case IPV6_ANYCAST_6TO4
:
545 mtu
= (nvram_get_int("ipv6_tun_mtu") > 0) ? nvram_safe_get("ipv6_tun_mtu") : "1480";
548 prefix
= do_6to4
? "0:0:0:1::" : nvram_safe_get("ipv6_prefix");
551 if (!(*prefix
)) prefix
= "::";
554 if ((f
= fopen("/etc/radvd.conf", "w")) == NULL
) return;
556 ip
= (char *)ipv6_router_address(NULL
);
557 do_dns
= (*ip
) && nvram_match("dhcpd_dmdns", "1");
562 " IgnoreIfMissing on;\n"
563 " AdvSendAdvert on;\n"
564 " MaxRtrAdvInterval 60;\n"
565 " AdvHomeAgentFlag off;\n"
566 " AdvManagedFlag off;\n"
571 " AdvAutonomous on;\n"
575 nvram_safe_get("lan_ifname"),
576 mtu
? " AdvLinkMTU " : "", mtu
? : "", mtu
? ";\n" : "",
578 do_6to4
? " AdvValidLifetime 300;\n AdvPreferredLifetime 120;\n" : "",
579 do_6to4
? " Base6to4Interface " : "",
580 do_6to4
? get_wanface() : "",
581 do_6to4
? ";\n" : "");
584 fprintf(f
, " RDNSS %s {};\n", ip
);
587 cnt
= write_ipv6_dns_servers(f
, " RDNSS ", nvram_safe_get("ipv6_dns"), " ", 1);
588 if (cnt
== 0 || nvram_get_int("dns_addget"))
589 cnt
+= write_ipv6_dns_servers(f
, (cnt
) ? "" : " RDNSS ", nvram_safe_get("ipv6_get_dns"), " ", 1);
590 if (cnt
) fprintf(f
, "{};\n");
594 "};\n"); // close "interface" section
599 if (nvram_get_int("debug_ipv6")) {
604 _eval(argv
, NULL
, 0, &pid
);
606 if (!nvram_contains_word("debug_norestart", "radvd")) {
612 void stop_radvd(void)
615 stop_service("radvd");
623 void start_ipv6(void)
627 service
= get_ipv6_service();
630 // Check if turned on
637 case IPV6_NATIVE_DHCP
:
638 case IPV6_ANYCAST_6TO4
:
639 nvram_set("ipv6_rtr_addr", "");
640 nvram_set("ipv6_prefix", "");
644 if (service
!= IPV6_DISABLED
) {
645 if ((nvram_get_int("ipv6_accept_ra") & 2) != 0 && !nvram_get_int("ipv6_radvd"))
646 accept_ra(nvram_safe_get("lan_ifname"));
654 eval("ip", "-6", "addr", "flush", "scope", "global");
659 // -----------------------------------------------------------------------------
661 void start_upnp(void)
664 start_service("upnp");
668 if (get_wan_proto() == WP_DISABLED
) return;
674 if (((enable
= nvram_get_int("upnp_enable")) & 3) != 0) {
675 mkdir("/etc/upnp", 0777);
676 if (f_exists("/etc/upnp/config.alt")) {
677 xstart("miniupnpd", "-f", "/etc/upnp/config.alt");
680 if ((f
= fopen("/etc/upnp/config", "w")) != NULL
) {
681 upnp_port
= nvram_get_int("upnp_port");
682 if ((upnp_port
< 0) || (upnp_port
>= 0xFFFF)) upnp_port
= 0;
684 char *lanip
= nvram_safe_get("lan_ipaddr");
685 char *lanmask
= nvram_safe_get("lan_netmask");
689 "listening_ip=%s/%s\n"
694 "upnp_forward_chain=upnp\n"
695 "upnp_nat_chain=upnp\n"
696 "notify_interval=%d\n"
697 "system_uptime=yes\n"
703 (enable
& 1) ? "yes" : "no", // upnp enable
704 (enable
& 2) ? "yes" : "no", // natpmp enable
705 nvram_get_int("upnp_secure") ? "yes" : "no", // secure_mode (only forward to self)
706 nvram_get_int("upnp_ssdp_interval")
709 if (nvram_get_int("upnp_clean")) {
710 int interval
= nvram_get_int("upnp_clean_interval");
711 if (interval
< 60) interval
= 60;
713 "clean_ruleset_interval=%d\n"
714 "clean_ruleset_threshold=%d\n",
716 nvram_get_int("upnp_clean_threshold")
720 fprintf(f
,"clean_ruleset_interval=0\n");
722 if (nvram_match("upnp_mnp", "1")) {
723 int https
= nvram_get_int("https_enable");
724 fprintf(f
, "presentation_url=http%s://%s:%s/forward-upnp.asp\n",
725 https
? "s" : "", lanip
,
726 nvram_safe_get(https
? "https_lanport" : "http_lanport"));
729 // Empty parameters are not included into XML service description
730 fprintf(f
, "presentation_url=\n");
734 f_read_string("/proc/sys/kernel/random/uuid", uuid
, sizeof(uuid
));
735 fprintf(f
, "uuid=%s\n", uuid
);
738 if ((ports
[0] = nvram_get_int("upnp_min_port_int")) > 0 &&
739 (ports
[1] = nvram_get_int("upnp_max_port_int")) > 0 &&
740 (ports
[2] = nvram_get_int("upnp_min_port_ext")) > 0 &&
741 (ports
[3] = nvram_get_int("upnp_max_port_ext")) > 0) {
743 "allow %d-%d %s/%s %d-%d\n",
750 // by default allow only redirection of ports above 1024
751 fprintf(f
, "allow 1024-65535 %s/%s 1024-65535\n", lanip
, lanmask
);
754 fappend(f
, "/etc/upnp/config.custom");
755 fprintf(f
, "\ndeny 0-65535 0.0.0.0/0 0-65535\n");
758 xstart("miniupnpd", "-f", "/etc/upnp/config");
767 stop_service("upnp");
771 killall_tk("miniupnpd");
774 // -----------------------------------------------------------------------------
776 static pid_t pid_crond
= -1;
778 void start_cron(void)
782 eval("crond", nvram_contains_word("log_events", "crond") ? NULL
: "-l", "9");
783 if (!nvram_contains_word("debug_norestart", "crond")) {
794 // -----------------------------------------------------------------------------
797 static pid_t pid_hotplug2
= -1;
799 void start_hotplug2()
803 f_write_string("/proc/sys/kernel/hotplug", "", FW_NEWLINE
, 0);
804 xstart("hotplug2", "--persistent", "--no-coldplug");
805 // FIXME: Don't remember exactly why I put "sleep" here -
806 // but it was not for a race with check_services()... - TB
809 if (!nvram_contains_word("debug_norestart", "hotplug2")) {
814 void stop_hotplug2(void)
817 killall_tk("hotplug2");
821 // -----------------------------------------------------------------------------
823 // Written by Sparq in 2002/07/16
824 void start_zebra(void)
828 start_service("zebra");
834 char *lan_tx
= nvram_safe_get("dr_lan_tx");
835 char *lan_rx
= nvram_safe_get("dr_lan_rx");
836 char *wan_tx
= nvram_safe_get("dr_wan_tx");
837 char *wan_rx
= nvram_safe_get("dr_wan_rx");
839 if ((*lan_tx
== '0') && (*lan_rx
== '0') && (*wan_tx
== '0') && (*wan_rx
== '0')) {
844 if ((fp
= fopen("/etc/zebra.conf", "w")) != NULL
) {
849 if ((fp
= fopen("/etc/ripd.conf", "w")) != NULL
) {
850 char *lan_ifname
= nvram_safe_get("lan_ifname");
851 char *wan_ifname
= nvram_safe_get("wan_ifname");
853 fprintf(fp
, "router rip\n");
854 fprintf(fp
, "network %s\n", lan_ifname
);
855 fprintf(fp
, "network %s\n", wan_ifname
);
856 fprintf(fp
, "redistribute connected\n");
857 //fprintf(fp, "redistribute static\n");
859 // 43011: modify by zg 2006.10.18 for cdrouter3.3 item 173(cdrouter_rip_30) bug
860 // fprintf(fp, "redistribute kernel\n"); // 1.11: removed, redistributes indirect -- zzz
862 fprintf(fp
, "interface %s\n", lan_ifname
);
863 if (*lan_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", lan_tx
);
864 if (*lan_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", lan_rx
);
866 fprintf(fp
, "interface %s\n", wan_ifname
);
867 if (*wan_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", wan_tx
);
868 if (*wan_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", wan_rx
);
870 fprintf(fp
, "router rip\n");
871 if (*lan_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", lan_ifname
);
872 if (*lan_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", lan_ifname
);
873 if (*wan_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", wan_ifname
);
874 if (*wan_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", wan_ifname
);
875 fprintf(fp
, "access-list private deny any\n");
877 //fprintf(fp, "debug rip events\n");
878 //fprintf(fp, "log file /etc/ripd.log\n");
882 xstart("zebra", "-d");
883 xstart("ripd", "-d");
887 void stop_zebra(void)
891 stop_service("zebra");
895 killall("zebra", SIGTERM
);
896 killall("ripd", SIGTERM
);
898 unlink("/etc/zebra.conf");
899 unlink("/etc/ripd.conf");
903 // -----------------------------------------------------------------------------
905 void start_syslog(void)
915 char *rot_siz
= "50";
920 if (nvram_match("log_remote", "1")) {
921 nv
= nvram_safe_get("log_remoteip");
923 snprintf(rem
, sizeof(rem
), "%s:%s", nv
, nvram_safe_get("log_remoteport"));
929 if (nvram_match("log_file", "1")) {
932 /* Read options: rotate_size(kb) num_backups logfilename.
933 * Ignore these settings and use defaults if the logfile cannot be written to.
935 if (f_read_string("/etc/syslogd.cfg", cfg
, sizeof(cfg
)) > 0) {
936 if ((nv
= strchr(cfg
, '\n')))
939 if ((nv
= strtok(cfg
, " \t"))) {
944 if ((nv
= strtok(NULL
, " \t")))
947 if ((nv
= strtok(NULL
, " \t")) && *nv
== '/') {
948 if (f_write(nv
, cfg
, 0, FW_APPEND
, 0) >= 0) {
960 argv
[argc
++] = rot_siz
;
962 if (isdigit(*b_opt
)) {
964 argv
[argc
++] = b_opt
;
970 _eval(argv
, NULL
, 0, NULL
);
974 _eval(argv
, NULL
, 0, NULL
);
976 // used to be available in syslogd -m
977 n
= nvram_get_int("log_mark");
981 sprintf(rem
, "*/%d * * * *", n
);
982 else if (n
< 60 * 24)
983 sprintf(rem
, "0 */%d * * *", n
/ 60);
985 sprintf(rem
, "0 0 */%d * *", n
/ (60 * 24));
986 sprintf(s
, "%s logger -p syslog.info -- -- MARK --", rem
);
987 eval("cru", "a", "syslogdmark", s
);
990 eval("cru", "d", "syslogdmark");
995 void stop_syslog(void)
997 killall("klogd", SIGTERM
);
998 killall("syslogd", SIGTERM
);
1001 // -----------------------------------------------------------------------------
1003 static pid_t pid_igmp
= -1;
1005 void start_igmp_proxy(void)
1010 if (nvram_match("multicast_pass", "1")) {
1011 if (get_wan_proto() == WP_DISABLED
)
1014 if (f_exists("/etc/igmp.alt")) {
1015 eval("igmpproxy", "/etc/igmp.alt");
1017 else if ((fp
= fopen("/etc/igmp.conf", "w")) != NULL
) {
1020 "phyint %s upstream\n"
1022 "phyint %s downstream ratelimit 0\n",
1023 nvram_safe_get("wan_ifname"),
1024 nvram_get("multicast_altnet") ? : "0.0.0.0/0",
1025 nvram_safe_get("lan_ifname"));
1027 eval("igmpproxy", "/etc/igmp.conf");
1032 if (!nvram_contains_word("debug_norestart", "igmprt")) {
1038 void stop_igmp_proxy(void)
1041 killall_tk("igmpproxy");
1045 // -----------------------------------------------------------------------------
1049 f_write_string("/etc/TZ", nvram_safe_get("tm_tz"), FW_CREATE
|FW_NEWLINE
, 0644);
1052 void start_ntpc(void)
1058 if (nvram_get_int("ntp_updates") >= 0) {
1059 xstart("ntpsync", "--init");
1063 void stop_ntpc(void)
1065 killall("ntpsync", SIGTERM
);
1068 // -----------------------------------------------------------------------------
1070 static void stop_rstats(void)
1076 while ((n
-- > 0) && ((pid
= pidof("rstats")) > 0)) {
1077 if (kill(pid
, SIGTERM
) != 0) break;
1082 static void start_rstats(int new)
1084 if (nvram_match("rstats_enable", "1")) {
1086 if (new) xstart("rstats", "--new");
1087 else xstart("rstats");
1091 // -----------------------------------------------------------------------------
1093 // !!TB - FTP Server
1096 static char *get_full_storage_path(char *val
)
1098 static char buf
[128];
1102 len
= sprintf(buf
, "%s", val
);
1104 len
= sprintf(buf
, "%s/%s", MOUNT_ROOT
, val
);
1106 if (len
> 1 && buf
[len
- 1] == '/')
1112 static char *nvram_storage_path(char *var
)
1114 char *val
= nvram_safe_get(var
);
1115 return get_full_storage_path(val
);
1118 char vsftpd_conf
[] = "/etc/vsftpd.conf";
1119 char vsftpd_users
[] = "/etc/vsftpd.users";
1120 char vsftpd_passwd
[] = "/etc/vsftpd.passwd";
1122 /* VSFTPD code mostly stolen from Oleg's ASUS Custom Firmware GPL sources */
1124 static void start_ftpd(void)
1130 char *user
, *pass
, *rights
;
1132 if (getpid() != 1) {
1133 start_service("ftpd");
1137 if (!nvram_get_int("ftp_enable")) return;
1139 mkdir_if_none(vsftpd_users
);
1140 mkdir_if_none("/var/run/vsftpd");
1142 if ((fp
= fopen(vsftpd_conf
, "w")) == NULL
)
1145 if (nvram_get_int("ftp_super"))
1148 sprintf(tmp
, "%s/%s", vsftpd_users
, "admin");
1149 if ((f
= fopen(tmp
, "w")))
1152 "dirlist_enable=yes\n"
1153 "write_enable=yes\n"
1154 "download_enable=yes\n");
1159 #ifdef TCONFIG_SAMBASRV
1160 if (nvram_match("smbd_cset", "utf8"))
1161 fprintf(fp
, "utf8=yes\n");
1164 if (nvram_invmatch("ftp_anonymous", "0"))
1167 "anon_allow_writable_root=yes\n"
1168 "anon_world_readable_only=no\n"
1169 "anon_umask=022\n");
1172 sprintf(tmp
, "%s/ftp", vsftpd_users
);
1173 if ((f
= fopen(tmp
, "w")))
1175 if (nvram_match("ftp_dirlist", "0"))
1176 fprintf(f
, "dirlist_enable=yes\n");
1177 if (nvram_match("ftp_anonymous", "1") ||
1178 nvram_match("ftp_anonymous", "3"))
1179 fprintf(f
, "write_enable=yes\n");
1180 if (nvram_match("ftp_anonymous", "1") ||
1181 nvram_match("ftp_anonymous", "2"))
1182 fprintf(f
, "download_enable=yes\n");
1185 if (nvram_match("ftp_anonymous", "1") ||
1186 nvram_match("ftp_anonymous", "3"))
1188 "anon_upload_enable=yes\n"
1189 "anon_mkdir_write_enable=yes\n"
1190 "anon_other_write_enable=yes\n");
1192 fprintf(fp
, "anonymous_enable=no\n");
1196 "dirmessage_enable=yes\n"
1197 "download_enable=no\n"
1198 "dirlist_enable=no\n"
1200 "syslog_enable=yes\n"
1201 "local_enable=yes\n"
1204 "chroot_local_user=yes\n"
1206 "log_ftp_protocol=%s\n"
1207 "user_config_dir=%s\n"
1215 "max_login_fails=1\n"
1216 "idle_session_timeout=%s\n"
1218 "anon_max_rate=%d\n"
1219 "local_max_rate=%d\n"
1221 nvram_get_int("log_ftp") ? "yes" : "no",
1222 vsftpd_users
, vsftpd_passwd
,
1224 ipv6_enabled() ? "_ipv6" : "",
1228 nvram_get("ftp_port") ? : "21",
1229 nvram_get_int("ftp_max"),
1230 nvram_get_int("ftp_ipmax"),
1231 nvram_get("ftp_staytimeout") ? : "300",
1232 nvram_get_int("ftp_anonrate") * 1024,
1233 nvram_get_int("ftp_rate") * 1024,
1234 nvram_safe_get("ftp_custom"));
1238 /* prepare passwd file and default users */
1239 if ((fp
= fopen(vsftpd_passwd
, "w")) == NULL
)
1242 if (((user
= nvram_get("http_username")) == NULL
) || (*user
== 0)) user
= "admin";
1243 if (((pass
= nvram_get("http_passwd")) == NULL
) || (*pass
== 0)) pass
= "admin";
1245 fprintf(fp
, /* anonymous, admin, nobody */
1246 "ftp:x:0:0:ftp:%s:/sbin/nologin\n"
1247 "%s:%s:0:0:root:/:/sbin/nologin\n"
1248 "nobody:x:65534:65534:nobody:%s/:/sbin/nologin\n",
1249 nvram_storage_path("ftp_anonroot"), user
,
1250 nvram_get_int("ftp_super") ? crypt(pass
, "$1$") : "x",
1253 if ((buf
= strdup(nvram_safe_get("ftp_users"))) != NULL
)
1256 username<password<rights
1264 while ((q
= strsep(&p
, ">")) != NULL
) {
1265 if (vstrsep(q
, "<", &user
, &pass
, &rights
) != 3) continue;
1266 if (!user
|| !pass
) continue;
1269 if (strncmp(rights
, "Private", 7) == 0)
1271 sprintf(tmp
, "%s/%s", nvram_storage_path("ftp_pvtroot"), user
);
1275 sprintf(tmp
, "%s", nvram_storage_path("ftp_pubroot"));
1277 fprintf(fp
, "%s:%s:0:0:%s:%s:/sbin/nologin\n",
1278 user
, crypt(pass
, "$1$"), user
, tmp
);
1281 sprintf(tmp
, "%s/%s", vsftpd_users
, user
);
1282 if ((f
= fopen(tmp
, "w")))
1285 if (nvram_invmatch("ftp_dirlist", "1"))
1286 strcat(tmp
, "dirlist_enable=yes\n");
1287 if (strstr(rights
, "Read") || !strcmp(rights
, "Private"))
1288 strcat(tmp
, "download_enable=yes\n");
1289 if (strstr(rights
, "Write") || !strncmp(rights
, "Private", 7))
1290 strcat(tmp
, "write_enable=yes\n");
1300 killall("vsftpd", SIGHUP
);
1302 /* start vsftpd if it's not already running */
1303 if (pidof("vsftpd") <= 0)
1307 static void stop_ftpd(void)
1309 if (getpid() != 1) {
1310 stop_service("ftpd");
1314 killall_tk("vsftpd");
1315 unlink(vsftpd_passwd
);
1316 unlink(vsftpd_conf
);
1317 eval("rm", "-rf", vsftpd_users
);
1319 #endif // TCONFIG_FTP
1321 // -----------------------------------------------------------------------------
1325 #ifdef TCONFIG_SAMBASRV
1326 static void kill_samba(int sig
)
1328 if (sig
== SIGTERM
) {
1333 killall("smbd", sig
);
1334 killall("nmbd", sig
);
1338 static void start_samba(void)
1347 if (getpid() != 1) {
1348 start_service("smbd");
1352 mode
= nvram_get_int("smbd_enable");
1353 if (!mode
|| !nvram_invmatch("lan_hostname", ""))
1356 if ((fp
= fopen("/etc/smb.conf", "w")) == NULL
)
1359 fprintf(fp
, "[global]\n"
1360 " interfaces = %s\n"
1361 " bind interfaces only = yes\n"
1363 " netbios name = %s\n"
1364 " server string = %s\n"
1365 " guest account = nobody\n"
1366 " security = user\n"
1369 " guest only = no\n"
1370 " browseable = yes\n"
1371 " syslog only = yes\n"
1372 " timestamp logs = no\n"
1374 " encrypt passwords = yes\n"
1375 " preserve case = yes\n"
1376 " short preserve case = yes\n",
1377 nvram_safe_get("lan_ifname"),
1378 nvram_get("smbd_wgroup") ? : "WORKGROUP",
1379 nvram_safe_get("lan_hostname"),
1380 nvram_get("router_name") ? : "Tomato",
1381 mode
== 2 ? "" : "map to guest = Bad User",
1382 mode
== 2 ? "no" : "yes" // guest ok
1385 if (nvram_get_int("smbd_wins")) {
1386 nv
= nvram_safe_get("wan_wins");
1387 if ((*nv
== 0) || (strcmp(nv
, "0.0.0.0") == 0)) {
1388 fprintf(fp
, " wins support = yes\n");
1392 if (nvram_get_int("smbd_master")) {
1394 " domain master = yes\n"
1395 " local master = yes\n"
1396 " preferred master = yes\n"
1397 " os level = 65\n");
1400 nv
= nvram_safe_get("smbd_cpage");
1402 #ifndef TCONFIG_SAMBA3
1403 fprintf(fp
, " client code page = %s\n", nv
);
1405 sprintf(nlsmod
, "nls_cp%s", nv
);
1407 nv
= nvram_safe_get("smbd_nlsmod");
1408 if ((*nv
) && (strcmp(nv
, nlsmod
) != 0))
1412 nvram_set("smbd_nlsmod", nlsmod
);
1415 #ifndef TCONFIG_SAMBA3
1416 if (nvram_match("smbd_cset", "utf8"))
1417 fprintf(fp
, " coding system = utf8\n");
1418 else if (nvram_invmatch("smbd_cset", ""))
1419 fprintf(fp
, " character set = %s\n", nvram_safe_get("smbd_cset"));
1422 nv
= nvram_safe_get("smbd_custom");
1423 /* add socket options unless overriden by the user */
1424 if (strstr(nv
, "socket options") == NULL
) {
1425 fprintf(fp
, " socket options = TCP_NODELAY SO_KEEPALIVE IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536\n");
1427 fprintf(fp
, "%s\n\n", nv
);
1429 /* configure shares */
1433 char *name
, *path
, *comment
, *writeable
, *hidden
;
1436 if ((buf
= strdup(nvram_safe_get("smbd_shares"))) != NULL
)
1438 /* sharename<path<comment<writeable[0|1]<hidden[0|1] */
1441 while ((q
= strsep(&p
, ">")) != NULL
) {
1442 if (vstrsep(q
, "<", &name
, &path
, &comment
, &writeable
, &hidden
) != 5) continue;
1443 if (!path
|| !name
) continue;
1446 fprintf(fp
, "\n[%s]\n", name
);
1449 fprintf(fp
, " path = %s\n", path
);
1452 if (!strcmp(writeable
, "1"))
1453 fprintf(fp
, " writable = yes\n delete readonly = yes\n force user = root\n");
1454 if (!strcmp(hidden
, "1"))
1455 fprintf(fp
, " browseable = no\n");
1459 fprintf(fp
, " comment = %s\n", comment
);
1466 /* Share every mountpoint below MOUNT_ROOT */
1467 if (nvram_get_int("smbd_autoshare") && (dir
= opendir(MOUNT_ROOT
))) {
1468 while ((dp
= readdir(dir
))) {
1469 if (strcmp(dp
->d_name
, ".") && strcmp(dp
->d_name
, "..")) {
1471 /* Only if is a directory and is mounted */
1472 if (!dir_is_mountpoint(MOUNT_ROOT
, dp
->d_name
))
1475 /* smbd_autoshare: 0 - disable, 1 - read-only, 2 - writable, 3 - hidden writable */
1476 fprintf(fp
, "\n[%s]\n path = %s/%s\n comment = %s\n",
1477 dp
->d_name
, MOUNT_ROOT
, dp
->d_name
, dp
->d_name
);
1478 if (nvram_match("smbd_autoshare", "3")) // Hidden
1479 fprintf(fp
, "\n[%s$]\n path = %s/%s\n browseable = no\n",
1480 dp
->d_name
, MOUNT_ROOT
, dp
->d_name
);
1481 if (nvram_match("smbd_autoshare", "2") || nvram_match("smbd_autoshare", "3")) // RW
1482 fprintf(fp
, " writable = yes\n delete readonly = yes\n force user = root\n");
1488 if (dir
) closedir(dir
);
1491 /* by default share MOUNT_ROOT as read-only */
1492 fprintf(fp
, "\n[share]\n"
1500 mkdir_if_none("/var/run/samba");
1501 mkdir_if_none("/etc/samba");
1503 /* write smbpasswd */
1504 #ifdef TCONFIG_SAMBA3
1505 eval("smbpasswd", "nobody", "\"\"");
1507 eval("smbpasswd", "-a", "nobody", "\"\"");
1511 if (((smbd_user
= nvram_get("smbd_user")) == NULL
) || (*smbd_user
== 0) || !strcmp(smbd_user
, "root"))
1513 #ifdef TCONFIG_SAMBA3
1514 eval("smbpasswd", smbd_user
, nvram_safe_get("smbd_passwd"));
1516 eval("smbpasswd", "-a", smbd_user
, nvram_safe_get("smbd_passwd"));
1521 int ret1
= 0, ret2
= 0;
1522 /* start samba if it's not already running */
1523 if (pidof("nmbd") <= 0)
1524 ret1
= xstart("nmbd", "-D");
1525 if (pidof("smbd") <= 0)
1526 ret2
= xstart("smbd", "-D");
1528 if (ret1
|| ret2
) kill_samba(SIGTERM
);
1531 static void stop_samba(void)
1533 if (getpid() != 1) {
1534 stop_service("smbd");
1538 kill_samba(SIGTERM
);
1540 unlink("/var/log/smb");
1541 unlink("/var/log/nmb");
1542 eval("rm", "-rf", "/var/run/samba");
1544 #endif // TCONFIG_SAMBASRV
1546 #ifdef TCONFIG_MEDIA_SERVER
1547 #define MEDIA_SERVER_APP "minidlna"
1549 static void start_media_server(void)
1552 int port
, pid
, https
;
1554 char *argv
[] = { MEDIA_SERVER_APP
, "-f", "/etc/"MEDIA_SERVER_APP
".conf", "-R", NULL
};
1555 static int once
= 1;
1557 if (getpid() != 1) {
1558 start_service("media");
1562 if (nvram_get_int("ms_sas") == 0)
1565 if (nvram_get_int("ms_enable") != 0) {
1566 if ((!once
) && (nvram_get_int("ms_rescan") == 0)) {
1570 nvram_unset("ms_rescan");
1572 if (f_exists("/etc/"MEDIA_SERVER_APP
".alt")) {
1573 argv
[2] = "/etc/"MEDIA_SERVER_APP
".alt";
1576 if ((f
= fopen(argv
[2], "w")) != NULL
) {
1577 port
= nvram_get_int("ms_port");
1578 https
= nvram_get_int("https_enable");
1579 dbdir
= nvram_safe_get("ms_dbdir");
1580 if (!(*dbdir
)) dbdir
= NULL
;
1581 mkdir_if_none(dbdir
? : "/var/run/"MEDIA_SERVER_APP
);
1584 "network_interface=%s\n"
1586 "friendly_name=%s\n"
1590 "presentation_url=http%s://%s:%s/nas-media.asp\n"
1592 "notify_interval=600\n"
1593 "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"
1595 nvram_safe_get("lan_ifname"),
1596 (port
< 0) || (port
>= 0xffff) ? 0 : port
,
1597 nvram_get("router_name") ? : "Tomato",
1598 dbdir
? : "/var/run/"MEDIA_SERVER_APP
,
1599 nvram_get_int("ms_tivo") ? "yes" : "no",
1600 nvram_get_int("ms_stdlna") ? "yes" : "no",
1601 https
? "s" : "", nvram_safe_get("lan_ipaddr"), nvram_safe_get(https
? "https_lanport" : "http_lanport")
1604 // media directories
1606 char *path
, *restrict
;
1608 if ((buf
= strdup(nvram_safe_get("ms_dirs"))) != NULL
) {
1609 /* path<restrict[A|V|P|] */
1612 while ((q
= strsep(&p
, ">")) != NULL
) {
1613 if (vstrsep(q
, "<", &path
, &restrict
) < 1 || !path
|| !(*path
))
1615 fprintf(f
, "media_dir=%s%s%s\n",
1616 restrict
? : "", (restrict
&& *restrict
) ? "," : "", path
);
1625 /* start media server if it's not already running */
1626 if (pidof(MEDIA_SERVER_APP
) <= 0) {
1627 if ((_eval(argv
, NULL
, 0, &pid
) == 0) && (once
)) {
1628 /* If we started the media server successfully, wait 1 sec
1629 * to let it die if it can't open the database file.
1630 * If it's still alive after that, assume it's running and
1631 * disable forced once-after-reboot rescan.
1634 if (pidof(MEDIA_SERVER_APP
) > 0)
1641 static void stop_media_server(void)
1643 if (getpid() != 1) {
1644 stop_service("media");
1648 killall_tk(MEDIA_SERVER_APP
);
1650 #endif // TCONFIG_MEDIA_SERVER
1653 static void start_nas_services(void)
1655 if (getpid() != 1) {
1656 start_service("usbapps");
1660 #ifdef TCONFIG_SAMBASRV
1666 #ifdef TCONFIG_MEDIA_SERVER
1667 start_media_server();
1671 static void stop_nas_services(void)
1673 if (getpid() != 1) {
1674 stop_service("usbapps");
1678 #ifdef TCONFIG_MEDIA_SERVER
1679 stop_media_server();
1684 #ifdef TCONFIG_SAMBASRV
1689 void restart_nas_services(int stop
, int start
)
1691 int fd
= file_lock("usb");
1692 /* restart all NAS applications */
1694 stop_nas_services();
1696 start_nas_services();
1699 #endif // TCONFIG_USB
1701 // -----------------------------------------------------------------------------
1703 /* -1 = Don't check for this program, it is not expected to be running.
1704 * Other = This program has been started and should be kept running. If no
1705 * process with the name is running, call func to restart it.
1706 * Note: At startup, dnsmasq forks a short-lived child which forks a
1707 * long-lived (grand)child. The parents terminate.
1708 * Many daemons use this technique.
1710 static void _check(pid_t pid
, const char *name
, void (*func
)(void))
1712 if (pid
== -1) return;
1714 if (pidof(name
) > 0) return;
1716 syslog(LOG_DEBUG
, "%s terminated unexpectedly, restarting.\n", name
);
1719 // Force recheck in 500 msec
1720 setitimer(ITIMER_REAL
, &pop_tv
, NULL
);
1723 void check_services(void)
1725 TRACE_PT("keep alive\n");
1727 // Periodically reap any zombies
1728 setitimer(ITIMER_REAL
, &zombie_tv
, NULL
);
1731 _check(pid_hotplug2
, "hotplug2", start_hotplug2
);
1733 _check(pid_dnsmasq
, "dnsmasq", start_dnsmasq
);
1734 _check(pid_crond
, "crond", start_cron
);
1735 _check(pid_igmp
, "igmpproxy", start_igmp_proxy
);
1737 _check(pid_radvd
, "radvd", start_radvd
);
1741 // -----------------------------------------------------------------------------
1743 void start_services(void)
1745 static int once
= 1;
1750 if (nvram_get_int("telnetd_eas")) start_telnetd();
1751 if (nvram_get_int("sshd_eas")) start_sshd();
1765 /* note: starting radvd here might be too early in case of
1766 * DHCPv6 or 6to4 because we won't have received a prefix and
1767 * so it will disable advertisements. To restart them, we have
1768 * to send radvd a SIGHUP, or restart it.
1772 restart_nas_services(1, 1); // !!TB - Samba, FTP and Media Server
1783 void stop_services(void)
1794 restart_nas_services(1, 0); // stop Samba, FTP and Media Server
1810 // -----------------------------------------------------------------------------
1812 /* nvram "action_service" is: "service-action[-modifier]"
1813 * action is something like "stop" or "start" or "restart"
1814 * optional modifier is "c" for the "service" command-line command
1816 void exec_service(void)
1818 const int A_START
= 1;
1819 const int A_STOP
= 2;
1820 const int A_RESTART
= 1|2;
1829 strlcpy(buffer
, nvram_safe_get("action_service"), sizeof(buffer
));
1833 act
= strsep(&next
, ",");
1834 service
= strsep(&act
, "-");
1840 strsep(&modifier
, "-");
1842 TRACE_PT("service=%s action=%s modifier=%s\n", service
, act
, modifier
? : "");
1844 if (strcmp(act
, "start") == 0) action
= A_START
;
1845 else if (strcmp(act
, "stop") == 0) action
= A_STOP
;
1846 else if (strcmp(act
, "restart") == 0) action
= A_RESTART
;
1848 user
= (modifier
!= NULL
&& *modifier
== 'c');
1850 if (strcmp(service
, "dhcpc") == 0) {
1851 if (action
& A_STOP
) stop_dhcpc();
1852 if (action
& A_START
) start_dhcpc();
1856 if ((strcmp(service
, "dhcpd") == 0) || (strcmp(service
, "dns") == 0) || (strcmp(service
, "dnsmasq") == 0)) {
1857 if (action
& A_STOP
) stop_dnsmasq();
1858 if (action
& A_START
) {
1865 if (strcmp(service
, "firewall") == 0) {
1866 if (action
& A_STOP
) {
1870 if (action
& A_START
) {
1877 if (strcmp(service
, "restrict") == 0) {
1878 if (action
& A_STOP
) {
1881 if (action
& A_START
) {
1882 i
= nvram_get_int("rrules_radio"); // -1 = not used, 0 = enabled by rule, 1 = disabled by rule
1886 // if radio was disabled by access restriction, but no rule is handling it now, enable it
1888 if (nvram_get_int("rrules_radio") < 0) {
1889 eval("radio", "on");
1896 if (strcmp(service
, "qos") == 0) {
1897 if (action
& A_STOP
) {
1900 stop_firewall(); start_firewall(); // always restarted
1901 if (action
& A_START
) {
1903 if (nvram_match("qos_reset", "1")) f_write_string("/proc/net/clear_marks", "1", 0, 0);
1908 if (strcmp(service
, "qoslimit") == 0) {
1909 if (action
& A_STOP
) {
1910 new_qoslimit_stop();
1912 stop_firewall(); start_firewall(); // always restarted
1913 if (action
& A_START
) {
1914 new_qoslimit_start();
1919 if (strcmp(service
, "arpbind") == 0) {
1920 if (action
& A_STOP
) new_arpbind_stop();
1921 if (action
& A_START
) new_arpbind_start();
1925 if (strcmp(service
, "upnp") == 0) {
1926 if (action
& A_STOP
) {
1929 stop_firewall(); start_firewall(); // always restarted
1930 if (action
& A_START
) {
1936 if (strcmp(service
, "telnetd") == 0) {
1937 if (action
& A_STOP
) stop_telnetd();
1938 if (action
& A_START
) start_telnetd();
1942 if (strcmp(service
, "sshd") == 0) {
1943 if (action
& A_STOP
) stop_sshd();
1944 if (action
& A_START
) start_sshd();
1948 if (strcmp(service
, "httpd") == 0) {
1949 if (action
& A_STOP
) stop_httpd();
1950 if (action
& A_START
) start_httpd();
1955 if (strcmp(service
, "ipv6") == 0) {
1956 if (action
& A_STOP
) {
1960 if (action
& A_START
) {
1967 if (strcmp(service
, "radvd") == 0) {
1968 if (action
& A_STOP
) {
1971 if (action
& A_START
) {
1977 if (strncmp(service
, "dhcp6", 5) == 0) {
1978 if (action
& A_STOP
) {
1981 if (action
& A_START
) {
1988 if (strcmp(service
, "admin") == 0) {
1989 if (action
& A_STOP
) {
1994 stop_firewall(); start_firewall(); // always restarted
1995 if (action
& A_START
) {
1998 if (nvram_match("telnetd_eas", "1")) start_telnetd();
1999 if (nvram_match("sshd_eas", "1")) start_sshd();
2004 if (strcmp(service
, "ddns") == 0) {
2005 if (action
& A_STOP
) stop_ddns();
2006 if (action
& A_START
) start_ddns();
2010 if (strcmp(service
, "ntpc") == 0) {
2011 if (action
& A_STOP
) stop_ntpc();
2012 if (action
& A_START
) start_ntpc();
2016 if (strcmp(service
, "logging") == 0) {
2017 if (action
& A_STOP
) {
2020 if (action
& A_START
) {
2024 // always restarted except from "service" command
2025 stop_cron(); start_cron();
2026 stop_firewall(); start_firewall();
2031 if (strcmp(service
, "crond") == 0) {
2032 if (action
& A_STOP
) {
2035 if (action
& A_START
) {
2042 if (strncmp(service
, "hotplug", 7) == 0) {
2043 if (action
& A_STOP
) {
2046 if (action
& A_START
) {
2053 if (strcmp(service
, "upgrade") == 0) {
2054 if (action
& A_START
) {
2059 restart_nas_services(1, 0); // stop Samba, FTP and Media Server
2067 killall("rstats", SIGTERM
);
2068 killall("buttons", SIGTERM
);
2070 remove_storage_main(1); // !!TB - USB Support
2071 stop_usb(); // !!TB - USB Support
2077 if (strcmp(service
, "cifs") == 0) {
2078 if (action
& A_STOP
) stop_cifs();
2079 if (action
& A_START
) start_cifs();
2084 #ifdef TCONFIG_JFFS2
2085 if (strncmp(service
, "jffs", 4) == 0) {
2086 if (action
& A_STOP
) stop_jffs2();
2087 if (action
& A_START
) start_jffs2();
2092 if (strcmp(service
, "zebra") == 0) {
2093 if (action
& A_STOP
) stop_zebra();
2094 if (action
& A_START
) start_zebra();
2098 if (strcmp(service
, "routing") == 0) {
2099 if (action
& A_STOP
) {
2101 do_static_routes(0); // remove old '_saved'
2102 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "0");
2106 if (action
& A_START
) {
2107 do_static_routes(1); // add new
2109 eval("brctl", "stp", nvram_safe_get("lan_ifname"), nvram_safe_get("lan_stp"));
2114 if (strcmp(service
, "ctnf") == 0) {
2115 if (action
& A_START
) {
2123 if (strcmp(service
, "wan") == 0) {
2124 if (action
& A_STOP
) {
2128 if (action
& A_START
) {
2129 rename("/tmp/ppp/log", "/tmp/ppp/log.~");
2137 if (strcmp(service
, "net") == 0) {
2138 if (action
& A_STOP
) {
2140 stop_nas_services();
2152 if (action
& A_START
) {
2164 start_nas_services();
2170 if (strcmp(service
, "nas") == 0) {
2171 if (action
& A_STOP
) {
2174 if (action
& A_START
) {
2181 if (strcmp(service
, "rstats") == 0) {
2182 if (action
& A_STOP
) stop_rstats();
2183 if (action
& A_START
) start_rstats(0);
2187 if (strcmp(service
, "rstatsnew") == 0) {
2188 if (action
& A_STOP
) stop_rstats();
2189 if (action
& A_START
) start_rstats(1);
2193 if (strcmp(service
, "sched") == 0) {
2194 if (action
& A_STOP
) stop_sched();
2195 if (action
& A_START
) start_sched();
2200 if (strcmp(service
, "bittorrent") == 0) {
2201 if (action
& A_STOP
) {
2204 stop_firewall(); start_firewall(); // always restarted
2205 if (action
& A_START
) {
2213 if (strcmp(service
, "nfs") == 0) {
2214 if (action
& A_STOP
) stop_nfs();
2215 if (action
& A_START
) start_nfs();
2221 // !!TB - USB Support
2222 if (strcmp(service
, "usb") == 0) {
2223 if (action
& A_STOP
) stop_usb();
2224 if (action
& A_START
) {
2226 // restart Samba and ftp since they may be killed by stop_usb()
2227 restart_nas_services(0, 1);
2228 // remount all partitions by simulating hotplug event
2229 add_remove_usbhost("-1", 1);
2234 if (strcmp(service
, "usbapps") == 0) {
2235 if (action
& A_STOP
) stop_nas_services();
2236 if (action
& A_START
) start_nas_services();
2242 // !!TB - FTP Server
2243 if (strcmp(service
, "ftpd") == 0) {
2244 if (action
& A_STOP
) stop_ftpd();
2248 if (action
& A_START
) start_ftpd();
2253 #ifdef TCONFIG_MEDIA_SERVER
2254 if (strcmp(service
, "media") == 0 || strcmp(service
, "dlna") == 0) {
2255 if (action
& A_STOP
) stop_media_server();
2256 if (action
& A_START
) start_media_server();
2261 #ifdef TCONFIG_SAMBASRV
2263 if (strcmp(service
, "samba") == 0 || strcmp(service
, "smbd") == 0) {
2264 if (action
& A_STOP
) stop_samba();
2265 if (action
& A_START
) {
2275 #ifdef TCONFIG_OPENVPN
2276 if (strncmp(service
, "vpnclient", 9) == 0) {
2277 if (action
& A_STOP
) stop_vpnclient(atoi(&service
[9]));
2278 if (action
& A_START
) start_vpnclient(atoi(&service
[9]));
2282 if (strncmp(service
, "vpnserver", 9) == 0) {
2283 if (action
& A_STOP
) stop_vpnserver(atoi(&service
[9]));
2284 if (action
& A_START
) start_vpnserver(atoi(&service
[9]));
2292 // some functions check action_service and must be cleared at end -- zzz
2293 nvram_set("action_service", "");
2295 // Force recheck in 500 msec
2296 setitimer(ITIMER_REAL
, &pop_tv
, NULL
);
2299 static void do_service(const char *name
, const char *action
, int user
)
2305 while (!nvram_match("action_service", "")) {
2310 else if (--n
< 0) break;
2314 snprintf(s
, sizeof(s
), "%s-%s%s", name
, action
, (user
? "-c" : ""));
2315 nvram_set("action_service", s
);
2319 while (nvram_match("action_service", s
)) {
2331 int service_main(int argc
, char *argv
[])
2333 if (argc
!= 3) usage_exit(argv
[0], "<service> <action>");
2334 do_service(argv
[1], argv
[2], 1);
2335 printf("\nDone.\n");
2339 void start_service(const char *name
)
2341 do_service(name
, "start", 0);
2344 void stop_service(const char *name
)
2346 do_service(name
, "stop", 0);
2350 void restart_service(const char *name)
2352 do_service(name, "restart", 0);