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
;
77 char *mac
, *ip
, *name
;
90 char *prefix
, *ipv6
, *mtu
;
98 start_service("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");
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
);
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
);
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")) {
134 "rebind-localhost-ok\n");
135 // allow RFC1918 responses for server domain
136 switch (get_wan_proto()) {
138 nv
= nvram_get("pptp_server_ip");
141 nv
= nvram_get("l2tp_server_ip");
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") );
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");
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";
184 for(br
=0 ; br
<=3 ; br
++) {
185 char bridge
[2] = "0";
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");
198 router_ip
= nvram_safe_get(lanN_ipaddr
);
199 strlcpy(lan
, router_ip
, sizeof(lan
));
200 if ((p
= strrchr(lan
, '.')) != NULL
) *(p
+ 1) = 0;
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
);
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.
221 strcpy(sdhcp_lease
, "2m");
225 // pass the dns directly
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
);
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
;
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
));
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
);
295 p
= (char *)get_wanip();
296 if ((*p
== 0) || strcmp(p
, "0.0.0.0") == 0)
298 fprintf(hf
, "%s wan-ip\n", p
);
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
) {
329 if ((e
= strchr(buf
, '<')) == NULL
) continue;
334 if ((e
= strchr(ip
, '<')) == NULL
) continue;
336 if (strchr(ip
, '.') == NULL
) {
338 if ((ipn
<= 0) || (ipn
> 255)) continue;
339 sprintf(ipbuf
, "%s%d", lan
, ipn
);
343 if (inet_addr(ip
) == INADDR_NONE
) continue;
348 if ((e
= strchr(name
, '<')) != NULL
) {
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
);
360 fprintf(f
, "dhcp-host=%s,%s,%s\n", mac
, ip
, sdhcp_lease
);
368 n
= nvram_get_int("dhcpd_lmax");
370 "dhcp-lease-max=%d\n",
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"
380 "dnssec-no-timecheck\n");
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");
396 #ifdef TCONFIG_OPENVPN
397 write_vpn_dnsmasq_config(f
);
401 write_pptpd_dnsmasq_config(f
);
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);
413 case IPV6_NATIVE_DHCP:
414 case IPV6_ANYCAST_6TO4:
418 mtu = (nvram_get_int("ipv6_tun_mtu") > 0) ? nvram_safe_get("ipv6_tun_mtu") : "1480";
421 prefix = do_6to4 ? "0:0:0:1::" : nvram_safe_get("ipv6_prefix");
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");
448 fprintf(f
, "%s\n\n", nvram_safe_get("dnsmasq_custom"));
450 fappend(f
, "/etc/dnsmasq.custom");
451 fappend(f
, "/etc/dnsmasq.ipset");
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")) {
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") );
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") );
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" );
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") );
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" );
520 #ifdef TCONFIG_DNSSEC
521 if ((time(0) > Y2K
) && nvram_match("dnssec_enable", "1")){
522 killall("dnsmasq", SIGHUP
);
528 void stop_dnsmasq(void)
533 stop_service("dnsmasq");
539 unlink("/etc/resolv.conf");
540 symlink(dmresolv
, "/etc/resolv.conf");
542 killall_tk("dnsmasq");
543 #ifdef TCONFIG_DNSCRYPT
544 killall_tk("dnscrypt-proxy");
550 void clear_resolv(void)
552 f_write(dmresolv
, NULL
, 0, 0, 0); // blank
555 #ifdef TCONFIG_FANCTRL
556 static pid_t pid_phy_tempsense
= -1;
558 void start_phy_tempsense()
560 stop_phy_tempsense();
562 char *phy_tempsense_argv
[] = {"phy_tempsense", NULL
};
563 _eval(phy_tempsense_argv
, NULL
, 0, &pid_phy_tempsense
);
566 void stop_phy_tempsense()
568 pid_phy_tempsense
= -1;
569 killall_tk("phy_tempsense");
575 static int write_ipv6_dns_servers(FILE *f
, const char *prefix
, char *dns
, const char *suffix
, int once
)
577 char p
[INET6_ADDRSTRLEN
+ 1], *next
= NULL
;
578 struct in6_addr addr
;
581 foreach(p
, dns
, next
) {
582 // verify that this is a valid IPv6 address
583 if (inet_pton(AF_INET6
, p
, &addr
) == 1) {
584 fprintf(f
, "%s%s%s", (once
&& cnt
) ? "" : prefix
, p
, suffix
);
593 void dns_to_resolv(void)
596 const dns_list_t
*dns
;
600 m
= umask(022); // 077 from pppoecd
601 if ((f
= fopen(dmresolv
, "w")) != NULL
) {
602 // Check for VPN DNS entries
603 if (!write_pptpvpn_resolv(f
) && !write_vpn_resolv(f
)) {
605 if (write_ipv6_dns_servers(f
, "nameserver ", nvram_safe_get("ipv6_dns"), "\n", 0) == 0 || nvram_get_int("dns_addget"))
606 write_ipv6_dns_servers(f
, "nameserver ", nvram_safe_get("ipv6_get_dns"), "\n", 0);
608 dns
= get_dns(); // static buffer
609 if (dns
->count
== 0) {
610 // Put a pseudo DNS IP to trigger Connect On Demand
611 if (nvram_match("ppp_demand", "1")) {
612 switch (get_wan_proto()) {
617 fprintf(f
, "nameserver 1.1.1.1\n");
623 for (i
= 0; i
< dns
->count
; i
++) {
624 if (dns
->dns
[i
].port
== 53) { // resolv.conf doesn't allow for an alternate port
625 fprintf(f
, "nameserver %s\n", inet_ntoa(dns
->dns
[i
].addr
));
635 // -----------------------------------------------------------------------------
637 void start_httpd(void)
640 start_service("httpd");
644 if( nvram_match( "web_css", "online" ) )
645 xstart( "/usr/sbin/ttb" );
650 if ( nvram_match( "web_dir", "jffs" ) ) { chdir("/jffs/www"); }
651 else if ( nvram_match( "web_dir", "opt" ) ) { chdir("/opt/www"); }
652 else if ( nvram_match( "web_dir", "tmp" ) ) { chdir("/tmp/www");}
653 else { chdir("/www"); }
659 void stop_httpd(void)
662 stop_service("httpd");
669 // -----------------------------------------------------------------------------
672 static void add_ip6_lanaddr(void)
674 char ip
[INET6_ADDRSTRLEN
+ 4];
677 p
= ipv6_router_address(NULL
);
679 snprintf(ip
, sizeof(ip
), "%s/%d", p
, nvram_get_int("ipv6_prefix_length") ? : 64);
680 eval("ip", "-6", "addr", "add", ip
, "dev", nvram_safe_get("lan_ifname"));
684 void start_ipv6_tunnel(void)
686 char ip
[INET6_ADDRSTRLEN
+ 4];
687 struct in_addr addr4
;
688 struct in6_addr addr
;
689 const char *wanip
, *mtu
, *tun_dev
;
692 service
= get_ipv6_service();
693 tun_dev
= get_wan6face();
695 mtu
= (nvram_get_int("ipv6_tun_mtu") > 0) ? nvram_safe_get("ipv6_tun_mtu") : "1480";
698 if (service
== IPV6_ANYCAST_6TO4
)
699 snprintf(ip
, sizeof(ip
), "192.88.99.%d", nvram_get_int("ipv6_relay"));
701 strlcpy(ip
, (char *)nvram_safe_get("ipv6_tun_v4end"), sizeof(ip
));
702 eval("ip", "tunnel", "add", (char *)tun_dev
, "mode", "sit",
704 "local", (char *)wanip
,
705 "ttl", nvram_safe_get("ipv6_tun_ttl"));
707 eval("ip", "link", "set", (char *)tun_dev
, "mtu", (char *)mtu
, "up");
708 nvram_set("ipv6_ifname", (char *)tun_dev
);
710 if (service
== IPV6_ANYCAST_6TO4
) {
713 memset(&addr
, 0, sizeof(addr
));
714 inet_aton(wanip
, &addr4
);
715 addr
.s6_addr16
[0] = htons(0x2002);
716 ipv6_mapaddr4(&addr
, 16, &addr4
, 0);
717 addr
.s6_addr16
[7] = htons(0x0001);
718 inet_ntop(AF_INET6
, &addr
, ip
, sizeof(ip
));
719 strncat(ip
, "/16", sizeof(ip
));
722 snprintf(ip
, sizeof(ip
), "%s/%d",
723 nvram_safe_get("ipv6_tun_addr"),
724 nvram_get_int("ipv6_tun_addrlen") ? : 64);
726 eval("ip", "addr", "add", ip
, "dev", (char *)tun_dev
);
727 eval("ip", "route", "add", "::/0", "dev", (char *)tun_dev
);
729 // (re)start radvd - now dnsmasq provided
730 if (service
== IPV6_ANYCAST_6TO4
)
734 void stop_ipv6_tunnel(void)
736 eval("ip", "tunnel", "del", (char *)get_wan6face());
737 if (get_ipv6_service() == IPV6_ANYCAST_6TO4
) {
738 // get rid of old IPv6 address from lan iface
739 eval("ip", "-6", "addr", "flush", "dev", nvram_safe_get("lan_ifname"), "scope", "global");
744 void start_6rd_tunnel(void)
746 const char *tun_dev
, *wanip
;
747 int service
, mask_len
, prefix_len
, local_prefix_len
;
748 char mtu
[10], prefix
[INET6_ADDRSTRLEN
], relay
[INET_ADDRSTRLEN
];
749 struct in_addr netmask_addr
, relay_addr
, relay_prefix_addr
, wanip_addr
;
750 struct in6_addr prefix_addr
, local_prefix_addr
;
751 char local_prefix
[INET6_ADDRSTRLEN
];
752 char tmp_ipv6
[INET6_ADDRSTRLEN
+ 4], tmp_ipv4
[INET_ADDRSTRLEN
+ 4];
756 service
= get_ipv6_service();
758 tun_dev
= get_wan6face();
759 sprintf(mtu
, "%d", (nvram_get_int("wan_mtu") > 0) ? (nvram_get_int("wan_mtu") - 20) : 1280);
761 // maybe we can merge the ipv6_6rd_* variables into a single ipv_6rd_string (ala wan_6rd)
762 // to save nvram space?
763 if (service
== IPV6_6RD
) {
764 _dprintf("starting 6rd tunnel using manual settings.\n");
765 mask_len
= nvram_get_int("ipv6_6rd_ipv4masklen");
766 prefix_len
= nvram_get_int("ipv6_6rd_prefix_length");
767 strcpy(prefix
, nvram_safe_get("ipv6_6rd_prefix"));
768 strcpy(relay
, nvram_safe_get("ipv6_6rd_borderrelay"));
771 _dprintf("starting 6rd tunnel using automatic settings.\n");
772 char *wan_6rd
= nvram_safe_get("wan_6rd");
773 if (sscanf(wan_6rd
, "%d %d %s %s", &mask_len
, &prefix_len
, prefix
, relay
) < 4) {
774 _dprintf("wan_6rd string is missing or invalid (%s)\n", wan_6rd
);
779 // validate values that were passed
780 if (mask_len
< 0 || mask_len
> 32) {
781 _dprintf("invalid mask_len value (%d)\n", mask_len
);
784 if (prefix_len
< 0 || prefix_len
> 128) {
785 _dprintf("invalid prefix_len value (%d)\n", prefix_len
);
788 if ((32 - mask_len
) + prefix_len
> 128) {
789 _dprintf("invalid combination of mask_len and prefix_len!\n");
793 sprintf(tmp
, "ping -q -c 2 %s | grep packet", relay
);
794 if ((f
= popen(tmp
, "r")) == NULL
) {
795 _dprintf("error obtaining data\n");
798 fgets(tmp
, sizeof(tmp
), f
);
800 if (strstr(tmp
, " 0% packet loss") == NULL
) {
801 _dprintf("failed to ping border relay\n");
805 // get relay prefix from border relay address and mask
806 netmask_addr
.s_addr
= htonl(0xffffffff << (32 - mask_len
));
807 inet_aton(relay
, &relay_addr
);
808 relay_prefix_addr
.s_addr
= relay_addr
.s_addr
& netmask_addr
.s_addr
;
810 // calculate the local prefix
811 inet_pton(AF_INET6
, prefix
, &prefix_addr
);
812 inet_pton(AF_INET
, wanip
, &wanip_addr
);
813 if (calc_6rd_local_prefix(&prefix_addr
, prefix_len
, mask_len
,
814 &wanip_addr
, &local_prefix_addr
, &local_prefix_len
) == 0) {
815 _dprintf("error calculating local prefix.");
818 inet_ntop(AF_INET6
, &local_prefix_addr
, local_prefix
, sizeof(local_prefix
));
820 snprintf(tmp_ipv6
, sizeof(tmp_ipv6
), "%s1", local_prefix
);
821 nvram_set("ipv6_rtr_addr", tmp_ipv6
);
822 nvram_set("ipv6_prefix", local_prefix
);
824 // load sit module needed for the 6rd tunnel
827 // creating the 6rd tunnel
828 eval("ip", "tunnel", "add", (char *)tun_dev
, "mode", "sit", "local", (char *)wanip
, "ttl", nvram_safe_get("ipv6_tun_ttl"));
830 snprintf(tmp_ipv6
, sizeof(tmp_ipv6
), "%s/%d", prefix
, prefix_len
);
831 snprintf(tmp_ipv4
, sizeof(tmp_ipv4
), "%s/%d", inet_ntoa(relay_prefix_addr
), mask_len
);
832 eval("ip", "tunnel" "6rd", "dev", (char *)tun_dev
, "6rd-prefix", tmp_ipv6
, "6rd-relay_prefix", tmp_ipv4
);
834 // bringing up the link
835 eval("ip", "link", "set", "dev", (char *)tun_dev
, "mtu", (char *)mtu
, "up");
837 // setting the WAN address Note: IPv6 WAN CIDR should be: ((32 - ip6rd_ipv4masklen) + ip6rd_prefixlen)
838 snprintf(tmp_ipv6
, sizeof(tmp_ipv6
), "%s1/%d", local_prefix
, local_prefix_len
);
839 eval("ip", "-6", "addr", "add", tmp_ipv6
, "dev", (char *)tun_dev
);
841 // setting the LAN address Note: IPv6 LAN CIDR should be 64
842 snprintf(tmp_ipv6
, sizeof(tmp_ipv6
), "%s1/%d", local_prefix
, nvram_get_int("ipv6_prefix_length") ? : 64);
843 eval("ip", "-6", "addr", "add", tmp_ipv6
, "dev", nvram_safe_get("lan_ifname"));
845 // adding default route via the border relay
846 snprintf(tmp_ipv6
, sizeof(tmp_ipv6
), "::%s", relay
);
847 eval("ip", "-6", "route", "add", "default", "via", tmp_ipv6
, "dev", (char *)tun_dev
);
849 nvram_set("ipv6_ifname", (char *)tun_dev
);
851 // (re)start radvd now dnsmasq
857 void stop_6rd_tunnel(void)
859 eval("ip", "tunnel", "del", (char *)get_wan6face());
860 eval("ip", "-6", "addr", "flush", "dev", nvram_safe_get("lan_ifname"), "scope", "global");
865 void start_ipv6(void)
869 service
= get_ipv6_service();
870 enable_ip6_forward();
872 // Check if turned on
879 case IPV6_NATIVE_DHCP
:
880 case IPV6_ANYCAST_6TO4
:
881 nvram_set("ipv6_rtr_addr", "");
882 nvram_set("ipv6_prefix", "");
886 if (service
!= IPV6_DISABLED
) {
887 if ((nvram_get_int("ipv6_accept_ra") & 2) != 0 && !nvram_get_int("ipv6_radvd"))
888 accept_ra(nvram_safe_get("lan_ifname"));
896 eval("ip", "-6", "addr", "flush", "scope", "global");
897 eval("ip", "-6", "route", "flush", "scope", "global");
902 // -----------------------------------------------------------------------------
904 void start_upnp(void)
907 start_service("upnp");
911 if (get_wan_proto() == WP_DISABLED
) return;
917 if (((enable
= nvram_get_int("upnp_enable")) & 3) != 0) {
918 mkdir("/etc/upnp", 0777);
919 if (f_exists("/etc/upnp/config.alt")) {
920 xstart("miniupnpd", "-f", "/etc/upnp/config.alt");
923 if ((f
= fopen("/etc/upnp/config", "w")) != NULL
) {
924 upnp_port
= nvram_get_int("upnp_port");
925 if ((upnp_port
< 0) || (upnp_port
>= 0xFFFF)) upnp_port
= 0;
934 "upnp_forward_chain=upnp\n"
935 "upnp_nat_chain=upnp\n"
936 "notify_interval=%d\n"
937 "system_uptime=yes\n"
938 "friendly_name=%s"" Router\n"
940 "model_url=http://linksysinfo.org/index.php?forums/tomato-firmware.33/\n"
941 "manufacturer_name=Tomato Firmware\n"
942 "manufacturer_url=http://linksysinfo.org/index.php?forums/tomato-firmware.33/\n"
947 (enable
& 1) ? "yes" : "no", // upnp enable
948 (enable
& 2) ? "yes" : "no", // natpmp enable
949 nvram_get_int("upnp_secure") ? "yes" : "no", // secure_mode (only forward to self)
950 nvram_get_int("upnp_ssdp_interval"),
951 nvram_safe_get("router_name"),
952 nvram_safe_get("t_model_name")
955 if (nvram_get_int("upnp_clean")) {
956 int interval
= nvram_get_int("upnp_clean_interval");
957 if (interval
< 60) interval
= 60;
959 "clean_ruleset_interval=%d\n"
960 "clean_ruleset_threshold=%d\n",
962 nvram_get_int("upnp_clean_threshold")
966 fprintf(f
,"clean_ruleset_interval=0\n");
968 if (nvram_match("upnp_mnp", "1")) {
969 int https
= nvram_get_int("https_enable");
970 fprintf(f
, "presentation_url=http%s://%s:%s/forward-upnp.asp\n",
971 https
? "s" : "", nvram_safe_get("lan_ipaddr"),
972 nvram_safe_get(https
? "https_lanport" : "http_lanport"));
975 // Empty parameters are not included into XML service description
976 fprintf(f
, "presentation_url=\n");
980 f_read_string("/proc/sys/kernel/random/uuid", uuid
, sizeof(uuid
));
981 fprintf(f
, "uuid=%s\n", uuid
);
983 // shibby - move custom configuration before "allow" statements
984 // discussion: http://www.linksysinfo.org/index.php?threads/miniupnpd-custom-config-syntax.70863/#post-256291
985 fappend(f
, "/etc/upnp/config.custom");
986 fprintf(f
, "%s\n", nvram_safe_get("upnp_custom"));
988 char lanN_ipaddr
[] = "lanXX_ipaddr";
989 char lanN_netmask
[] = "lanXX_netmask";
990 char upnp_lanN
[] = "upnp_lanXX";
993 for(br
=0 ; br
<4 ; br
++) {
994 char bridge
[2] = "0";
1000 sprintf(lanN_ipaddr
, "lan%s_ipaddr", bridge
);
1001 sprintf(lanN_netmask
, "lan%s_netmask", bridge
);
1002 sprintf(upnp_lanN
, "upnp_lan%s", bridge
);
1004 char *lanip
= nvram_safe_get(lanN_ipaddr
);
1005 char *lanmask
= nvram_safe_get(lanN_netmask
);
1006 char *lanlisten
= nvram_safe_get(upnp_lanN
);
1008 if((strcmp(lanlisten
,"1")==0) && (strcmp(lanip
,"")!=0) && (strcmp(lanip
,"0.0.0.0")!=0)) {
1010 "listening_ip=%s/%s\n",
1013 if ((ports
[0] = nvram_get_int("upnp_min_port_int")) > 0 &&
1014 (ports
[1] = nvram_get_int("upnp_max_port_int")) > 0 &&
1015 (ports
[2] = nvram_get_int("upnp_min_port_ext")) > 0 &&
1016 (ports
[3] = nvram_get_int("upnp_max_port_ext")) > 0) {
1018 "allow %d-%d %s/%s %d-%d\n",
1025 // by default allow only redirection of ports above 1024
1026 fprintf(f
, "allow 1024-65535 %s/%s 1024-65535\n", lanip
, lanmask
);
1030 fprintf(f
, "\ndeny 0-65535 0.0.0.0/0 0-65535\n");
1033 xstart("miniupnpd", "-f", "/etc/upnp/config");
1039 void stop_upnp(void)
1041 if (getpid() != 1) {
1042 stop_service("upnp");
1046 killall_tk("miniupnpd");
1049 // -----------------------------------------------------------------------------
1051 static pid_t pid_crond
= -1;
1053 void start_cron(void)
1057 eval("crond", nvram_contains_word("log_events", "crond") ? NULL
: "-l", "9");
1058 if (!nvram_contains_word("debug_norestart", "crond")) {
1063 void stop_cron(void)
1066 killall_tk("crond");
1069 // -----------------------------------------------------------------------------
1072 static pid_t pid_hotplug2
= -1;
1074 void start_hotplug2()
1078 f_write_string("/proc/sys/kernel/hotplug", "", FW_NEWLINE
, 0);
1079 xstart("hotplug2", "--persistent", "--no-coldplug");
1080 // FIXME: Don't remember exactly why I put "sleep" here -
1081 // but it was not for a race with check_services()... - TB
1084 if (!nvram_contains_word("debug_norestart", "hotplug2")) {
1089 void stop_hotplug2(void)
1092 killall_tk("hotplug2");
1095 #endif /* LINUX26 */
1096 // -----------------------------------------------------------------------------
1098 // Written by Sparq in 2002/07/16
1099 void start_zebra(void)
1101 #ifdef TCONFIG_ZEBRA
1102 if (getpid() != 1) {
1103 start_service("zebra");
1109 char *lan_tx
= nvram_safe_get("dr_lan_tx");
1110 char *lan_rx
= nvram_safe_get("dr_lan_rx");
1111 char *lan1_tx
= nvram_safe_get("dr_lan1_tx");
1112 char *lan1_rx
= nvram_safe_get("dr_lan1_rx");
1113 char *lan2_tx
= nvram_safe_get("dr_lan2_tx");
1114 char *lan2_rx
= nvram_safe_get("dr_lan2_rx");
1115 char *lan3_tx
= nvram_safe_get("dr_lan3_tx");
1116 char *lan3_rx
= nvram_safe_get("dr_lan3_rx");
1117 char *wan_tx
= nvram_safe_get("dr_wan_tx");
1118 char *wan_rx
= nvram_safe_get("dr_wan_rx");
1120 if ((*lan_tx
== '0') && (*lan_rx
== '0') &&
1121 (*lan1_tx
== '0') && (*lan1_rx
== '0') &&
1122 (*lan2_tx
== '0') && (*lan2_rx
== '0') &&
1123 (*lan3_tx
== '0') && (*lan3_rx
== '0') &&
1124 (*wan_tx
== '0') && (*wan_rx
== '0')) {
1129 if ((fp
= fopen("/etc/zebra.conf", "w")) != NULL
) {
1134 if ((fp
= fopen("/etc/ripd.conf", "w")) != NULL
) {
1135 char *lan_ifname
= nvram_safe_get("lan_ifname");
1136 char *lan1_ifname
= nvram_safe_get("lan1_ifname");
1137 char *lan2_ifname
= nvram_safe_get("lan2_ifname");
1138 char *lan3_ifname
= nvram_safe_get("lan3_ifname");
1139 char *wan_ifname
= nvram_safe_get("wan_ifname");
1141 fprintf(fp
, "router rip\n");
1142 if(strcmp(lan_ifname
,"")!=0)
1143 fprintf(fp
, "network %s\n", lan_ifname
);
1144 if(strcmp(lan1_ifname
,"")!=0)
1145 fprintf(fp
, "network %s\n", lan1_ifname
);
1146 if(strcmp(lan2_ifname
,"")!=0)
1147 fprintf(fp
, "network %s\n", lan2_ifname
);
1148 if(strcmp(lan3_ifname
,"")!=0)
1149 fprintf(fp
, "network %s\n", lan3_ifname
);
1150 fprintf(fp
, "network %s\n", wan_ifname
);
1151 fprintf(fp
, "redistribute connected\n");
1152 //fprintf(fp, "redistribute static\n");
1154 // 43011: modify by zg 2006.10.18 for cdrouter3.3 item 173(cdrouter_rip_30) bug
1155 // fprintf(fp, "redistribute kernel\n"); // 1.11: removed, redistributes indirect -- zzz
1157 if(strcmp(lan_ifname
,"")!=0) {
1158 fprintf(fp
, "interface %s\n", lan_ifname
);
1159 if (*lan_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", lan_tx
);
1160 if (*lan_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", lan_rx
);
1162 if(strcmp(lan1_ifname
,"")!=0) {
1163 fprintf(fp
, "interface %s\n", lan1_ifname
);
1164 if (*lan1_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", lan1_tx
);
1165 if (*lan1_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", lan1_rx
);
1167 if(strcmp(lan2_ifname
,"")!=0) {
1168 fprintf(fp
, "interface %s\n", lan2_ifname
);
1169 if (*lan2_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", lan2_tx
);
1170 if (*lan2_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", lan2_rx
);
1172 if(strcmp(lan3_ifname
,"")!=0) {
1173 fprintf(fp
, "interface %s\n", lan3_ifname
);
1174 if (*lan3_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", lan3_tx
);
1175 if (*lan3_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", lan3_rx
);
1177 fprintf(fp
, "interface %s\n", wan_ifname
);
1178 if (*wan_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", wan_tx
);
1179 if (*wan_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", wan_rx
);
1181 fprintf(fp
, "router rip\n");
1182 if(strcmp(lan_ifname
,"")!=0) {
1183 if (*lan_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", lan_ifname
);
1184 if (*lan_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", lan_ifname
);
1186 if(strcmp(lan1_ifname
,"")!=0) {
1187 if (*lan1_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", lan1_ifname
);
1188 if (*lan1_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", lan1_ifname
);
1190 if(strcmp(lan2_ifname
,"")!=0) {
1191 if (*lan2_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", lan2_ifname
);
1192 if (*lan2_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", lan2_ifname
);
1194 if(strcmp(lan3_ifname
,"")!=0) {
1195 if (*lan3_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", lan3_ifname
);
1196 if (*lan3_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", lan3_ifname
);
1198 if (*wan_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", wan_ifname
);
1199 if (*wan_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", wan_ifname
);
1200 fprintf(fp
, "access-list private deny any\n");
1202 //fprintf(fp, "debug rip events\n");
1203 //fprintf(fp, "log file /etc/ripd.log\n");
1207 xstart("zebra", "-d");
1208 xstart("ripd", "-d");
1212 void stop_zebra(void)
1214 #ifdef TCONFIG_ZEBRA
1215 if (getpid() != 1) {
1216 stop_service("zebra");
1220 killall("zebra", SIGTERM
);
1221 killall("ripd", SIGTERM
);
1223 unlink("/etc/zebra.conf");
1224 unlink("/etc/ripd.conf");
1228 // -----------------------------------------------------------------------------
1230 void start_syslog(void)
1240 char *rot_siz
= "50";
1241 char *rot_keep
= "1";
1242 char *log_file_path
;
1244 argv
[0] = "syslogd";
1247 if (nvram_match("log_remote", "1")) {
1248 nv
= nvram_safe_get("log_remoteip");
1250 snprintf(rem
, sizeof(rem
), "%s:%s", nv
, nvram_safe_get("log_remoteport"));
1251 argv
[argc
++] = "-R";
1256 if (nvram_match("log_file", "1")) {
1257 argv
[argc
++] = "-L";
1259 if (strcmp(nvram_safe_get("log_file_size"), "") != 0) {
1260 rot_siz
= nvram_safe_get("log_file_size");
1262 if (nvram_get_int("log_file_size") > 0) {
1263 rot_keep
= nvram_safe_get("log_file_keep");
1266 // log to custom path - shibby
1267 if (nvram_match("log_file_custom", "1")) {
1268 log_file_path
= nvram_safe_get("log_file_path");
1269 argv
[argc
++] = "-s";
1270 argv
[argc
++] = rot_siz
;
1271 argv
[argc
++] = "-O";
1272 argv
[argc
++] = log_file_path
;
1273 if (strcmp(nvram_safe_get("log_file_path"), "/var/log/messages") != 0) {
1274 remove("/var/log/messages");
1275 symlink(log_file_path
, "/var/log/messages");
1280 /* Read options: rotate_size(kb) num_backups logfilename.
1281 * Ignore these settings and use defaults if the logfile cannot be written to.
1283 if (f_read_string("/etc/syslogd.cfg", cfg
, sizeof(cfg
)) > 0) {
1284 if ((nv
= strchr(cfg
, '\n')))
1287 if ((nv
= strtok(cfg
, " \t"))) {
1292 if ((nv
= strtok(NULL
, " \t")))
1295 if ((nv
= strtok(NULL
, " \t")) && *nv
== '/') {
1296 if (f_write(nv
, cfg
, 0, FW_APPEND
, 0) >= 0) {
1297 argv
[argc
++] = "-O";
1307 if (nvram_match("log_file_custom", "0")) {
1308 argv
[argc
++] = "-s";
1309 argv
[argc
++] = rot_siz
;
1311 if (lstat("/var/log/messages", &sb
) != -1)
1312 if (S_ISLNK(sb
.st_mode
))
1313 remove("/var/log/messages");
1316 if (isdigit(*b_opt
)) {
1317 argv
[argc
++] = "-b";
1318 argv
[argc
++] = b_opt
;
1320 if (nvram_get_int("log_file_size") > 0) {
1321 argv
[argc
++] = "-b";
1322 argv
[argc
++] = rot_keep
;
1328 _eval(argv
, NULL
, 0, NULL
);
1332 _eval(argv
, NULL
, 0, NULL
);
1334 // used to be available in syslogd -m
1335 n
= nvram_get_int("log_mark");
1339 sprintf(rem
, "*/%d * * * *", n
);
1340 else if (n
< 60 * 24)
1341 sprintf(rem
, "0 */%d * * *", n
/ 60);
1343 sprintf(rem
, "0 0 */%d * *", n
/ (60 * 24));
1344 sprintf(s
, "%s logger -p syslog.info -- -- MARK --", rem
);
1345 eval("cru", "a", "syslogdmark", s
);
1348 eval("cru", "d", "syslogdmark");
1353 void stop_syslog(void)
1355 killall("klogd", SIGTERM
);
1356 killall("syslogd", SIGTERM
);
1359 // -----------------------------------------------------------------------------
1361 static pid_t pid_igmp
= -1;
1363 void start_igmp_proxy(void)
1368 if (nvram_match("multicast_pass", "1")) {
1369 if (get_wan_proto() == WP_DISABLED
)
1372 if (f_exists("/etc/igmp.alt")) {
1373 eval("igmpproxy", "/etc/igmp.alt");
1375 else if ((fp
= fopen("/etc/igmp.conf", "w")) != NULL
) {
1378 "phyint %s upstream\n"
1380 // "phyint %s downstream ratelimit 0\n",
1382 nvram_get("multicast_altnet") ? : "0.0.0.0/0");
1383 // nvram_safe_get("lan_ifname"));
1385 char lanN_ifname
[] = "lanXX_ifname";
1386 char multicast_lanN
[] = "multicast_lanXX";
1389 for(br
=0 ; br
<4 ; br
++) {
1390 char bridge
[2] = "0";
1396 sprintf(lanN_ifname
, "lan%s_ifname", bridge
);
1397 sprintf(multicast_lanN
, "multicast_lan%s", bridge
);
1399 if((strcmp(nvram_safe_get(multicast_lanN
),"1")==0) && (strcmp(nvram_safe_get(lanN_ifname
),"")!=0)) {
1401 "phyint %s downstream ratelimit 0\n",
1402 nvram_safe_get(lanN_ifname
));
1406 eval("igmpproxy", "/etc/igmp.conf");
1411 if (!nvram_contains_word("debug_norestart", "igmprt")) {
1417 void stop_igmp_proxy(void)
1420 killall_tk("igmpproxy");
1423 // -----------------------------------------------------------------------------
1425 void start_udpxy(void)
1427 if (nvram_match("udpxy_enable", "1")) {
1428 if (get_wan_proto() == WP_DISABLED
)
1430 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") );
1434 void stop_udpxy(void)
1436 killall_tk("udpxy");
1439 // -----------------------------------------------------------------------------
1441 #ifdef TCONFIG_NOCAT
1443 static pid_t pid_splashd
= -1;
1444 void start_splashd(void)
1448 if (!nvram_contains_word("debug_norestart", "splashd")) {
1453 void stop_splashd(void)
1461 // -----------------------------------------------------------------------------
1462 #ifdef TCONFIG_NGINX
1464 static pid_t pid_nginx
= -1;
1465 void start_enginex(void)
1469 if (!nvram_contains_word("debug_norestart","enginex")) {
1474 void stop_enginex(void)
1480 void start_nginxfastpath(void)
1484 if (!nvram_contains_word("debug_norestart","nginxfp")) {
1488 void stop_nginxfastpath(void)
1495 // -----------------------------------------------------------------------------
1499 f_write_string("/etc/TZ", nvram_safe_get("tm_tz"), FW_CREATE
|FW_NEWLINE
, 0644);
1502 void start_ntpc(void)
1504 static char servers
[32];
1510 if (nvram_get_int("ntp_updates") >= 0) {
1511 strcpy(servers
, nvram_safe_get("ntp_server"));
1512 xstart("ntpclient", "-h", servers
, "-i", "3", "-l", "-s");
1516 void stop_ntpc(void)
1518 killall("ntpclient", SIGTERM
);
1521 // -----------------------------------------------------------------------------
1523 static void stop_rstats(void)
1533 while ((n
-- > 0) && ((pid
= pidof("rstats")) > 0)) {
1535 pidz
= pidof("gzip");
1536 if (pidz
< 1) pidz
= pidof("cp");
1537 ppidz
= ppid(ppid(pidz
));
1538 if ((m
> 0) && (pidz
> 0) && (pid
== ppidz
)) {
1539 syslog(LOG_DEBUG
, "rstats(PID %d) shutting down, waiting for helper process to complete(PID %d, PPID %d).\n", pid
, pidz
, ppidz
);
1546 if ((w
== 1) && (n
> 0))
1547 syslog(LOG_DEBUG
, "rstats stopped.\n");
1550 static void start_rstats(int new)
1552 if (nvram_match("rstats_enable", "1")) {
1555 syslog(LOG_DEBUG
, "starting rstats (new datafile).\n");
1556 xstart("rstats", "--new");
1558 syslog(LOG_DEBUG
, "starting rstats.\n");
1564 static void stop_cstats(void)
1574 while ((n
-- > 0) && ((pid
= pidof("cstats")) > 0)) {
1576 pidz
= pidof("gzip");
1577 if (pidz
< 1) pidz
= pidof("cp");
1578 ppidz
= ppid(ppid(pidz
));
1579 if ((m
> 0) && (pidz
> 0) && (pid
== ppidz
)) {
1580 syslog(LOG_DEBUG
, "cstats(PID %d) shutting down, waiting for helper process to complete(PID %d, PPID %d).\n", pid
, pidz
, ppidz
);
1587 if ((w
== 1) && (n
> 0))
1588 syslog(LOG_DEBUG
, "cstats stopped.\n");
1591 static void start_cstats(int new)
1593 if (nvram_match("cstats_enable", "1")) {
1596 syslog(LOG_DEBUG
, "starting cstats (new datafile).\n");
1597 xstart("cstats", "--new");
1599 syslog(LOG_DEBUG
, "starting cstats.\n");
1605 // -----------------------------------------------------------------------------
1607 // !!TB - FTP Server
1610 static char *get_full_storage_path(char *val
)
1612 static char buf
[128];
1616 len
= sprintf(buf
, "%s", val
);
1618 len
= sprintf(buf
, "%s/%s", MOUNT_ROOT
, val
);
1620 if (len
> 1 && buf
[len
- 1] == '/')
1626 static char *nvram_storage_path(char *var
)
1628 char *val
= nvram_safe_get(var
);
1629 return get_full_storage_path(val
);
1632 char vsftpd_conf
[] = "/etc/vsftpd.conf";
1633 char vsftpd_users
[] = "/etc/vsftpd.users";
1634 char vsftpd_passwd
[] = "/etc/vsftpd.passwd";
1636 /* VSFTPD code mostly stolen from Oleg's ASUS Custom Firmware GPL sources */
1638 static void start_ftpd(void)
1644 char *user
, *pass
, *rights
, *root_dir
;
1647 if (getpid() != 1) {
1648 start_service("ftpd");
1652 if (!nvram_get_int("ftp_enable")) return;
1654 mkdir_if_none(vsftpd_users
);
1655 mkdir_if_none("/var/run/vsftpd");
1657 if ((fp
= fopen(vsftpd_conf
, "w")) == NULL
)
1660 if (nvram_get_int("ftp_super"))
1663 sprintf(tmp
, "%s/%s", vsftpd_users
, "admin");
1664 if ((f
= fopen(tmp
, "w")))
1667 "dirlist_enable=yes\n"
1668 "write_enable=yes\n"
1669 "download_enable=yes\n");
1674 if (nvram_invmatch("ftp_anonymous", "0"))
1677 "anon_allow_writable_root=yes\n"
1678 "anon_world_readable_only=no\n"
1679 "anon_umask=022\n");
1682 sprintf(tmp
, "%s/ftp", vsftpd_users
);
1683 if ((f
= fopen(tmp
, "w")))
1685 if (nvram_match("ftp_dirlist", "0"))
1686 fprintf(f
, "dirlist_enable=yes\n");
1687 if (nvram_match("ftp_anonymous", "1") ||
1688 nvram_match("ftp_anonymous", "3"))
1689 fprintf(f
, "write_enable=yes\n");
1690 if (nvram_match("ftp_anonymous", "1") ||
1691 nvram_match("ftp_anonymous", "2"))
1692 fprintf(f
, "download_enable=yes\n");
1695 if (nvram_match("ftp_anonymous", "1") ||
1696 nvram_match("ftp_anonymous", "3"))
1698 "anon_upload_enable=yes\n"
1699 "anon_mkdir_write_enable=yes\n"
1700 "anon_other_write_enable=yes\n");
1702 fprintf(fp
, "anonymous_enable=no\n");
1706 "dirmessage_enable=yes\n"
1707 "download_enable=no\n"
1708 "dirlist_enable=no\n"
1710 "syslog_enable=yes\n"
1711 "local_enable=yes\n"
1714 "chroot_local_user=yes\n"
1716 "log_ftp_protocol=%s\n"
1717 "user_config_dir=%s\n"
1725 "max_login_fails=1\n"
1726 "idle_session_timeout=%s\n"
1728 "anon_max_rate=%d\n"
1729 "local_max_rate=%d\n"
1731 nvram_get_int("log_ftp") ? "yes" : "no",
1732 vsftpd_users
, vsftpd_passwd
,
1734 ipv6_enabled() ? "_ipv6" : "",
1738 nvram_get("ftp_port") ? : "21",
1739 nvram_get_int("ftp_max"),
1740 nvram_get_int("ftp_ipmax"),
1741 nvram_get("ftp_staytimeout") ? : "300",
1742 nvram_get_int("ftp_anonrate") * 1024,
1743 nvram_get_int("ftp_rate") * 1024,
1744 nvram_safe_get("ftp_custom"));
1748 /* prepare passwd file and default users */
1749 if ((fp
= fopen(vsftpd_passwd
, "w")) == NULL
)
1752 if (((user
= nvram_get("http_username")) == NULL
) || (*user
== 0)) user
= "admin";
1753 if (((pass
= nvram_get("http_passwd")) == NULL
) || (*pass
== 0)) pass
= "admin";
1755 fprintf(fp
, /* anonymous, admin, nobody */
1756 "ftp:x:0:0:ftp:%s:/sbin/nologin\n"
1757 "%s:%s:0:0:root:/:/sbin/nologin\n"
1758 "nobody:x:65534:65534:nobody:%s/:/sbin/nologin\n",
1759 nvram_storage_path("ftp_anonroot"), user
,
1760 nvram_get_int("ftp_super") ? crypt(pass
, "$1$") : "x",
1763 if ((buf
= strdup(nvram_safe_get("ftp_users"))) != NULL
)
1766 username<password<rights[<root_dir>]
1774 while ((q
= strsep(&p
, ">")) != NULL
) {
1775 i
= vstrsep(q
, "<", &user
, &pass
, &rights
, &root_dir
);
1776 if (i
< 3 || i
> 4) continue;
1777 if (!user
|| !pass
) continue;
1779 if (i
== 3 || !root_dir
|| !(*root_dir
))
1781 root_dir
= nvram_safe_get("ftp_pubroot");
1784 if (strncmp(rights
, "Private", 7) == 0)
1786 sprintf(tmp
, "%s/%s", nvram_storage_path("ftp_pvtroot"), user
);
1790 sprintf(tmp
, "%s", get_full_storage_path(root_dir
));
1792 fprintf(fp
, "%s:%s:0:0:%s:%s:/sbin/nologin\n",
1793 user
, crypt(pass
, "$1$"), user
, tmp
);
1796 sprintf(tmp
, "%s/%s", vsftpd_users
, user
);
1797 if ((f
= fopen(tmp
, "w")))
1800 if (nvram_invmatch("ftp_dirlist", "1"))
1801 strcat(tmp
, "dirlist_enable=yes\n");
1802 if (strstr(rights
, "Read") || !strcmp(rights
, "Private"))
1803 strcat(tmp
, "download_enable=yes\n");
1804 if (strstr(rights
, "Write") || !strncmp(rights
, "Private", 7))
1805 strcat(tmp
, "write_enable=yes\n");
1815 killall("vsftpd", SIGHUP
);
1817 /* start vsftpd if it's not already running */
1818 if (pidof("vsftpd") <= 0)
1822 static void stop_ftpd(void)
1824 if (getpid() != 1) {
1825 stop_service("ftpd");
1829 killall_tk("vsftpd");
1830 unlink(vsftpd_passwd
);
1831 unlink(vsftpd_conf
);
1832 eval("rm", "-rf", vsftpd_users
);
1834 #endif // TCONFIG_FTP
1836 // -----------------------------------------------------------------------------
1840 #ifdef TCONFIG_SAMBASRV
1841 static void kill_samba(int sig
)
1843 if (sig
== SIGTERM
) {
1848 killall("smbd", sig
);
1849 killall("nmbd", sig
);
1854 #ifdef TCONFIG_BCMARM
1855 extern void del_samba_rules(void);
1856 extern void add_samba_rules(void);
1860 static void start_samba(void)
1868 #ifdef TCONFIG_BCMARM
1869 int cpu_num
= sysconf(_SC_NPROCESSORS_CONF
);
1870 int taskset_ret
= -1;
1873 if (getpid() != 1) {
1874 start_service("smbd");
1878 mode
= nvram_get_int("smbd_enable");
1879 if (!mode
|| !nvram_invmatch("lan_hostname", ""))
1882 if ((fp
= fopen("/etc/smb.conf", "w")) == NULL
)
1885 #ifdef TCONFIG_GROCTRL
1889 fprintf(fp
, "[global]\n"
1890 " interfaces = %s\n"
1891 " bind interfaces only = yes\n"
1893 " netbios name = %s\n"
1894 " server string = %s\n"
1895 " guest account = nobody\n"
1896 " security = user\n"
1899 " guest only = no\n"
1900 " browseable = yes\n"
1901 " syslog only = yes\n"
1902 " timestamp logs = no\n"
1904 " encrypt passwords = yes\n"
1905 " preserve case = yes\n"
1906 " short preserve case = yes\n",
1907 nvram_safe_get("lan_ifname"),
1908 nvram_get("smbd_wgroup") ? : "WORKGROUP",
1909 nvram_safe_get("lan_hostname"),
1910 nvram_get("router_name") ? : "Tomato",
1911 mode
== 2 ? "" : "map to guest = Bad User",
1912 mode
== 2 ? "no" : "yes" // guest ok
1915 if (nvram_get_int("smbd_wins")) {
1916 nv
= nvram_safe_get("wan_wins");
1917 if ((*nv
== 0) || (strcmp(nv
, "0.0.0.0") == 0)) {
1918 fprintf(fp
, " wins support = yes\n");
1922 if (nvram_get_int("smbd_master")) {
1924 " domain master = yes\n"
1925 " local master = yes\n"
1926 " preferred master = yes\n"
1927 " os level = 65\n");
1930 nv
= nvram_safe_get("smbd_cpage");
1932 #ifndef TCONFIG_SAMBA3
1933 fprintf(fp
, " client code page = %s\n", nv
);
1935 sprintf(nlsmod
, "nls_cp%s", nv
);
1937 nv
= nvram_safe_get("smbd_nlsmod");
1938 if ((*nv
) && (strcmp(nv
, nlsmod
) != 0))
1942 nvram_set("smbd_nlsmod", nlsmod
);
1945 #ifndef TCONFIG_SAMBA3
1946 if (nvram_match("smbd_cset", "utf8"))
1947 fprintf(fp
, " coding system = utf8\n");
1948 else if (nvram_invmatch("smbd_cset", ""))
1949 fprintf(fp
, " character set = %s\n", nvram_safe_get("smbd_cset"));
1952 nv
= nvram_safe_get("smbd_custom");
1953 /* add socket options unless overriden by the user */
1954 if (strstr(nv
, "socket options") == NULL
) {
1955 fprintf(fp
, " socket options = TCP_NODELAY SO_KEEPALIVE IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536\n");
1957 fprintf(fp
, "%s\n\n", nv
);
1959 /* configure shares */
1963 char *name
, *path
, *comment
, *writeable
, *hidden
;
1966 if ((buf
= strdup(nvram_safe_get("smbd_shares"))) != NULL
)
1968 /* sharename<path<comment<writeable[0|1]<hidden[0|1] */
1971 while ((q
= strsep(&p
, ">")) != NULL
) {
1972 if (vstrsep(q
, "<", &name
, &path
, &comment
, &writeable
, &hidden
) != 5) continue;
1973 if (!path
|| !name
) continue;
1976 fprintf(fp
, "\n[%s]\n", name
);
1979 fprintf(fp
, " path = %s\n", path
);
1982 if (!strcmp(writeable
, "1"))
1983 fprintf(fp
, " writable = yes\n delete readonly = yes\n force user = root\n");
1984 if (!strcmp(hidden
, "1"))
1985 fprintf(fp
, " browseable = no\n");
1989 fprintf(fp
, " comment = %s\n", comment
);
1996 /* Share every mountpoint below MOUNT_ROOT */
1997 if (nvram_get_int("smbd_autoshare") && (dir
= opendir(MOUNT_ROOT
))) {
1998 while ((dp
= readdir(dir
))) {
1999 if (strcmp(dp
->d_name
, ".") && strcmp(dp
->d_name
, "..")) {
2001 /* Only if is a directory and is mounted */
2002 if (!dir_is_mountpoint(MOUNT_ROOT
, dp
->d_name
))
2005 /* smbd_autoshare: 0 - disable, 1 - read-only, 2 - writable, 3 - hidden writable */
2006 fprintf(fp
, "\n[%s]\n path = %s/%s\n comment = %s\n",
2007 dp
->d_name
, MOUNT_ROOT
, dp
->d_name
, dp
->d_name
);
2008 if (nvram_match("smbd_autoshare", "3")) // Hidden
2009 fprintf(fp
, "\n[%s$]\n path = %s/%s\n browseable = no\n",
2010 dp
->d_name
, MOUNT_ROOT
, dp
->d_name
);
2011 if (nvram_match("smbd_autoshare", "2") || nvram_match("smbd_autoshare", "3")) // RW
2012 fprintf(fp
, " writable = yes\n delete readonly = yes\n force user = root\n");
2018 if (dir
) closedir(dir
);
2021 /* by default share MOUNT_ROOT as read-only */
2022 fprintf(fp
, "\n[share]\n"
2030 mkdir_if_none("/var/run/samba");
2031 mkdir_if_none("/etc/samba");
2033 /* write smbpasswd */
2034 #ifdef TCONFIG_SAMBA3
2035 eval("smbpasswd", "nobody", "\"\"");
2037 eval("smbpasswd", "-a", "nobody", "\"\"");
2041 if (((smbd_user
= nvram_get("smbd_user")) == NULL
) || (*smbd_user
== 0) || !strcmp(smbd_user
, "root"))
2043 #ifdef TCONFIG_SAMBA3
2044 eval("smbpasswd", smbd_user
, nvram_safe_get("smbd_passwd"));
2046 eval("smbpasswd", "-a", smbd_user
, nvram_safe_get("smbd_passwd"));
2051 int ret1
= 0, ret2
= 0;
2052 /* start samba if it's not already running */
2053 if (pidof("nmbd") <= 0)
2054 ret1
= xstart("nmbd", "-D");
2055 if (pidof("smbd") <= 0) {
2056 #ifdef TCONFIG_BCMARM
2057 #ifdef TCONFIG_BCMSMP
2059 taskset_ret
= cpu_eval(NULL
, "1", "ionice", "-c1", "-n0", "smbd", "-D");
2061 taskset_ret
= eval("ionice", "-c1", "-n0", "smbd", "-D");
2063 if (taskset_ret
!= 0)
2066 ret2
= xstart("smbd", "-D");
2069 if (ret1
|| ret2
) kill_samba(SIGTERM
);
2072 static void stop_samba(void)
2074 if (getpid() != 1) {
2075 stop_service("smbd");
2079 kill_samba(SIGTERM
);
2081 unlink("/var/log/smb");
2082 unlink("/var/log/nmb");
2083 eval("rm", "-rf", "/var/run/samba");
2085 #ifdef TCONFIG_GROCTRL
2090 #endif // TCONFIG_SAMBASRV
2092 #ifdef TCONFIG_GROCTRL
2093 void enable_gro(int interval
)
2095 char *argv
[3] = {"echo", "", NULL
};
2096 char lan_ifname
[32], *lan_ifnames
, *next
;
2097 char path
[64] = {0};
2098 char parm
[32] = {0};
2100 if(nvram_get_int("gro_disable"))
2103 /* enabled gso on vlan interface */
2104 lan_ifnames
= nvram_safe_get("lan_ifnames");
2105 foreach(lan_ifname
, lan_ifnames
, next
) {
2106 if (!strncmp(lan_ifname
, "vlan", 4)) {
2107 sprintf(path
, ">>/proc/net/vlan/%s", lan_ifname
);
2108 sprintf(parm
, "-gro %d", interval
);
2110 _eval(argv
, path
, 0, NULL
);
2116 #ifdef TCONFIG_MEDIA_SERVER
2117 #define MEDIA_SERVER_APP "minidlna"
2119 static void start_media_server(void)
2122 int port
, pid
, https
;
2124 char *argv
[] = { MEDIA_SERVER_APP
, "-f", "/etc/"MEDIA_SERVER_APP
".conf", "-R", NULL
};
2125 static int once
= 1;
2127 if (getpid() != 1) {
2128 start_service("media");
2132 if (nvram_get_int("ms_sas") == 0)
2135 if (nvram_get_int("ms_enable") != 0) {
2136 if ((!once
) && (nvram_get_int("ms_rescan") == 0)) {
2140 nvram_unset("ms_rescan");
2142 if (f_exists("/etc/"MEDIA_SERVER_APP
".alt")) {
2143 argv
[2] = "/etc/"MEDIA_SERVER_APP
".alt";
2146 if ((f
= fopen(argv
[2], "w")) != NULL
) {
2147 port
= nvram_get_int("ms_port");
2148 https
= nvram_get_int("https_enable");
2149 dbdir
= nvram_safe_get("ms_dbdir");
2150 if (!(*dbdir
)) dbdir
= NULL
;
2151 mkdir_if_none(dbdir
? : "/var/run/"MEDIA_SERVER_APP
);
2154 "network_interface=%s\n"
2156 "friendly_name=%s\n"
2160 "presentation_url=http%s://%s:%s/nas-media.asp\n"
2162 "notify_interval=600\n"
2163 "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"
2164 "log_dir=/var/log\n"
2165 "log_level=general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=warn\n"
2167 nvram_safe_get("lan_ifname"),
2168 (port
< 0) || (port
>= 0xffff) ? 0 : port
,
2169 nvram_get("router_name") ? : "Tomato",
2170 dbdir
? : "/var/run/"MEDIA_SERVER_APP
,
2171 nvram_get_int("ms_tivo") ? "yes" : "no",
2172 nvram_get_int("ms_stdlna") ? "yes" : "no",
2173 https
? "s" : "", nvram_safe_get("lan_ipaddr"), nvram_safe_get(https
? "https_lanport" : "http_lanport")
2176 // media directories
2178 char *path
, *restrict
;
2180 if ((buf
= strdup(nvram_safe_get("ms_dirs"))) != NULL
) {
2181 /* path<restrict[A|V|P|] */
2184 while ((q
= strsep(&p
, ">")) != NULL
) {
2185 if (vstrsep(q
, "<", &path
, &restrict
) < 1 || !path
|| !(*path
))
2187 fprintf(f
, "media_dir=%s%s%s\n",
2188 restrict
? : "", (restrict
&& *restrict
) ? "," : "", path
);
2197 /* start media server if it's not already running */
2198 if (pidof(MEDIA_SERVER_APP
) <= 0) {
2199 if ((_eval(argv
, NULL
, 0, &pid
) == 0) && (once
)) {
2200 /* If we started the media server successfully, wait 1 sec
2201 * to let it die if it can't open the database file.
2202 * If it's still alive after that, assume it's running and
2203 * disable forced once-after-reboot rescan.
2206 if (pidof(MEDIA_SERVER_APP
) > 0)
2213 static void stop_media_server(void)
2215 if (getpid() != 1) {
2216 stop_service("media");
2220 killall_tk(MEDIA_SERVER_APP
);
2222 #endif // TCONFIG_MEDIA_SERVER
2225 static void start_nas_services(void)
2227 if (getpid() != 1) {
2228 start_service("usbapps");
2232 #ifdef TCONFIG_SAMBASRV
2238 #ifdef TCONFIG_MEDIA_SERVER
2239 start_media_server();
2243 static void stop_nas_services(void)
2245 if (getpid() != 1) {
2246 stop_service("usbapps");
2250 #ifdef TCONFIG_MEDIA_SERVER
2251 stop_media_server();
2256 #ifdef TCONFIG_SAMBASRV
2261 void restart_nas_services(int stop
, int start
)
2263 int fd
= file_lock("usb");
2264 /* restart all NAS applications */
2266 stop_nas_services();
2268 start_nas_services();
2271 #endif // TCONFIG_USB
2273 // -----------------------------------------------------------------------------
2275 /* -1 = Don't check for this program, it is not expected to be running.
2276 * Other = This program has been started and should be kept running. If no
2277 * process with the name is running, call func to restart it.
2278 * Note: At startup, dnsmasq forks a short-lived child which forks a
2279 * long-lived (grand)child. The parents terminate.
2280 * Many daemons use this technique.
2282 static void _check(pid_t pid
, const char *name
, void (*func
)(void))
2284 if (pid
== -1) return;
2286 if (pidof(name
) > 0) return;
2288 syslog(LOG_DEBUG
, "%s terminated unexpectedly, restarting.\n", name
);
2291 // Force recheck in 500 msec
2292 setitimer(ITIMER_REAL
, &pop_tv
, NULL
);
2295 void check_services(void)
2297 TRACE_PT("keep alive\n");
2299 // Periodically reap any zombies
2300 setitimer(ITIMER_REAL
, &zombie_tv
, NULL
);
2303 _check(pid_hotplug2
, "hotplug2", start_hotplug2
);
2305 _check(pid_dnsmasq
, "dnsmasq", start_dnsmasq
);
2306 _check(pid_crond
, "crond", start_cron
);
2307 _check(pid_igmp
, "igmpproxy", start_igmp_proxy
);
2309 //#ifdef TCONFIG_NOCAT
2310 // if (nvram_get_int("NC_enable"))
2311 // _check(&pid_splashd, "splashd", start_splashd);
2316 // -----------------------------------------------------------------------------
2318 void start_services(void)
2320 static int once
= 1;
2325 if (nvram_get_int("telnetd_eas")) start_telnetd();
2326 if (nvram_get_int("sshd_eas")) start_sshd();
2338 #ifdef TCONFIG_NGINX
2347 #ifdef TCONFIG_PPTPD
2350 restart_nas_services(1, 1); // !!TB - Samba, FTP and Media Server
2364 #ifdef TCONFIG_NOCAT
2372 #ifdef TCONFIG_FANCTRL
2373 start_phy_tempsense();
2377 if (get_model() == MODEL_R7000
) {
2378 //enable WAN port led
2379 system("/usr/sbin/et robowr 0x0 0x10 0x3000");
2380 system("/usr/sbin/et robowr 0x0 0x12 0x78");
2381 system("/usr/sbin/et robowr 0x0 0x14 0x01");
2382 system("gpio disable 9");
2386 void stop_services(void)
2390 #ifdef TCONFIG_FANCTRL
2391 stop_phy_tempsense();
2398 #ifdef TCONFIG_NOCAT
2413 restart_nas_services(1, 0); // stop Samba, FTP and Media Server
2414 #ifdef TCONFIG_PPTPD
2423 #ifdef TCONFIG_NGINX
2437 // -----------------------------------------------------------------------------
2439 /* nvram "action_service" is: "service-action[-modifier]"
2440 * action is something like "stop" or "start" or "restart"
2441 * optional modifier is "c" for the "service" command-line command
2443 void exec_service(void)
2445 const int A_START
= 1;
2446 const int A_STOP
= 2;
2447 const int A_RESTART
= 1|2;
2456 strlcpy(buffer
, nvram_safe_get("action_service"), sizeof(buffer
));
2460 act
= strsep(&next
, ",");
2461 service
= strsep(&act
, "-");
2467 strsep(&modifier
, "-");
2469 TRACE_PT("service=%s action=%s modifier=%s\n", service
, act
, modifier
? : "");
2471 if (strcmp(act
, "start") == 0) action
= A_START
;
2472 else if (strcmp(act
, "stop") == 0) action
= A_STOP
;
2473 else if (strcmp(act
, "restart") == 0) action
= A_RESTART
;
2475 user
= (modifier
!= NULL
&& *modifier
== 'c');
2477 if (strcmp(service
, "dhcpc") == 0) {
2478 if (action
& A_STOP
) stop_dhcpc();
2479 if (action
& A_START
) start_dhcpc();
2483 if ((strcmp(service
, "dhcpd") == 0) || (strcmp(service
, "dns") == 0) || (strcmp(service
, "dnsmasq") == 0)) {
2484 if (action
& A_STOP
) stop_dnsmasq();
2485 if (action
& A_START
) {
2492 if (strcmp(service
, "firewall") == 0) {
2493 if (action
& A_STOP
) {
2498 if (action
& A_START
) {
2506 if (strcmp(service
, "restrict") == 0) {
2507 if (action
& A_STOP
) {
2510 if (action
& A_START
) {
2511 i
= nvram_get_int("rrules_radio"); // -1 = not used, 0 = enabled by rule, 1 = disabled by rule
2515 // if radio was disabled by access restriction, but no rule is handling it now, enable it
2517 if (nvram_get_int("rrules_radio") < 0) {
2518 eval("radio", "on");
2525 if (strcmp(service
, "arpbind") == 0) {
2526 if (action
& A_STOP
) stop_arpbind();
2527 if (action
& A_START
) start_arpbind();
2531 if (strcmp(service
, "qos") == 0) {
2532 if (action
& A_STOP
) {
2535 stop_firewall(); start_firewall(); // always restarted
2536 if (action
& A_START
) {
2538 if (nvram_match("qos_reset", "1")) f_write_string("/proc/net/clear_marks", "1", 0, 0);
2543 if (strcmp(service
, "qoslimit") == 0) {
2544 if (action
& A_STOP
) {
2545 new_qoslimit_stop();
2547 #ifdef TCONFIG_NOCAT
2550 stop_firewall(); start_firewall(); // always restarted
2551 if (action
& A_START
) {
2552 new_qoslimit_start();
2554 #ifdef TCONFIG_NOCAT
2560 if (strcmp(service
, "upnp") == 0) {
2561 if (action
& A_STOP
) {
2564 stop_firewall(); start_firewall(); // always restarted
2565 if (action
& A_START
) {
2571 if (strcmp(service
, "telnetd") == 0) {
2572 if (action
& A_STOP
) stop_telnetd();
2573 if (action
& A_START
) start_telnetd();
2577 if (strcmp(service
, "sshd") == 0) {
2578 if (action
& A_STOP
) stop_sshd();
2579 if (action
& A_START
) start_sshd();
2583 if (strcmp(service
, "httpd") == 0) {
2584 if (action
& A_STOP
) stop_httpd();
2585 if (action
& A_START
) start_httpd();
2590 if (strcmp(service
, "ipv6") == 0) {
2591 if (action
& A_STOP
) {
2595 if (action
& A_START
) {
2602 if (strncmp(service
, "dhcp6", 5) == 0) {
2603 if (action
& A_STOP
) {
2606 if (action
& A_START
) {
2613 if (strcmp(service
, "admin") == 0) {
2614 if (action
& A_STOP
) {
2619 stop_firewall(); start_firewall(); // always restarted
2620 if (action
& A_START
) {
2623 if (nvram_match("telnetd_eas", "1")) start_telnetd();
2624 if (nvram_match("sshd_eas", "1")) start_sshd();
2629 if (strcmp(service
, "ddns") == 0) {
2630 if (action
& A_STOP
) stop_ddns();
2631 if (action
& A_START
) start_ddns();
2635 if (strcmp(service
, "ntpc") == 0) {
2636 if (action
& A_STOP
) stop_ntpc();
2637 if (action
& A_START
) start_ntpc();
2641 if (strcmp(service
, "logging") == 0) {
2642 if (action
& A_STOP
) {
2645 if (action
& A_START
) {
2649 // always restarted except from "service" command
2650 stop_cron(); start_cron();
2651 stop_firewall(); start_firewall();
2656 if (strcmp(service
, "crond") == 0) {
2657 if (action
& A_STOP
) {
2660 if (action
& A_START
) {
2667 if (strncmp(service
, "hotplug", 7) == 0) {
2668 if (action
& A_STOP
) {
2671 if (action
& A_START
) {
2678 if (strcmp(service
, "upgrade") == 0) {
2679 if (action
& A_START
) {
2684 restart_nas_services(1, 0); // stop Samba, FTP and Media Server
2692 killall("rstats", SIGTERM
);
2693 killall("cstats", SIGTERM
);
2694 killall("buttons", SIGTERM
);
2696 remove_storage_main(1); // !!TB - USB Support
2697 stop_usb(); // !!TB - USB Support
2703 if (strcmp(service
, "cifs") == 0) {
2704 if (action
& A_STOP
) stop_cifs();
2705 if (action
& A_START
) start_cifs();
2710 #ifdef TCONFIG_JFFS2
2711 if (strncmp(service
, "jffs", 4) == 0) {
2712 if (action
& A_STOP
) stop_jffs2();
2713 if (action
& A_START
) start_jffs2();
2718 if (strcmp(service
, "zebra") == 0) {
2719 if (action
& A_STOP
) stop_zebra();
2720 if (action
& A_START
) start_zebra();
2725 if (strcmp(service
, "mmc") == 0) {
2726 if (action
& A_STOP
) stop_mmc();
2727 if (action
& A_START
) start_mmc();
2732 if (strcmp(service
, "routing") == 0) {
2733 if (action
& A_STOP
) {
2735 do_static_routes(0); // remove old '_saved'
2736 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "0");
2737 if(strcmp(nvram_safe_get("lan1_ifname"),"")!=0)
2738 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "0");
2739 if(strcmp(nvram_safe_get("lan2_ifname"),"")!=0)
2740 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "0");
2741 if(strcmp(nvram_safe_get("lan3_ifname"),"")!=0)
2742 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "0");
2746 if (action
& A_START
) {
2747 do_static_routes(1); // add new
2749 eval("brctl", "stp", nvram_safe_get("lan_ifname"), nvram_safe_get("lan_stp"));
2750 if(strcmp(nvram_safe_get("lan1_ifname"),"")!=0)
2751 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), nvram_safe_get("lan1_stp"));
2752 if(strcmp(nvram_safe_get("lan2_ifname"),"")!=0)
2753 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), nvram_safe_get("lan2_stp"));
2754 if(strcmp(nvram_safe_get("lan3_ifname"),"")!=0)
2755 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), nvram_safe_get("lan3_stp"));
2760 if (strcmp(service
, "ctnf") == 0) {
2761 if (action
& A_START
) {
2769 if (strcmp(service
, "wan") == 0) {
2770 if (action
& A_STOP
) {
2774 if (action
& A_START
) {
2775 rename("/tmp/ppp/log", "/tmp/ppp/log.~");
2783 if (strcmp(service
, "net") == 0) {
2784 if (action
& A_STOP
) {
2786 stop_nas_services();
2796 if (action
& A_START
) {
2806 start_nas_services();
2812 if (strcmp(service
, "wireless") == 0) {
2813 if(action
& A_STOP
) {
2816 if(action
& A_START
) {
2822 if (strcmp(service
, "wl") == 0) {
2823 if(action
& A_STOP
) {
2827 if(action
& A_START
) {
2836 if (strcmp(service
, "nas") == 0) {
2837 if (action
& A_STOP
) {
2840 if (action
& A_START
) {
2847 if (strcmp(service
, "rstats") == 0) {
2848 if (action
& A_STOP
) stop_rstats();
2849 if (action
& A_START
) start_rstats(0);
2853 if (strcmp(service
, "rstatsnew") == 0) {
2854 if (action
& A_STOP
) stop_rstats();
2855 if (action
& A_START
) start_rstats(1);
2859 if (strcmp(service
, "cstats") == 0) {
2860 if (action
& A_STOP
) stop_cstats();
2861 if (action
& A_START
) start_cstats(0);
2865 if (strcmp(service
, "cstatsnew") == 0) {
2866 if (action
& A_STOP
) stop_cstats();
2867 if (action
& A_START
) start_cstats(1);
2871 if (strcmp(service
, "sched") == 0) {
2872 if (action
& A_STOP
) stop_sched();
2873 if (action
& A_START
) start_sched();
2878 if (strcmp(service
, "bittorrent") == 0) {
2879 if (action
& A_STOP
) {
2882 stop_firewall(); start_firewall(); // always restarted
2883 if (action
& A_START
) {
2891 if (strcmp(service
, "nfs") == 0) {
2892 if (action
& A_STOP
) stop_nfs();
2893 if (action
& A_START
) start_nfs();
2899 if (strcmp(service
, "snmp") == 0) {
2900 if (action
& A_STOP
) stop_snmp();
2901 if (action
& A_START
) start_snmp();
2907 if (strcmp(service
, "tor") == 0) {
2908 if (action
& A_STOP
) stop_tor();
2910 stop_firewall(); start_firewall(); // always restarted
2912 if (action
& A_START
) start_tor();
2918 if (strcmp(service
, "ups") == 0) {
2919 if (action
& A_STOP
) stop_ups();
2920 if (action
& A_START
) start_ups();
2926 // !!TB - USB Support
2927 if (strcmp(service
, "usb") == 0) {
2928 if (action
& A_STOP
) stop_usb();
2929 if (action
& A_START
) {
2931 // restart Samba and ftp since they may be killed by stop_usb()
2932 restart_nas_services(0, 1);
2933 // remount all partitions by simulating hotplug event
2934 add_remove_usbhost("-1", 1);
2939 if (strcmp(service
, "usbapps") == 0) {
2940 if (action
& A_STOP
) stop_nas_services();
2941 if (action
& A_START
) start_nas_services();
2947 // !!TB - FTP Server
2948 if (strcmp(service
, "ftpd") == 0) {
2949 if (action
& A_STOP
) stop_ftpd();
2953 if (action
& A_START
) start_ftpd();
2958 #ifdef TCONFIG_MEDIA_SERVER
2959 if (strcmp(service
, "media") == 0 || strcmp(service
, "dlna") == 0) {
2960 if (action
& A_STOP
) stop_media_server();
2961 if (action
& A_START
) start_media_server();
2966 #ifdef TCONFIG_SAMBASRV
2968 if (strcmp(service
, "samba") == 0 || strcmp(service
, "smbd") == 0) {
2969 if (action
& A_STOP
) stop_samba();
2970 if (action
& A_START
) {
2980 #ifdef TCONFIG_OPENVPN
2981 if (strncmp(service
, "vpnclient", 9) == 0) {
2982 if (action
& A_STOP
) stop_vpnclient(atoi(&service
[9]));
2983 if (action
& A_START
) start_vpnclient(atoi(&service
[9]));
2987 if (strncmp(service
, "vpnserver", 9) == 0) {
2988 if (action
& A_STOP
) stop_vpnserver(atoi(&service
[9]));
2989 if (action
& A_START
) start_vpnserver(atoi(&service
[9]));
2995 if (strcmp(service
, "tinc") == 0) {
2996 if (action
& A_STOP
) stop_tinc();
2997 if (action
& A_START
) start_tinc();
3002 #ifdef TCONFIG_FANCTRL
3003 if (strcmp(service
, "fanctrl") == 0) {
3004 if (action
& A_STOP
) stop_phy_tempsense();
3005 if (action
& A_START
) start_phy_tempsense();
3010 #ifdef TCONFIG_NOCAT
3011 if (strcmp(service
, "splashd") == 0) {
3012 if (action
& A_STOP
) stop_splashd();
3013 if (action
& A_START
) start_splashd();
3018 #ifdef TCONFIG_NGINX
3019 if (strcmp(service
, "enginex") == 0) {
3020 if (action
& A_STOP
) stop_enginex();
3021 stop_firewall(); start_firewall(); // always restarted
3022 if (action
& A_START
) start_enginex();
3025 if (strcmp(service
, "nginxfp") == 0) {
3026 if (action
& A_STOP
) stop_nginxfastpath();
3027 stop_firewall(); start_firewall(); // always restarted
3028 if (action
& A_START
) start_nginxfastpath();
3031 if (strcmp(service
, "mysql") == 0) {
3032 if (action
& A_STOP
) stop_mysql();
3033 stop_firewall(); start_firewall(); // always restarted
3034 if (action
& A_START
) start_mysql();
3039 #ifdef TCONFIG_PPTPD
3040 if (strcmp(service
, "pptpd") == 0) {
3041 if (action
& A_STOP
) stop_pptpd();
3042 if (action
& A_START
) start_pptpd();
3047 #ifdef TCONFIG_PPTPD
3048 if (strcmp(service
, "pptpclient") == 0) {
3049 if (action
& A_STOP
) stop_pptp_client();
3050 if (action
& A_START
) start_pptp_client();
3051 if (action
& (A_START
| A_STOP
))
3056 if ((action
& A_START
) == 0)
3066 // some functions check action_service and must be cleared at end -- zzz
3067 nvram_set("action_service", "");
3069 // Force recheck in 500 msec
3070 setitimer(ITIMER_REAL
, &pop_tv
, NULL
);
3073 static void do_service(const char *name
, const char *action
, int user
)
3079 while (!nvram_match("action_service", "")) {
3084 else if (--n
< 0) break;
3088 snprintf(s
, sizeof(s
), "%s-%s%s", name
, action
, (user
? "-c" : ""));
3089 nvram_set("action_service", s
);
3091 if (nvram_match("debug_rc_svc", "1")) {
3092 nvram_unset("debug_rc_svc");
3099 while (nvram_match("action_service", s
)) {
3111 int service_main(int argc
, char *argv
[])
3113 if (argc
!= 3) usage_exit(argv
[0], "<service> <action>");
3114 do_service(argv
[1], argv
[2], 1);
3115 printf("\nDone.\n");
3119 void start_service(const char *name
)
3121 do_service(name
, "start", 0);
3124 void stop_service(const char *name
)
3126 do_service(name
, "stop", 0);
3130 void restart_service(const char *name)
3132 do_service(name, "restart", 0);