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 for (n
= 0 ; n
< dns
->count
; ++n
) {
151 if (dns
->dns
[n
].port
!= 53) {
152 fprintf(f
, "server=%s#%u\n", inet_ntoa(dns
->dns
[n
].addr
), dns
->dns
[n
].port
);
156 if (nvram_get_int("dhcpd_static_only")) {
157 fprintf(f
, "dhcp-ignore=tag:!known\n");
160 if ((n
= nvram_get_int("dnsmasq_q"))) { //process quiet flags
161 if (n
& 1) fprintf(f
, "quiet-dhcp\n");
162 if (n
& 2) fprintf(f
, "quiet-dhcp6\n");
163 if (n
& 4) fprintf(f
, "quiet-ra\n");
168 char lanN_proto
[] = "lanXX_proto";
169 char lanN_ifname
[] = "lanXX_ifname";
170 char lanN_ipaddr
[] = "lanXX_ipaddr";
171 char lanN_netmask
[] = "lanXX_netmask";
172 char dhcpdN_startip
[] = "dhcpdXX_startip";
173 char dhcpdN_endip
[] = "dhcpdXX_endip";
174 char dhcpN_start
[] = "dhcpXX_start";
175 char dhcpN_num
[] = "dhcpXX_num";
176 char dhcpN_lease
[] = "dhcpXX_lease";
178 for(br
=0 ; br
<=3 ; br
++) {
179 char bridge
[2] = "0";
185 sprintf(lanN_proto
, "lan%s_proto", bridge
);
186 sprintf(lanN_ifname
, "lan%s_ifname", bridge
);
187 sprintf(lanN_ipaddr
, "lan%s_ipaddr", bridge
);
188 do_dhcpd
= nvram_match(lanN_proto
, "dhcp");
192 router_ip
= nvram_safe_get(lanN_ipaddr
);
193 strlcpy(lan
, router_ip
, sizeof(lan
));
194 if ((p
= strrchr(lan
, '.')) != NULL
) *(p
+ 1) = 0;
198 nvram_safe_get(lanN_ifname
));
200 sprintf(dhcpN_lease
, "dhcp%s_lease", bridge
);
201 dhcp_lease
= nvram_get_int(dhcpN_lease
);
203 if (dhcp_lease
<= 0) dhcp_lease
= 1440;
205 if ((e
= nvram_get("dhcpd_slt")) != NULL
) n
= atoi(e
); else n
= 0;
206 if (n
< 0) strcpy(sdhcp_lease
, "infinite");
207 else sprintf(sdhcp_lease
, "%dm", (n
> 0) ? n
: dhcp_lease
);
210 // if not using dnsmasq for dns
212 if ((dns
->count
== 0) && (nvram_get_int("dhcpd_llndns"))) {
213 // no DNS might be temporary. use a low lease time to force clients to update.
215 strcpy(sdhcp_lease
, "2m");
219 // pass the dns directly
221 for (n
= 0 ; n
< dns
->count
; ++n
) {
222 if (dns
->dns
[n
].port
== 53) { // check: option 6 doesn't seem to support other ports
223 sprintf(buf
+ strlen(buf
), ",%s", inet_ntoa(dns
->dns
[n
].addr
));
226 fprintf(f
, "dhcp-option=tag:%s,6%s\n", nvram_safe_get(lanN_ifname
), buf
);
230 sprintf(dhcpdN_startip
, "dhcpd%s_startip", bridge
);
231 sprintf(dhcpdN_endip
, "dhcpd%s_endip", bridge
);
232 sprintf(lanN_netmask
, "lan%s_netmask", bridge
);
234 if ((p
= nvram_get(dhcpdN_startip
)) && (*p
) && (e
= nvram_get(dhcpdN_endip
)) && (*e
)) {
235 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
);
239 sprintf(dhcpN_start
, "dhcp%s_start", bridge
);
240 sprintf(dhcpN_num
, "dhcp%s_num", bridge
);
241 sprintf(lanN_netmask
, "lan%s_netmask", bridge
);
242 dhcp_start
= nvram_get_int(dhcpN_start
);
243 dhcp_count
= nvram_get_int(dhcpN_num
);
244 fprintf(f
, "dhcp-range=tag:%s,%s%d,%s%d,%s,%dm\n",
245 nvram_safe_get(lanN_ifname
), lan
, dhcp_start
, lan
, dhcp_start
+ dhcp_count
- 1, nvram_safe_get(lanN_netmask
), dhcp_lease
);
248 nv
= nvram_safe_get(lanN_ipaddr
);
249 if ((nvram_get_int("dhcpd_gwmode") == 1) && (get_wan_proto() == WP_DISABLED
)) {
250 p
= nvram_safe_get("lan_gateway");
251 if ((*p
) && (strcmp(p
, "0.0.0.0") != 0)) nv
= p
;
255 "dhcp-option=tag:%s,3,%s\n", // gateway
256 nvram_safe_get(lanN_ifname
), nv
);
258 if (((nv
= nvram_get("wan_wins")) != NULL
) && (*nv
) && (strcmp(nv
, "0.0.0.0") != 0)) {
259 fprintf(f
, "dhcp-option=tag:%s,44,%s\n", nvram_safe_get(lanN_ifname
), nv
);
261 #ifdef TCONFIG_SAMBASRV
262 else if (nvram_get_int("smbd_enable") && nvram_invmatch("lan_hostname", "") && nvram_get_int("smbd_wins")) {
263 if ((nv
== NULL
) || (*nv
== 0) || (strcmp(nv
, "0.0.0.0") == 0)) {
264 // Samba will serve as a WINS server
265 fprintf(f
, "dhcp-option=tag:%s,44,%s\n", nvram_safe_get(lanN_ifname
), nvram_safe_get(lanN_ipaddr
));
270 if (strcmp(nvram_safe_get(lanN_ifname
),"")!=0) {
271 fprintf(f
, "interface=%s\n", nvram_safe_get(lanN_ifname
));
272 // if no dhcp range is set then no dhcp service will be offered so following
273 // line is superflous.
274 // fprintf(f, "no-dhcp-interface=%s\n", nvram_safe_get(lanN_ifname));
278 // write static lease entries & create hosts file
280 mkdir_if_none(dmhosts
);
281 snprintf(buf
, sizeof(buf
), "%s/hosts", dmhosts
);
282 if ((hf
= fopen(buf
, "w")) != NULL
) {
283 if (((nv
= nvram_get("wan_hostname")) != NULL
) && (*nv
))
284 fprintf(hf
, "%s %s\n", router_ip
, nv
);
285 #ifdef TCONFIG_SAMBASRV
286 else if (((nv
= nvram_get("lan_hostname")) != NULL
) && (*nv
))
287 fprintf(hf
, "%s %s\n", router_ip
, nv
);
289 p
= (char *)get_wanip();
290 if ((*p
== 0) || strcmp(p
, "0.0.0.0") == 0)
292 fprintf(hf
, "%s wan-ip\n", p
);
294 fprintf(hf
, "%s %s-wan\n", p
, nv
);
298 mkdir_if_none(dmdhcp
);
299 snprintf(buf
, sizeof(buf
), "%s/dhcp-hosts", dmdhcp
);
300 df
= fopen(buf
, "w");
302 // PREVIOUS/OLD FORMAT:
303 // 00:aa:bb:cc:dd:ee<123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 73 w/ delim
304 // 00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 85 w/ delim
305 // 00:aa:bb:cc:dd:ee,00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz> = 103 w/ delim
307 // NEW FORMAT (+static ARP binding flag after hostname):
308 // 00:aa:bb:cc:dd:ee<123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz<a> = 75 w/ delim
309 // 00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz<a> = 87 w/ delim
310 // 00:aa:bb:cc:dd:ee,00:aa:bb:cc:dd:ee<123.123.123.123<xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xyz<a> = 105 w/ delim
312 p
= nvram_safe_get("dhcpd_static");
313 while ((e
= strchr(p
, '>')) != NULL
) {
324 if ((e
= strchr(buf
, '<')) == NULL
) continue;
329 if ((e
= strchr(ip
, '<')) == NULL
) continue;
331 if (strchr(ip
, '.') == NULL
) {
333 if ((ipn
<= 0) || (ipn
> 255)) continue;
334 sprintf(ipbuf
, "%s%d", lan
, ipn
);
338 if (inet_addr(ip
) == INADDR_NONE
) continue;
343 if ((e
= strchr(name
, '<')) != NULL
) {
347 if ((hf
) && (*name
!= 0)) {
348 fprintf(hf
, "%s %s\n", ip
, name
);
351 if ((do_dhcpd_hosts
> 0) && (*mac
!= 0) && (strcmp(mac
, "00:00:00:00:00:00") != 0)) {
352 char static_dhcp_lease
[32];
353 strcpy(static_dhcp_lease
, "");
354 if (nvram_get_int("dhcpd_slt") != 0)
355 sprintf(static_dhcp_lease
, ",%s", sdhcp_lease
);
357 fprintf(df
, "%s,%s%s\n", mac
, ip
, static_dhcp_lease
);
359 fprintf(f
, "dhcp-host=%s,%s%s\n", mac
, ip
, static_dhcp_lease
);
366 n
= nvram_get_int("dhcpd_lmax");
368 "dhcp-lease-max=%d\n",
370 if (nvram_get_int("dhcpd_auth") >= 0) {
371 fprintf(f
, "dhcp-authoritative\n");
376 #ifdef TCONFIG_OPENVPN
377 write_vpn_dnsmasq_config(f
);
381 write_pptpd_dnsmasq_config(f
);
385 if (ipv6_enabled()) {
387 service = get_ipv6_service();
388 do_6to4 = (service == IPV6_ANYCAST_6TO4);
389 do_6rd = (service == IPV6_6RD || service == IPV6_6RD_DHCP);
392 case IPV6_NATIVE_DHCP:
393 case IPV6_ANYCAST_6TO4:
397 mtu = (nvram_get_int("ipv6_tun_mtu") > 0) ? nvram_safe_get("ipv6_tun_mtu") : "1480";
400 prefix = do_6to4 ? "0:0:0:1::" : nvram_safe_get("ipv6_prefix");
403 if (!(*prefix)) prefix = "::";
404 ipv6 = (char *)ipv6_router_address(NULL);
405 fprintf(f, "enable-ra\ndhcp-range=tag:br0,%s, slaac, ra-names, 64\n", prefix);
407 // enable-ra should be enabled in both cases
408 if (nvram_get_int("ipv6_radvd") || nvram_get_int("ipv6_dhcpd"))
409 fprintf(f
,"enable-ra\n");
411 // Only SLAAC and NO DHCPv6
412 if (nvram_get_int("ipv6_radvd") && !nvram_get_int("ipv6_dhcpd"))
413 fprintf(f
,"dhcp-range=::, constructor:br*, ra-names, ra-stateless, 64, 12h\n");
415 // Only DHCPv6 and NO SLAAC
416 if (nvram_get_int("ipv6_dhcpd") && !nvram_get_int("ipv6_radvd"))
417 fprintf(f
,"dhcp-range=::1, ::FFFF:FFFF, constructor:br*, 64, 12h\n");
419 // SLAAC and DHCPv6 (2 IPv6 IPs)
420 if (nvram_get_int("ipv6_radvd") && nvram_get_int("ipv6_dhcpd"))
421 fprintf(f
,"dhcp-range=::1, ::FFFF:FFFF, constructor:br*, ra-names, 64, 12h\n");
425 fprintf(f
, "%s\n\n", nvram_safe_get("dnsmasq_custom"));
427 fappend(f
, "/etc/dnsmasq.custom");
434 unlink("/etc/resolv.conf");
435 symlink("/rom/etc/resolv.conf", "/etc/resolv.conf"); // nameserver 127.0.0.1
438 TRACE_PT("run dnsmasq\n");
440 // Default to some values we like, but allow the user to override them.
441 eval("dnsmasq", "-c", "1500", "--log-async");
443 if (!nvram_contains_word("debug_norestart", "dnsmasq")) {
450 void stop_dnsmasq(void)
455 stop_service("dnsmasq");
461 unlink("/etc/resolv.conf");
462 symlink(dmresolv
, "/etc/resolv.conf");
464 killall_tk("dnsmasq");
469 void clear_resolv(void)
471 f_write(dmresolv
, NULL
, 0, 0, 0); // blank
475 static int write_ipv6_dns_servers(FILE *f
, const char *prefix
, char *dns
, const char *suffix
, int once
)
477 char p
[INET6_ADDRSTRLEN
+ 1], *next
= NULL
;
478 struct in6_addr addr
;
481 foreach(p
, dns
, next
) {
482 // verify that this is a valid IPv6 address
483 if (inet_pton(AF_INET6
, p
, &addr
) == 1) {
484 fprintf(f
, "%s%s%s", (once
&& cnt
) ? "" : prefix
, p
, suffix
);
493 void dns_to_resolv(void)
496 const dns_list_t
*dns
;
500 m
= umask(022); // 077 from pppoecd
501 if ((f
= fopen(dmresolv
, "w")) != NULL
) {
502 // Check for VPN DNS entries
503 if (!write_pptpvpn_resolv(f
) && !write_vpn_resolv(f
)) {
505 if (write_ipv6_dns_servers(f
, "nameserver ", nvram_safe_get("ipv6_dns"), "\n", 0) == 0 || nvram_get_int("dns_addget"))
506 write_ipv6_dns_servers(f
, "nameserver ", nvram_safe_get("ipv6_get_dns"), "\n", 0);
508 dns
= get_dns(); // static buffer
509 if (dns
->count
== 0) {
510 // Put a pseudo DNS IP to trigger Connect On Demand
511 if (nvram_match("ppp_demand", "1")) {
512 switch (get_wan_proto()) {
517 fprintf(f
, "nameserver 1.1.1.1\n");
523 for (i
= 0; i
< dns
->count
; i
++) {
524 if (dns
->dns
[i
].port
== 53) { // resolv.conf doesn't allow for an alternate port
525 fprintf(f
, "nameserver %s\n", inet_ntoa(dns
->dns
[i
].addr
));
535 // -----------------------------------------------------------------------------
537 void start_httpd(void)
540 start_service("httpd");
550 void stop_httpd(void)
553 stop_service("httpd");
560 // -----------------------------------------------------------------------------
563 static void add_ip6_lanaddr(void)
565 char ip
[INET6_ADDRSTRLEN
+ 4];
568 p
= ipv6_router_address(NULL
);
570 snprintf(ip
, sizeof(ip
), "%s/%d", p
, nvram_get_int("ipv6_prefix_length") ? : 64);
571 eval("ip", "-6", "addr", "add", ip
, "dev", nvram_safe_get("lan_ifname"));
575 void start_ipv6_tunnel(void)
577 char ip
[INET6_ADDRSTRLEN
+ 4];
578 struct in_addr addr4
;
579 struct in6_addr addr
;
580 const char *wanip
, *mtu
, *tun_dev
;
583 service
= get_ipv6_service();
584 tun_dev
= get_wan6face();
586 mtu
= (nvram_get_int("ipv6_tun_mtu") > 0) ? nvram_safe_get("ipv6_tun_mtu") : "1480";
589 if (service
== IPV6_ANYCAST_6TO4
)
590 snprintf(ip
, sizeof(ip
), "192.88.99.%d", nvram_get_int("ipv6_relay"));
592 strlcpy(ip
, (char *)nvram_safe_get("ipv6_tun_v4end"), sizeof(ip
));
593 eval("ip", "tunnel", "add", (char *)tun_dev
, "mode", "sit",
595 "local", (char *)wanip
,
596 "ttl", nvram_safe_get("ipv6_tun_ttl"));
598 eval("ip", "link", "set", (char *)tun_dev
, "mtu", (char *)mtu
, "up");
599 nvram_set("ipv6_ifname", (char *)tun_dev
);
601 if (service
== IPV6_ANYCAST_6TO4
) {
604 memset(&addr
, 0, sizeof(addr
));
605 inet_aton(wanip
, &addr4
);
606 addr
.s6_addr16
[0] = htons(0x2002);
607 ipv6_mapaddr4(&addr
, 16, &addr4
, 0);
608 addr
.s6_addr16
[7] = htons(0x0001);
609 inet_ntop(AF_INET6
, &addr
, ip
, sizeof(ip
));
610 strncat(ip
, "/16", sizeof(ip
));
613 snprintf(ip
, sizeof(ip
), "%s/%d",
614 nvram_safe_get("ipv6_tun_addr"),
615 nvram_get_int("ipv6_tun_addrlen") ? : 64);
617 eval("ip", "addr", "add", ip
, "dev", (char *)tun_dev
);
618 eval("ip", "route", "add", "::/0", "dev", (char *)tun_dev
);
620 // (re)start radvd - now dnsmasq provided
621 if (service
== IPV6_ANYCAST_6TO4
)
625 void stop_ipv6_tunnel(void)
627 eval("ip", "tunnel", "del", (char *)get_wan6face());
628 if (get_ipv6_service() == IPV6_ANYCAST_6TO4
) {
629 // get rid of old IPv6 address from lan iface
630 eval("ip", "-6", "addr", "flush", "dev", nvram_safe_get("lan_ifname"), "scope", "global");
635 void start_6rd_tunnel(void)
637 const char *tun_dev
, *wanip
;
638 int service
, mask_len
, prefix_len
, local_prefix_len
;
639 char mtu
[10], prefix
[INET6_ADDRSTRLEN
], relay
[INET_ADDRSTRLEN
];
640 struct in_addr netmask_addr
, relay_addr
, relay_prefix_addr
, wanip_addr
;
641 struct in6_addr prefix_addr
, local_prefix_addr
;
642 char local_prefix
[INET6_ADDRSTRLEN
];
643 char tmp_ipv6
[INET6_ADDRSTRLEN
+ 4], tmp_ipv4
[INET_ADDRSTRLEN
+ 4];
647 service
= get_ipv6_service();
649 tun_dev
= get_wan6face();
650 sprintf(mtu
, "%d", (nvram_get_int("wan_mtu") > 0) ? (nvram_get_int("wan_mtu") - 20) : 1280);
652 // maybe we can merge the ipv6_6rd_* variables into a single ipv_6rd_string (ala wan_6rd)
653 // to save nvram space?
654 if (service
== IPV6_6RD
) {
655 _dprintf("starting 6rd tunnel using manual settings.\n");
656 mask_len
= nvram_get_int("ipv6_6rd_ipv4masklen");
657 prefix_len
= nvram_get_int("ipv6_6rd_prefix_length");
658 strcpy(prefix
, nvram_safe_get("ipv6_6rd_prefix"));
659 strcpy(relay
, nvram_safe_get("ipv6_6rd_borderrelay"));
662 _dprintf("starting 6rd tunnel using automatic settings.\n");
663 char *wan_6rd
= nvram_safe_get("wan_6rd");
664 if (sscanf(wan_6rd
, "%d %d %s %s", &mask_len
, &prefix_len
, prefix
, relay
) < 4) {
665 _dprintf("wan_6rd string is missing or invalid (%s)\n", wan_6rd
);
670 // validate values that were passed
671 if (mask_len
< 0 || mask_len
> 32) {
672 _dprintf("invalid mask_len value (%d)\n", mask_len
);
675 if (prefix_len
< 0 || prefix_len
> 128) {
676 _dprintf("invalid prefix_len value (%d)\n", prefix_len
);
679 if ((32 - mask_len
) + prefix_len
> 128) {
680 _dprintf("invalid combination of mask_len and prefix_len!\n");
684 sprintf(tmp
, "ping -q -c 2 %s | grep packet", relay
);
685 if ((f
= popen(tmp
, "r")) == NULL
) {
686 _dprintf("error obtaining data\n");
689 fgets(tmp
, sizeof(tmp
), f
);
691 if (strstr(tmp
, " 0% packet loss") == NULL
) {
692 _dprintf("failed to ping border relay\n");
696 // get relay prefix from border relay address and mask
697 netmask_addr
.s_addr
= htonl(0xffffffff << (32 - mask_len
));
698 inet_aton(relay
, &relay_addr
);
699 relay_prefix_addr
.s_addr
= relay_addr
.s_addr
& netmask_addr
.s_addr
;
701 // calculate the local prefix
702 inet_pton(AF_INET6
, prefix
, &prefix_addr
);
703 inet_pton(AF_INET
, wanip
, &wanip_addr
);
704 if (calc_6rd_local_prefix(&prefix_addr
, prefix_len
, mask_len
,
705 &wanip_addr
, &local_prefix_addr
, &local_prefix_len
) == 0) {
706 _dprintf("error calculating local prefix.");
709 inet_ntop(AF_INET6
, &local_prefix_addr
, local_prefix
, sizeof(local_prefix
));
711 snprintf(tmp_ipv6
, sizeof(tmp_ipv6
), "%s1", local_prefix
);
712 nvram_set("ipv6_rtr_addr", tmp_ipv6
);
713 nvram_set("ipv6_prefix", local_prefix
);
715 // load sit module needed for the 6rd tunnel
718 // creating the 6rd tunnel
719 eval("ip", "tunnel", "add", (char *)tun_dev
, "mode", "sit", "local", (char *)wanip
, "ttl", nvram_safe_get("ipv6_tun_ttl"));
721 snprintf(tmp_ipv6
, sizeof(tmp_ipv6
), "%s/%d", prefix
, prefix_len
);
722 snprintf(tmp_ipv4
, sizeof(tmp_ipv4
), "%s/%d", inet_ntoa(relay_prefix_addr
), mask_len
);
723 eval("ip", "tunnel" "6rd", "dev", (char *)tun_dev
, "6rd-prefix", tmp_ipv6
, "6rd-relay_prefix", tmp_ipv4
);
725 // bringing up the link
726 eval("ip", "link", "set", "dev", (char *)tun_dev
, "mtu", (char *)mtu
, "up");
728 // setting the WAN address Note: IPv6 WAN CIDR should be: ((32 - ip6rd_ipv4masklen) + ip6rd_prefixlen)
729 snprintf(tmp_ipv6
, sizeof(tmp_ipv6
), "%s1/%d", local_prefix
, local_prefix_len
);
730 eval("ip", "-6", "addr", "add", tmp_ipv6
, "dev", (char *)tun_dev
);
732 // setting the LAN address Note: IPv6 LAN CIDR should be 64
733 snprintf(tmp_ipv6
, sizeof(tmp_ipv6
), "%s1/%d", local_prefix
, nvram_get_int("ipv6_prefix_length") ? : 64);
734 eval("ip", "-6", "addr", "add", tmp_ipv6
, "dev", nvram_safe_get("lan_ifname"));
736 // adding default route via the border relay
737 snprintf(tmp_ipv6
, sizeof(tmp_ipv6
), "::%s", relay
);
738 eval("ip", "-6", "route", "add", "default", "via", tmp_ipv6
, "dev", (char *)tun_dev
);
740 nvram_set("ipv6_ifname", (char *)tun_dev
);
748 void stop_6rd_tunnel(void)
750 eval("ip", "tunnel", "del", (char *)get_wan6face());
751 eval("ip", "-6", "addr", "flush", "dev", nvram_safe_get("lan_ifname"), "scope", "global");
755 static pid_t pid_radvd
= -1;
757 void start_radvd(void)
760 char *prefix
, *ip
, *mtu
;
761 int do_dns
, do_6to4
, do_6rd
;
762 char *argv
[] = { "radvd", NULL
, NULL
, NULL
};
763 int pid
, argc
, service
, cnt
;
766 start_service("radvd");
772 if (ipv6_enabled() && nvram_get_int("ipv6_radvd")) {
773 service
= get_ipv6_service();
774 do_6to4
= (service
== IPV6_ANYCAST_6TO4
);
775 do_6rd
= (service
== IPV6_6RD
|| service
== IPV6_6RD_DHCP
);
779 case IPV6_NATIVE_DHCP
:
782 case IPV6_ANYCAST_6TO4
:
786 mtu
= (nvram_get_int("ipv6_tun_mtu") > 0) ? nvram_safe_get("ipv6_tun_mtu") : "1480";
789 prefix
= do_6to4
? "0:0:0:1::" : nvram_safe_get("ipv6_prefix");
792 if (!(*prefix
)) prefix
= "::";
795 if ((f
= fopen("/etc/radvd.conf", "w")) == NULL
) return;
797 ip
= (char *)ipv6_router_address(NULL
);
798 do_dns
= (*ip
) && nvram_match("dhcpd_dmdns", "1");
803 " IgnoreIfMissing on;\n"
804 " AdvSendAdvert on;\n"
805 " MaxRtrAdvInterval 60;\n"
806 " AdvHomeAgentFlag off;\n"
807 " AdvManagedFlag off;\n"
812 " AdvAutonomous on;\n"
816 nvram_safe_get("lan_ifname"),
817 mtu
? " AdvLinkMTU " : "", mtu
? : "", mtu
? ";\n" : "",
819 (do_6to4
|| do_6rd
) ? " AdvValidLifetime 300;\n AdvPreferredLifetime 120;\n" : "",
820 do_6to4
? " Base6to4Interface " : "",
821 do_6to4
? get_wanface() : "",
822 do_6to4
? ";\n" : "");
825 fprintf(f
, " RDNSS %s {};\n", ip
);
828 cnt
= write_ipv6_dns_servers(f
, " RDNSS ", nvram_safe_get("ipv6_dns"), " ", 1);
829 if (cnt
== 0 || nvram_get_int("dns_addget"))
830 cnt
+= write_ipv6_dns_servers(f
, (cnt
) ? "" : " RDNSS ", nvram_safe_get("ipv6_get_dns"), " ", 1);
831 if (cnt
) fprintf(f
, "{};\n");
835 "};\n"); // close "interface" section
840 if (nvram_get_int("debug_ipv6")) {
845 _eval(argv
, NULL
, 0, &pid
);
847 if (!nvram_contains_word("debug_norestart", "radvd")) {
853 void stop_radvd(void)
856 stop_service("radvd");
864 void start_ipv6(void)
868 service
= get_ipv6_service();
869 enable_ip6_forward();
871 // Check if turned on
878 case IPV6_NATIVE_DHCP
:
879 case IPV6_ANYCAST_6TO4
:
880 nvram_set("ipv6_rtr_addr", "");
881 nvram_set("ipv6_prefix", "");
885 if (service
!= IPV6_DISABLED
) {
886 if ((nvram_get_int("ipv6_accept_ra") & 2) != 0 && !nvram_get_int("ipv6_radvd"))
887 accept_ra(nvram_safe_get("lan_ifname"));
895 eval("ip", "-6", "addr", "flush", "scope", "global");
900 // -----------------------------------------------------------------------------
902 void start_upnp(void)
905 start_service("upnp");
909 if (get_wan_proto() == WP_DISABLED
) return;
915 if (((enable
= nvram_get_int("upnp_enable")) & 3) != 0) {
916 mkdir("/etc/upnp", 0777);
917 if (f_exists("/etc/upnp/config.alt")) {
918 xstart("miniupnpd", "-f", "/etc/upnp/config.alt");
921 if ((f
= fopen("/etc/upnp/config", "w")) != NULL
) {
922 upnp_port
= nvram_get_int("upnp_port");
923 if ((upnp_port
< 0) || (upnp_port
>= 0xFFFF)) upnp_port
= 0;
932 "upnp_forward_chain=upnp\n"
933 "upnp_nat_chain=upnp\n"
934 "notify_interval=%d\n"
935 "system_uptime=yes\n"
940 (enable
& 1) ? "yes" : "no", // upnp enable
941 (enable
& 2) ? "yes" : "no", // natpmp enable
942 nvram_get_int("upnp_secure") ? "yes" : "no", // secure_mode (only forward to self)
943 nvram_get_int("upnp_ssdp_interval")
946 if (nvram_get_int("upnp_clean")) {
947 int interval
= nvram_get_int("upnp_clean_interval");
948 if (interval
< 60) interval
= 60;
950 "clean_ruleset_interval=%d\n"
951 "clean_ruleset_threshold=%d\n",
953 nvram_get_int("upnp_clean_threshold")
957 fprintf(f
,"clean_ruleset_interval=0\n");
959 if (nvram_match("upnp_mnp", "1")) {
960 int https
= nvram_get_int("https_enable");
961 fprintf(f
, "presentation_url=http%s://%s:%s/forward-upnp.asp\n",
962 https
? "s" : "", nvram_safe_get("lan_ipaddr"),
963 nvram_safe_get(https
? "https_lanport" : "http_lanport"));
966 // Empty parameters are not included into XML service description
967 fprintf(f
, "presentation_url=\n");
971 f_read_string("/proc/sys/kernel/random/uuid", uuid
, sizeof(uuid
));
972 fprintf(f
, "uuid=%s\n", uuid
);
975 char lanN_ipaddr
[] = "lanXX_ipaddr";
976 char lanN_netmask
[] = "lanXX_netmask";
977 char upnp_lanN
[] = "upnp_lanXX";
980 for(br
=0 ; br
<4 ; br
++) {
981 char bridge
[2] = "0";
987 sprintf(lanN_ipaddr
, "lan%s_ipaddr", bridge
);
988 sprintf(lanN_netmask
, "lan%s_netmask", bridge
);
989 sprintf(upnp_lanN
, "upnp_lan%s", bridge
);
991 char *lanip
= nvram_safe_get(lanN_ipaddr
);
992 char *lanmask
= nvram_safe_get(lanN_netmask
);
993 char *lanlisten
= nvram_safe_get(upnp_lanN
);
995 if((strcmp(lanlisten
,"1")==0) && (strcmp(lanip
,"")!=0) && (strcmp(lanip
,"0.0.0.0")!=0)) {
997 char *lanip
= nvram_safe_get("lan_ipaddr");
998 char *lanmask
= nvram_safe_get("lan_netmask");
1001 "listening_ip=%s/%s\n",
1004 if ((ports
[0] = nvram_get_int("upnp_min_port_int")) > 0 &&
1005 (ports
[1] = nvram_get_int("upnp_max_port_int")) > 0 &&
1006 (ports
[2] = nvram_get_int("upnp_min_port_ext")) > 0 &&
1007 (ports
[3] = nvram_get_int("upnp_max_port_ext")) > 0) {
1009 "allow %d-%d %s/%s %d-%d\n",
1016 // by default allow only redirection of ports above 1024
1017 fprintf(f
, "allow 1024-65535 %s/%s 1024-65535\n", lanip
, lanmask
);
1024 fappend(f
, "/jffs/upnpconfig.custom");
1025 fappend(f
, "/etc/upnp/config.custom");
1026 fprintf(f
, "%s\n", nvram_safe_get("upnp_custom"));
1027 fprintf(f
, "\ndeny 0-65535 0.0.0.0/0 0-65535\n");
1031 xstart("miniupnpd", "-f", "/etc/upnp/config");
1037 void stop_upnp(void)
1039 if (getpid() != 1) {
1040 stop_service("upnp");
1044 killall_tk("miniupnpd");
1047 // -----------------------------------------------------------------------------
1049 static pid_t pid_crond
= -1;
1051 void start_cron(void)
1055 eval("crond", nvram_contains_word("log_events", "crond") ? NULL
: "-l", "9");
1056 if (!nvram_contains_word("debug_norestart", "crond")) {
1061 void stop_cron(void)
1064 killall_tk("crond");
1067 // -----------------------------------------------------------------------------
1070 static pid_t pid_hotplug2
= -1;
1072 void start_hotplug2()
1076 f_write_string("/proc/sys/kernel/hotplug", "", FW_NEWLINE
, 0);
1077 xstart("hotplug2", "--persistent", "--no-coldplug");
1078 // FIXME: Don't remember exactly why I put "sleep" here -
1079 // but it was not for a race with check_services()... - TB
1082 if (!nvram_contains_word("debug_norestart", "hotplug2")) {
1087 void stop_hotplug2(void)
1090 killall_tk("hotplug2");
1093 #endif /* LINUX26 */
1094 // -----------------------------------------------------------------------------
1096 // Written by Sparq in 2002/07/16
1097 void start_zebra(void)
1099 #ifdef TCONFIG_ZEBRA
1100 if (getpid() != 1) {
1101 start_service("zebra");
1107 char *lan_tx
= nvram_safe_get("dr_lan_tx");
1108 char *lan_rx
= nvram_safe_get("dr_lan_rx");
1110 char *lan1_tx
= nvram_safe_get("dr_lan1_tx");
1111 char *lan1_rx
= nvram_safe_get("dr_lan1_rx");
1112 char *lan2_tx
= nvram_safe_get("dr_lan2_tx");
1113 char *lan2_rx
= nvram_safe_get("dr_lan2_rx");
1114 char *lan3_tx
= nvram_safe_get("dr_lan3_tx");
1115 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");
1121 if ((*lan_tx
== '0') && (*lan_rx
== '0') &&
1122 (*lan1_tx
== '0') && (*lan1_rx
== '0') &&
1123 (*lan2_tx
== '0') && (*lan2_rx
== '0') &&
1124 (*lan3_tx
== '0') && (*lan3_rx
== '0') &&
1125 (*wan_tx
== '0') && (*wan_rx
== '0')) {
1127 if ((*lan_tx
== '0') && (*lan_rx
== '0') && (*wan_tx
== '0') && (*wan_rx
== '0')) {
1133 if ((fp
= fopen("/etc/zebra.conf", "w")) != NULL
) {
1138 if ((fp
= fopen("/etc/ripd.conf", "w")) != NULL
) {
1139 char *lan_ifname
= nvram_safe_get("lan_ifname");
1141 char *lan1_ifname
= nvram_safe_get("lan1_ifname");
1142 char *lan2_ifname
= nvram_safe_get("lan2_ifname");
1143 char *lan3_ifname
= nvram_safe_get("lan3_ifname");
1145 char *wan_ifname
= nvram_safe_get("wan_ifname");
1147 fprintf(fp
, "router rip\n");
1148 if(strcmp(lan_ifname
,"")!=0)
1149 fprintf(fp
, "network %s\n", lan_ifname
);
1151 if(strcmp(lan1_ifname
,"")!=0)
1152 fprintf(fp
, "network %s\n", lan1_ifname
);
1153 if(strcmp(lan2_ifname
,"")!=0)
1154 fprintf(fp
, "network %s\n", lan2_ifname
);
1155 if(strcmp(lan3_ifname
,"")!=0)
1156 fprintf(fp
, "network %s\n", lan3_ifname
);
1158 fprintf(fp
, "network %s\n", wan_ifname
);
1159 fprintf(fp
, "redistribute connected\n");
1160 //fprintf(fp, "redistribute static\n");
1162 // 43011: modify by zg 2006.10.18 for cdrouter3.3 item 173(cdrouter_rip_30) bug
1163 // fprintf(fp, "redistribute kernel\n"); // 1.11: removed, redistributes indirect -- zzz
1165 if(strcmp(lan_ifname
,"")!=0) {
1166 fprintf(fp
, "interface %s\n", lan_ifname
);
1167 if (*lan_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", lan_tx
);
1168 if (*lan_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", lan_rx
);
1171 if(strcmp(lan1_ifname
,"")!=0) {
1172 fprintf(fp
, "interface %s\n", lan1_ifname
);
1173 if (*lan1_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", lan1_tx
);
1174 if (*lan1_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", lan1_rx
);
1176 if(strcmp(lan2_ifname
,"")!=0) {
1177 fprintf(fp
, "interface %s\n", lan2_ifname
);
1178 if (*lan2_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", lan2_tx
);
1179 if (*lan2_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", lan2_rx
);
1181 if(strcmp(lan3_ifname
,"")!=0) {
1182 fprintf(fp
, "interface %s\n", lan3_ifname
);
1183 if (*lan3_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", lan3_tx
);
1184 if (*lan3_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", lan3_rx
);
1187 fprintf(fp
, "interface %s\n", wan_ifname
);
1188 if (*wan_tx
!= '0') fprintf(fp
, "ip rip send version %s\n", wan_tx
);
1189 if (*wan_rx
!= '0') fprintf(fp
, "ip rip receive version %s\n", wan_rx
);
1191 fprintf(fp
, "router rip\n");
1192 if(strcmp(lan_ifname
,"")!=0) {
1193 if (*lan_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", lan_ifname
);
1194 if (*lan_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", lan_ifname
);
1197 if(strcmp(lan1_ifname
,"")!=0) {
1198 if (*lan1_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", lan1_ifname
);
1199 if (*lan1_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", lan1_ifname
);
1201 if(strcmp(lan2_ifname
,"")!=0) {
1202 if (*lan2_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", lan2_ifname
);
1203 if (*lan2_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", lan2_ifname
);
1205 if(strcmp(lan3_ifname
,"")!=0) {
1206 if (*lan3_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", lan3_ifname
);
1207 if (*lan3_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", lan3_ifname
);
1210 if (*wan_tx
== '0') fprintf(fp
, "distribute-list private out %s\n", wan_ifname
);
1211 if (*wan_rx
== '0') fprintf(fp
, "distribute-list private in %s\n", wan_ifname
);
1212 fprintf(fp
, "access-list private deny any\n");
1214 //fprintf(fp, "debug rip events\n");
1215 //fprintf(fp, "log file /etc/ripd.log\n");
1219 xstart("zebra", "-d");
1220 xstart("ripd", "-d");
1224 void stop_zebra(void)
1226 #ifdef TCONFIG_ZEBRA
1227 if (getpid() != 1) {
1228 stop_service("zebra");
1232 killall("zebra", SIGTERM
);
1233 killall("ripd", SIGTERM
);
1235 unlink("/etc/zebra.conf");
1236 unlink("/etc/ripd.conf");
1240 // -----------------------------------------------------------------------------
1242 void start_syslog(void)
1252 char *rot_siz
= "50";
1253 char *rot_keep
= "1";
1254 char *log_file_path
;
1256 argv
[0] = "syslogd";
1259 if (nvram_match("log_remote", "1")) {
1260 nv
= nvram_safe_get("log_remoteip");
1262 snprintf(rem
, sizeof(rem
), "%s:%s", nv
, nvram_safe_get("log_remoteport"));
1263 argv
[argc
++] = "-R";
1268 if (nvram_match("log_file", "1")) {
1269 argv
[argc
++] = "-L";
1271 if (strcmp(nvram_safe_get("log_file_size"), "") != 0) {
1272 rot_siz
= nvram_safe_get("log_file_size");
1274 if (nvram_get_int("log_file_size") > 0) {
1275 rot_keep
= nvram_safe_get("log_file_keep");
1278 // log to custom path - shibby
1279 if (nvram_match("log_file_custom", "1")) {
1280 log_file_path
= nvram_safe_get("log_file_path");
1281 argv
[argc
++] = "-s";
1282 argv
[argc
++] = rot_siz
;
1283 argv
[argc
++] = "-O";
1284 argv
[argc
++] = log_file_path
;
1285 if (strcmp(nvram_safe_get("log_file_path"), "/var/log/messages") != 0) {
1286 remove("/var/log/messages");
1287 symlink(log_file_path
, "/var/log/messages");
1292 /* Read options: rotate_size(kb) num_backups logfilename.
1293 * Ignore these settings and use defaults if the logfile cannot be written to.
1295 if (f_read_string("/etc/syslogd.cfg", cfg
, sizeof(cfg
)) > 0) {
1296 if ((nv
= strchr(cfg
, '\n')))
1299 if ((nv
= strtok(cfg
, " \t"))) {
1304 if ((nv
= strtok(NULL
, " \t")))
1307 if ((nv
= strtok(NULL
, " \t")) && *nv
== '/') {
1308 if (f_write(nv
, cfg
, 0, FW_APPEND
, 0) >= 0) {
1309 argv
[argc
++] = "-O";
1319 if (nvram_match("log_file_custom", "0")) {
1320 argv
[argc
++] = "-s";
1321 argv
[argc
++] = rot_siz
;
1323 if (lstat("/var/log/messages", &sb
) != -1)
1324 if (S_ISLNK(sb
.st_mode
))
1325 remove("/var/log/messages");
1328 if (isdigit(*b_opt
)) {
1329 argv
[argc
++] = "-b";
1330 argv
[argc
++] = b_opt
;
1332 if (nvram_get_int("log_file_size") > 0) {
1333 argv
[argc
++] = "-b";
1334 argv
[argc
++] = rot_keep
;
1340 _eval(argv
, NULL
, 0, NULL
);
1344 _eval(argv
, NULL
, 0, NULL
);
1346 // used to be available in syslogd -m
1347 n
= nvram_get_int("log_mark");
1351 sprintf(rem
, "*/%d * * * *", n
);
1352 else if (n
< 60 * 24)
1353 sprintf(rem
, "0 */%d * * *", n
/ 60);
1355 sprintf(rem
, "0 0 */%d * *", n
/ (60 * 24));
1356 sprintf(s
, "%s logger -p syslog.info -- -- MARK --", rem
);
1357 eval("cru", "a", "syslogdmark", s
);
1360 eval("cru", "d", "syslogdmark");
1365 void stop_syslog(void)
1367 killall("klogd", SIGTERM
);
1368 killall("syslogd", SIGTERM
);
1371 // -----------------------------------------------------------------------------
1373 static pid_t pid_igmp
= -1;
1375 void start_igmp_proxy(void)
1380 if (nvram_match("multicast_pass", "1")) {
1381 if (get_wan_proto() == WP_DISABLED
)
1384 if (f_exists("/etc/igmp.alt")) {
1385 eval("igmpproxy", "/etc/igmp.alt");
1387 else if ((fp
= fopen("/etc/igmp.conf", "w")) != NULL
) {
1390 "phyint %s upstream\n"
1392 // "phyint %s downstream ratelimit 0\n",
1394 nvram_safe_get("wan_ifname"),
1395 nvram_get("multicast_altnet") ? : "0.0.0.0/0");
1396 // nvram_safe_get("lan_ifname"));
1399 char lanN_ifname
[] = "lanXX_ifname";
1400 char multicast_lanN
[] = "multicast_lanXX";
1403 for(br
=0 ; br
<4 ; br
++) {
1404 char bridge
[2] = "0";
1410 sprintf(lanN_ifname
, "lan%s_ifname", bridge
);
1411 sprintf(multicast_lanN
, "multicast_lan%s", bridge
);
1413 if((strcmp(nvram_safe_get(multicast_lanN
),"1")==0) && (strcmp(nvram_safe_get(lanN_ifname
),"")!=0)) {
1415 "phyint %s downstream ratelimit 0\n",
1416 nvram_safe_get(lanN_ifname
));
1421 "phyint %s downstream ratelimit 0\n",
1422 nvram_safe_get("lan_ifname"));
1425 eval("igmpproxy", "/etc/igmp.conf");
1430 if (!nvram_contains_word("debug_norestart", "igmprt")) {
1436 void stop_igmp_proxy(void)
1439 killall_tk("igmpproxy");
1442 // -----------------------------------------------------------------------------
1444 void start_udpxy(void)
1446 if (nvram_match("udpxy_enable", "1")) {
1447 if (get_wan_proto() == WP_DISABLED
)
1449 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") );
1453 void stop_udpxy(void)
1455 killall_tk("udpxy");
1458 // -----------------------------------------------------------------------------
1460 #ifdef TCONFIG_NOCAT
1462 static pid_t pid_splashd
= -1;
1463 void start_splashd(void)
1467 if (!nvram_contains_word("debug_norestart", "splashd")) {
1472 void stop_splashd(void)
1480 // -----------------------------------------------------------------------------
1484 f_write_string("/etc/TZ", nvram_safe_get("tm_tz"), FW_CREATE
|FW_NEWLINE
, 0644);
1487 void start_ntpc(void)
1493 if (nvram_get_int("ntp_updates") >= 0) {
1494 xstart("ntpsync", "--init");
1498 void stop_ntpc(void)
1500 killall("ntpsync", SIGTERM
);
1503 // -----------------------------------------------------------------------------
1505 static void stop_rstats(void)
1515 while ((n
-- > 0) && ((pid
= pidof("rstats")) > 0)) {
1517 pidz
= pidof("gzip");
1518 if (pidz
< 1) pidz
= pidof("cp");
1519 ppidz
= ppid(ppid(pidz
));
1520 if ((m
> 0) && (pidz
> 0) && (pid
== ppidz
)) {
1521 syslog(LOG_DEBUG
, "rstats(PID %d) shutting down, waiting for helper process to complete(PID %d, PPID %d).\n", pid
, pidz
, ppidz
);
1528 if ((w
== 1) && (n
> 0))
1529 syslog(LOG_DEBUG
, "rstats stopped.\n");
1532 static void start_rstats(int new)
1534 if (nvram_match("rstats_enable", "1")) {
1537 syslog(LOG_DEBUG
, "starting rstats (new datafile).\n");
1538 xstart("rstats", "--new");
1540 syslog(LOG_DEBUG
, "starting rstats.\n");
1546 static void stop_cstats(void)
1556 while ((n
-- > 0) && ((pid
= pidof("cstats")) > 0)) {
1558 pidz
= pidof("gzip");
1559 if (pidz
< 1) pidz
= pidof("cp");
1560 ppidz
= ppid(ppid(pidz
));
1561 if ((m
> 0) && (pidz
> 0) && (pid
== ppidz
)) {
1562 syslog(LOG_DEBUG
, "cstats(PID %d) shutting down, waiting for helper process to complete(PID %d, PPID %d).\n", pid
, pidz
, ppidz
);
1569 if ((w
== 1) && (n
> 0))
1570 syslog(LOG_DEBUG
, "cstats stopped.\n");
1573 static void start_cstats(int new)
1575 if (nvram_match("cstats_enable", "1")) {
1578 syslog(LOG_DEBUG
, "starting cstats (new datafile).\n");
1579 xstart("cstats", "--new");
1581 syslog(LOG_DEBUG
, "starting cstats.\n");
1587 // -----------------------------------------------------------------------------
1589 // !!TB - FTP Server
1592 static char *get_full_storage_path(char *val
)
1594 static char buf
[128];
1598 len
= sprintf(buf
, "%s", val
);
1600 len
= sprintf(buf
, "%s/%s", MOUNT_ROOT
, val
);
1602 if (len
> 1 && buf
[len
- 1] == '/')
1608 static char *nvram_storage_path(char *var
)
1610 char *val
= nvram_safe_get(var
);
1611 return get_full_storage_path(val
);
1614 char vsftpd_conf
[] = "/etc/vsftpd.conf";
1615 char vsftpd_users
[] = "/etc/vsftpd.users";
1616 char vsftpd_passwd
[] = "/etc/vsftpd.passwd";
1618 /* VSFTPD code mostly stolen from Oleg's ASUS Custom Firmware GPL sources */
1620 static void start_ftpd(void)
1626 char *user
, *pass
, *rights
, *root_dir
;
1629 if (getpid() != 1) {
1630 start_service("ftpd");
1634 if (!nvram_get_int("ftp_enable")) return;
1636 mkdir_if_none(vsftpd_users
);
1637 mkdir_if_none("/var/run/vsftpd");
1639 if ((fp
= fopen(vsftpd_conf
, "w")) == NULL
)
1642 if (nvram_get_int("ftp_super"))
1645 sprintf(tmp
, "%s/%s", vsftpd_users
, "admin");
1646 if ((f
= fopen(tmp
, "w")))
1649 "dirlist_enable=yes\n"
1650 "write_enable=yes\n"
1651 "download_enable=yes\n");
1656 if (nvram_invmatch("ftp_anonymous", "0"))
1659 "anon_allow_writable_root=yes\n"
1660 "anon_world_readable_only=no\n"
1661 "anon_umask=022\n");
1664 sprintf(tmp
, "%s/ftp", vsftpd_users
);
1665 if ((f
= fopen(tmp
, "w")))
1667 if (nvram_match("ftp_dirlist", "0"))
1668 fprintf(f
, "dirlist_enable=yes\n");
1669 if (nvram_match("ftp_anonymous", "1") ||
1670 nvram_match("ftp_anonymous", "3"))
1671 fprintf(f
, "write_enable=yes\n");
1672 if (nvram_match("ftp_anonymous", "1") ||
1673 nvram_match("ftp_anonymous", "2"))
1674 fprintf(f
, "download_enable=yes\n");
1677 if (nvram_match("ftp_anonymous", "1") ||
1678 nvram_match("ftp_anonymous", "3"))
1680 "anon_upload_enable=yes\n"
1681 "anon_mkdir_write_enable=yes\n"
1682 "anon_other_write_enable=yes\n");
1684 fprintf(fp
, "anonymous_enable=no\n");
1688 "dirmessage_enable=yes\n"
1689 "download_enable=no\n"
1690 "dirlist_enable=no\n"
1692 "syslog_enable=yes\n"
1693 "local_enable=yes\n"
1696 "chroot_local_user=yes\n"
1698 "log_ftp_protocol=%s\n"
1699 "user_config_dir=%s\n"
1708 "max_login_fails=1\n"
1709 "idle_session_timeout=%s\n"
1711 "anon_max_rate=%d\n"
1712 "local_max_rate=%d\n"
1714 nvram_get_int("log_ftp") ? "yes" : "no",
1715 vsftpd_users
, vsftpd_passwd
,
1717 ipv6_enabled() ? "_ipv6" : "",
1718 ipv6_enabled() ? "" : "_ipv6",
1723 nvram_get("ftp_port") ? : "21",
1724 nvram_get_int("ftp_max"),
1725 nvram_get_int("ftp_ipmax"),
1726 nvram_get("ftp_staytimeout") ? : "300",
1727 nvram_get_int("ftp_anonrate") * 1024,
1728 nvram_get_int("ftp_rate") * 1024,
1729 nvram_safe_get("ftp_custom"));
1733 /* prepare passwd file and default users */
1734 if ((fp
= fopen(vsftpd_passwd
, "w")) == NULL
)
1737 if (((user
= nvram_get("http_username")) == NULL
) || (*user
== 0)) user
= "admin";
1738 if (((pass
= nvram_get("http_passwd")) == NULL
) || (*pass
== 0)) pass
= "admin";
1740 fprintf(fp
, /* anonymous, admin, nobody */
1741 "ftp:x:0:0:ftp:%s:/sbin/nologin\n"
1742 "%s:%s:0:0:root:/:/sbin/nologin\n"
1743 "nobody:x:65534:65534:nobody:%s/:/sbin/nologin\n",
1744 nvram_storage_path("ftp_anonroot"), user
,
1745 nvram_get_int("ftp_super") ? crypt(pass
, "$1$") : "x",
1748 if ((buf
= strdup(nvram_safe_get("ftp_users"))) != NULL
)
1751 username<password<rights[<root_dir]
1759 while ((q
= strsep(&p
, ">")) != NULL
) {
1760 i
= vstrsep(q
, "<", &user
, &pass
, &rights
, &root_dir
);
1761 if (i
< 3 || i
> 4) continue;
1762 if (!user
|| !pass
) continue;
1764 if (i
== 3 || !root_dir
|| !(*root_dir
))
1765 root_dir
= nvram_safe_get("ftp_pubroot");
1768 if (strncmp(rights
, "Private", 7) == 0)
1770 sprintf(tmp
, "%s/%s", nvram_storage_path("ftp_pvtroot"), user
);
1774 sprintf(tmp
, "%s", get_full_storage_path(root_dir
));
1776 fprintf(fp
, "%s:%s:0:0:%s:%s:/sbin/nologin\n",
1777 user
, crypt(pass
, "$1$"), user
, tmp
);
1780 sprintf(tmp
, "%s/%s", vsftpd_users
, user
);
1781 if ((f
= fopen(tmp
, "w")))
1784 if (nvram_invmatch("ftp_dirlist", "1"))
1785 strcat(tmp
, "dirlist_enable=yes\n");
1786 if (strstr(rights
, "Read") || !strcmp(rights
, "Private"))
1787 strcat(tmp
, "download_enable=yes\n");
1788 if (strstr(rights
, "Write") || !strncmp(rights
, "Private", 7))
1789 strcat(tmp
, "write_enable=yes\n");
1799 killall("vsftpd", SIGHUP
);
1801 /* start vsftpd if it's not already running */
1802 if (pidof("vsftpd") <= 0)
1806 static void stop_ftpd(void)
1808 if (getpid() != 1) {
1809 stop_service("ftpd");
1813 killall_tk("vsftpd");
1814 unlink(vsftpd_passwd
);
1815 unlink(vsftpd_conf
);
1816 eval("rm", "-rf", vsftpd_users
);
1818 #endif // TCONFIG_FTP
1820 // -----------------------------------------------------------------------------
1824 #ifdef TCONFIG_SAMBASRV
1825 static void kill_samba(int sig
)
1827 if (sig
== SIGTERM
) {
1832 killall("smbd", sig
);
1833 killall("nmbd", sig
);
1837 static void start_samba(void)
1846 if (getpid() != 1) {
1847 start_service("smbd");
1851 mode
= nvram_get_int("smbd_enable");
1852 if (!mode
|| !nvram_invmatch("lan_hostname", ""))
1855 if ((fp
= fopen("/etc/smb.conf", "w")) == NULL
)
1858 fprintf(fp
, "[global]\n"
1859 " interfaces = %s\n"
1860 " bind interfaces only = yes\n"
1862 " netbios name = %s\n"
1863 " server string = %s\n"
1864 " guest account = nobody\n"
1865 " security = user\n"
1868 " guest only = no\n"
1869 " browseable = yes\n"
1870 " syslog only = yes\n"
1871 " timestamp logs = no\n"
1873 " encrypt passwords = yes\n"
1874 " preserve case = yes\n"
1875 " short preserve case = yes\n",
1876 nvram_safe_get("lan_ifname"),
1877 nvram_get("smbd_wgroup") ? : "WORKGROUP",
1878 nvram_safe_get("lan_hostname"),
1879 nvram_get("router_name") ? : "Tomato",
1880 mode
== 2 ? "" : "map to guest = Bad User",
1881 mode
== 2 ? "no" : "yes" // guest ok
1884 if (nvram_get_int("smbd_wins")) {
1885 nv
= nvram_safe_get("wan_wins");
1886 if ((*nv
== 0) || (strcmp(nv
, "0.0.0.0") == 0)) {
1887 fprintf(fp
, " wins support = yes\n");
1891 if (nvram_get_int("smbd_master")) {
1893 " domain master = yes\n"
1894 " local master = yes\n"
1895 " preferred master = yes\n"
1896 " os level = 65\n");
1899 nv
= nvram_safe_get("smbd_cpage");
1901 #ifndef TCONFIG_SAMBA3
1902 fprintf(fp
, " client code page = %s\n", nv
);
1904 sprintf(nlsmod
, "nls_cp%s", nv
);
1906 nv
= nvram_safe_get("smbd_nlsmod");
1907 if ((*nv
) && (strcmp(nv
, nlsmod
) != 0))
1911 nvram_set("smbd_nlsmod", nlsmod
);
1914 #ifndef TCONFIG_SAMBA3
1915 if (nvram_match("smbd_cset", "utf8"))
1916 fprintf(fp
, " coding system = utf8\n");
1917 else if (nvram_invmatch("smbd_cset", ""))
1918 fprintf(fp
, " character set = %s\n", nvram_safe_get("smbd_cset"));
1921 nv
= nvram_safe_get("smbd_custom");
1922 /* add socket options unless overriden by the user */
1923 if (strstr(nv
, "socket options") == NULL
) {
1924 fprintf(fp
, " socket options = TCP_NODELAY SO_KEEPALIVE IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536\n");
1926 fprintf(fp
, "%s\n\n", nv
);
1928 /* configure shares */
1932 char *name
, *path
, *comment
, *writeable
, *hidden
;
1935 if ((buf
= strdup(nvram_safe_get("smbd_shares"))) != NULL
)
1937 /* sharename<path<comment<writeable[0|1]<hidden[0|1] */
1940 while ((q
= strsep(&p
, ">")) != NULL
) {
1941 if (vstrsep(q
, "<", &name
, &path
, &comment
, &writeable
, &hidden
) != 5) continue;
1942 if (!path
|| !name
) continue;
1945 fprintf(fp
, "\n[%s]\n", name
);
1948 fprintf(fp
, " path = %s\n", path
);
1951 if (!strcmp(writeable
, "1"))
1952 fprintf(fp
, " writable = yes\n delete readonly = yes\n force user = root\n");
1953 if (!strcmp(hidden
, "1"))
1954 fprintf(fp
, " browseable = no\n");
1958 fprintf(fp
, " comment = %s\n", comment
);
1965 /* Share every mountpoint below MOUNT_ROOT */
1966 if (nvram_get_int("smbd_autoshare") && (dir
= opendir(MOUNT_ROOT
))) {
1967 while ((dp
= readdir(dir
))) {
1968 if (strcmp(dp
->d_name
, ".") && strcmp(dp
->d_name
, "..")) {
1970 /* Only if is a directory and is mounted */
1971 if (!dir_is_mountpoint(MOUNT_ROOT
, dp
->d_name
))
1974 /* smbd_autoshare: 0 - disable, 1 - read-only, 2 - writable, 3 - hidden writable */
1975 fprintf(fp
, "\n[%s]\n path = %s/%s\n comment = %s\n",
1976 dp
->d_name
, MOUNT_ROOT
, dp
->d_name
, dp
->d_name
);
1977 if (nvram_match("smbd_autoshare", "3")) // Hidden
1978 fprintf(fp
, "\n[%s$]\n path = %s/%s\n browseable = no\n",
1979 dp
->d_name
, MOUNT_ROOT
, dp
->d_name
);
1980 if (nvram_match("smbd_autoshare", "2") || nvram_match("smbd_autoshare", "3")) // RW
1981 fprintf(fp
, " writable = yes\n delete readonly = yes\n force user = root\n");
1987 if (dir
) closedir(dir
);
1990 /* by default share MOUNT_ROOT as read-only */
1991 fprintf(fp
, "\n[share]\n"
1999 mkdir_if_none("/var/run/samba");
2000 mkdir_if_none("/etc/samba");
2002 /* write smbpasswd */
2003 #ifdef TCONFIG_SAMBA3
2004 eval("smbpasswd", "nobody", "\"\"");
2006 eval("smbpasswd", "-a", "nobody", "\"\"");
2010 if (((smbd_user
= nvram_get("smbd_user")) == NULL
) || (*smbd_user
== 0) || !strcmp(smbd_user
, "root"))
2012 #ifdef TCONFIG_SAMBA3
2013 eval("smbpasswd", smbd_user
, nvram_safe_get("smbd_passwd"));
2015 eval("smbpasswd", "-a", smbd_user
, nvram_safe_get("smbd_passwd"));
2020 int ret1
= 0, ret2
= 0;
2021 /* start samba if it's not already running */
2022 if (pidof("nmbd") <= 0)
2023 ret1
= xstart("nmbd", "-D");
2024 if (pidof("smbd") <= 0)
2025 ret2
= xstart("smbd", "-D");
2027 if (ret1
|| ret2
) kill_samba(SIGTERM
);
2030 static void stop_samba(void)
2032 if (getpid() != 1) {
2033 stop_service("smbd");
2037 kill_samba(SIGTERM
);
2039 unlink("/var/log/smb");
2040 unlink("/var/log/nmb");
2041 eval("rm", "-rf", "/var/run/samba");
2043 #endif // TCONFIG_SAMBASRV
2045 #ifdef TCONFIG_MEDIA_SERVER
2046 #define MEDIA_SERVER_APP "minidlna"
2048 static void start_media_server(void)
2051 int port
, pid
, https
;
2053 char *argv
[] = { MEDIA_SERVER_APP
, "-f", "/etc/"MEDIA_SERVER_APP
".conf", "-R", NULL
};
2054 static int once
= 1;
2056 if (getpid() != 1) {
2057 start_service("media");
2061 if (nvram_get_int("ms_sas") == 0)
2064 if (nvram_get_int("ms_enable") != 0) {
2065 if ((!once
) && (nvram_get_int("ms_rescan") == 0)) {
2069 nvram_unset("ms_rescan");
2071 if (f_exists("/etc/"MEDIA_SERVER_APP
".alt")) {
2072 argv
[2] = "/etc/"MEDIA_SERVER_APP
".alt";
2075 if ((f
= fopen(argv
[2], "w")) != NULL
) {
2076 port
= nvram_get_int("ms_port");
2077 https
= nvram_get_int("https_enable");
2078 dbdir
= nvram_safe_get("ms_dbdir");
2079 if (!(*dbdir
)) dbdir
= NULL
;
2080 mkdir_if_none(dbdir
? : "/var/run/"MEDIA_SERVER_APP
);
2083 "network_interface=%s\n"
2085 "friendly_name=%s\n"
2089 "presentation_url=http%s://%s:%s/nas-media.asp\n"
2091 "notify_interval=600\n"
2092 "album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg\n"
2094 nvram_safe_get("lan_ifname"),
2095 (port
< 0) || (port
>= 0xffff) ? 0 : port
,
2096 nvram_get("router_name") ? : "Tomato",
2097 dbdir
? : "/var/run/"MEDIA_SERVER_APP
,
2098 nvram_get_int("ms_tivo") ? "yes" : "no",
2099 nvram_get_int("ms_stdlna") ? "yes" : "no",
2100 https
? "s" : "", nvram_safe_get("lan_ipaddr"), nvram_safe_get(https
? "https_lanport" : "http_lanport")
2103 // media directories
2105 char *path
, *restrict
;
2107 if ((buf
= strdup(nvram_safe_get("ms_dirs"))) != NULL
) {
2108 /* path<restrict[A|V|P|] */
2111 while ((q
= strsep(&p
, ">")) != NULL
) {
2112 if (vstrsep(q
, "<", &path
, &restrict
) < 1 || !path
|| !(*path
))
2114 fprintf(f
, "media_dir=%s%s%s\n",
2115 restrict
? : "", (restrict
&& *restrict
) ? "," : "", path
);
2124 /* start media server if it's not already running */
2125 if (pidof(MEDIA_SERVER_APP
) <= 0) {
2126 if ((_eval(argv
, NULL
, 0, &pid
) == 0) && (once
)) {
2127 /* If we started the media server successfully, wait 1 sec
2128 * to let it die if it can't open the database file.
2129 * If it's still alive after that, assume it's running and
2130 * disable forced once-after-reboot rescan.
2133 if (pidof(MEDIA_SERVER_APP
) > 0)
2140 static void stop_media_server(void)
2142 if (getpid() != 1) {
2143 stop_service("media");
2147 killall_tk(MEDIA_SERVER_APP
);
2149 #endif // TCONFIG_MEDIA_SERVER
2152 static void start_nas_services(void)
2154 if (getpid() != 1) {
2155 start_service("usbapps");
2159 #ifdef TCONFIG_SAMBASRV
2165 #ifdef TCONFIG_MEDIA_SERVER
2166 start_media_server();
2170 static void stop_nas_services(void)
2172 if (getpid() != 1) {
2173 stop_service("usbapps");
2177 #ifdef TCONFIG_MEDIA_SERVER
2178 stop_media_server();
2183 #ifdef TCONFIG_SAMBASRV
2188 void restart_nas_services(int stop
, int start
)
2190 int fd
= file_lock("usb");
2191 /* restart all NAS applications */
2193 stop_nas_services();
2195 start_nas_services();
2198 #endif // TCONFIG_USB
2200 // -----------------------------------------------------------------------------
2202 /* -1 = Don't check for this program, it is not expected to be running.
2203 * Other = This program has been started and should be kept running. If no
2204 * process with the name is running, call func to restart it.
2205 * Note: At startup, dnsmasq forks a short-lived child which forks a
2206 * long-lived (grand)child. The parents terminate.
2207 * Many daemons use this technique.
2209 static void _check(pid_t pid
, const char *name
, void (*func
)(void))
2211 if (pid
== -1) return;
2213 if (pidof(name
) > 0) return;
2215 syslog(LOG_DEBUG
, "%s terminated unexpectedly, restarting.\n", name
);
2218 // Force recheck in 500 msec
2219 setitimer(ITIMER_REAL
, &pop_tv
, NULL
);
2222 void check_services(void)
2224 TRACE_PT("keep alive\n");
2226 // Periodically reap any zombies
2227 setitimer(ITIMER_REAL
, &zombie_tv
, NULL
);
2230 _check(pid_hotplug2
, "hotplug2", start_hotplug2
);
2232 _check(pid_dnsmasq
, "dnsmasq", start_dnsmasq
);
2233 _check(pid_crond
, "crond", start_cron
);
2234 _check(pid_igmp
, "igmpproxy", start_igmp_proxy
);
2236 // #ifdef TCONFIG_NOCAT
2237 // if (nvram_get_int("NC_enable"))
2238 // _check(&pid_splashd, "splashd", start_splashd);
2243 // -----------------------------------------------------------------------------
2245 void start_services(void)
2247 static int once
= 1;
2252 if (nvram_get_int("telnetd_eas")) start_telnetd();
2253 if (nvram_get_int("sshd_eas")) start_sshd();
2267 #ifdef TCONFIG_PPTPD
2270 restart_nas_services(1, 1); // !!TB - Samba, FTP and Media Server
2276 #ifdef TCONFIG_NOCAT
2282 void stop_services(void)
2285 // restart_nas_services(1, 0); // stop Samba, FTP and Media Server
2288 #ifdef TCONFIG_NOCAT
2303 restart_nas_services(1, 0); // stop Samba, FTP and Media Server
2304 #ifdef TCONFIG_PPTPD
2320 // -----------------------------------------------------------------------------
2322 /* nvram "action_service" is: "service-action[-modifier]"
2323 * action is something like "stop" or "start" or "restart"
2324 * optional modifier is "c" for the "service" command-line command
2326 void exec_service(void)
2328 const int A_START
= 1;
2329 const int A_STOP
= 2;
2330 const int A_RESTART
= 1|2;
2339 strlcpy(buffer
, nvram_safe_get("action_service"), sizeof(buffer
));
2343 act
= strsep(&next
, ",");
2344 service
= strsep(&act
, "-");
2350 strsep(&modifier
, "-");
2352 TRACE_PT("service=%s action=%s modifier=%s\n", service
, act
, modifier
? : "");
2354 if (strcmp(act
, "start") == 0) action
= A_START
;
2355 else if (strcmp(act
, "stop") == 0) action
= A_STOP
;
2356 else if (strcmp(act
, "restart") == 0) action
= A_RESTART
;
2358 user
= (modifier
!= NULL
&& *modifier
== 'c');
2360 if (strcmp(service
, "dhcpc") == 0) {
2361 if (action
& A_STOP
) stop_dhcpc();
2362 if (action
& A_START
) start_dhcpc();
2366 if ((strcmp(service
, "dhcpd") == 0) || (strcmp(service
, "dns") == 0) || (strcmp(service
, "dnsmasq") == 0)) {
2367 if (action
& A_STOP
) stop_dnsmasq();
2368 if (action
& A_START
) {
2375 if (strcmp(service
, "firewall") == 0) {
2376 if (action
& A_STOP
) {
2381 if (action
& A_START
) {
2389 if (strcmp(service
, "restrict") == 0) {
2390 if (action
& A_STOP
) {
2393 if (action
& A_START
) {
2394 i
= nvram_get_int("rrules_radio"); // -1 = not used, 0 = enabled by rule, 1 = disabled by rule
2398 // if radio was disabled by access restriction, but no rule is handling it now, enable it
2400 if (nvram_get_int("rrules_radio") < 0) {
2401 eval("radio", "on");
2408 if (strcmp(service
, "arpbind") == 0) {
2409 if (action
& A_STOP
) stop_arpbind();
2410 if (action
& A_START
) start_arpbind();
2414 if (strcmp(service
, "qos") == 0) {
2415 if (action
& A_STOP
) {
2418 stop_firewall(); start_firewall(); // always restarted
2419 if (action
& A_START
) {
2421 if (nvram_match("qos_reset", "1")) f_write_string("/proc/net/clear_marks", "1", 0, 0);
2426 if (strcmp(service
, "qoslimit") == 0) {
2427 if (action
& A_STOP
) {
2430 #ifdef TCONFIG_NOCAT
2433 stop_firewall(); start_firewall(); // always restarted
2434 if (action
& A_START
) {
2437 #ifdef TCONFIG_NOCAT
2443 if (strcmp(service
, "upnp") == 0) {
2444 if (action
& A_STOP
) {
2447 stop_firewall(); start_firewall(); // always restarted
2448 if (action
& A_START
) {
2454 if (strcmp(service
, "telnetd") == 0) {
2455 if (action
& A_STOP
) stop_telnetd();
2456 if (action
& A_START
) start_telnetd();
2460 if (strcmp(service
, "sshd") == 0) {
2461 if (action
& A_STOP
) stop_sshd();
2462 if (action
& A_START
) start_sshd();
2466 if (strcmp(service
, "httpd") == 0) {
2467 if (action
& A_STOP
) stop_httpd();
2468 if (action
& A_START
) start_httpd();
2473 if (strcmp(service
, "ipv6") == 0) {
2474 if (action
& A_STOP
) {
2478 if (action
& A_START
) {
2485 if (strncmp(service
, "dhcp6", 5) == 0) {
2486 if (action
& A_STOP
) {
2489 if (action
& A_START
) {
2496 if (strcmp(service
, "admin") == 0) {
2497 if (action
& A_STOP
) {
2502 stop_firewall(); start_firewall(); // always restarted
2503 if (action
& A_START
) {
2506 if (nvram_match("telnetd_eas", "1")) start_telnetd();
2507 if (nvram_match("sshd_eas", "1")) start_sshd();
2512 if (strcmp(service
, "ddns") == 0) {
2513 if (action
& A_STOP
) stop_ddns();
2514 if (action
& A_START
) start_ddns();
2518 if (strcmp(service
, "ntpc") == 0) {
2519 if (action
& A_STOP
) stop_ntpc();
2520 if (action
& A_START
) start_ntpc();
2524 if (strcmp(service
, "logging") == 0) {
2525 if (action
& A_STOP
) {
2528 if (action
& A_START
) {
2532 // always restarted except from "service" command
2533 stop_cron(); start_cron();
2534 stop_firewall(); start_firewall();
2539 if (strcmp(service
, "crond") == 0) {
2540 if (action
& A_STOP
) {
2543 if (action
& A_START
) {
2550 if (strncmp(service
, "hotplug", 7) == 0) {
2551 if (action
& A_STOP
) {
2554 if (action
& A_START
) {
2561 if (strcmp(service
, "upgrade") == 0) {
2562 if (action
& A_START
) {
2567 restart_nas_services(1, 0); // stop Samba, FTP and Media Server
2575 killall("rstats", SIGTERM
);
2576 killall("cstats", SIGTERM
);
2577 killall("buttons", SIGTERM
);
2579 remove_storage_main(1); // !!TB - USB Support
2580 stop_usb(); // !!TB - USB Support
2586 if (strcmp(service
, "cifs") == 0) {
2587 if (action
& A_STOP
) stop_cifs();
2588 if (action
& A_START
) start_cifs();
2593 #ifdef TCONFIG_JFFS2
2594 if (strncmp(service
, "jffs", 4) == 0) {
2595 if (action
& A_STOP
) stop_jffs2();
2596 if (action
& A_START
) start_jffs2();
2601 if (strcmp(service
, "zebra") == 0) {
2602 if (action
& A_STOP
) stop_zebra();
2603 if (action
& A_START
) start_zebra();
2607 if (strcmp(service
, "routing") == 0) {
2608 if (action
& A_STOP
) {
2610 do_static_routes(0); // remove old '_saved'
2611 eval("brctl", "stp", nvram_safe_get("lan_ifname"), "0");
2613 if(strcmp(nvram_safe_get("lan1_ifname"),"")!=0)
2614 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), "0");
2615 if(strcmp(nvram_safe_get("lan2_ifname"),"")!=0)
2616 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), "0");
2617 if(strcmp(nvram_safe_get("lan3_ifname"),"")!=0)
2618 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), "0");
2623 if (action
& A_START
) {
2624 do_static_routes(1); // add new
2626 eval("brctl", "stp", nvram_safe_get("lan_ifname"), nvram_safe_get("lan_stp"));
2628 if(strcmp(nvram_safe_get("lan1_ifname"),"")!=0)
2629 eval("brctl", "stp", nvram_safe_get("lan1_ifname"), nvram_safe_get("lan1_stp"));
2630 if(strcmp(nvram_safe_get("lan2_ifname"),"")!=0)
2631 eval("brctl", "stp", nvram_safe_get("lan2_ifname"), nvram_safe_get("lan2_stp"));
2632 if(strcmp(nvram_safe_get("lan3_ifname"),"")!=0)
2633 eval("brctl", "stp", nvram_safe_get("lan3_ifname"), nvram_safe_get("lan3_stp"));
2639 if (strcmp(service
, "ctnf") == 0) {
2640 if (action
& A_START
) {
2648 if (strcmp(service
, "wan") == 0) {
2649 if (action
& A_STOP
) {
2653 if (action
& A_START
) {
2654 rename("/tmp/ppp/log", "/tmp/ppp/log.~");
2662 if (strcmp(service
, "net") == 0) {
2663 if (action
& A_STOP
) {
2665 stop_nas_services();
2675 if (action
& A_START
) {
2685 start_nas_services();
2691 if (strcmp(service
, "wireless") == 0) {
2692 if(action
& A_STOP
) {
2695 if(action
& A_START
) {
2701 if (strcmp(service
, "wl") == 0) {
2702 if(action
& A_STOP
) {
2706 if(action
& A_START
) {
2715 if (strcmp(service
, "nas") == 0) {
2716 if (action
& A_STOP
) {
2719 if (action
& A_START
) {
2726 if (strcmp(service
, "rstats") == 0) {
2727 if (action
& A_STOP
) stop_rstats();
2728 if (action
& A_START
) start_rstats(0);
2732 if (strcmp(service
, "rstatsnew") == 0) {
2733 if (action
& A_STOP
) stop_rstats();
2734 if (action
& A_START
) start_rstats(1);
2738 if (strcmp(service
, "cstats") == 0) {
2739 if (action
& A_STOP
) stop_cstats();
2740 if (action
& A_START
) start_cstats(0);
2744 if (strcmp(service
, "cstatsnew") == 0) {
2745 if (action
& A_STOP
) stop_cstats();
2746 if (action
& A_START
) start_cstats(1);
2750 if (strcmp(service
, "sched") == 0) {
2751 if (action
& A_STOP
) stop_sched();
2752 if (action
& A_START
) start_sched();
2758 if (strcmp(service
, "snmp") == 0) {
2759 if (action
& A_STOP
) stop_snmp();
2760 if (action
& A_START
) start_snmp();
2767 // !!TB - USB Support
2768 if (strcmp(service
, "usb") == 0) {
2769 if (action
& A_STOP
) stop_usb();
2770 if (action
& A_START
) {
2772 // restart Samba and ftp since they may be killed by stop_usb()
2773 restart_nas_services(0, 1);
2774 // remount all partitions by simulating hotplug event
2775 add_remove_usbhost("-1", 1);
2780 if (strcmp(service
, "usbapps") == 0) {
2781 if (action
& A_STOP
) stop_nas_services();
2782 if (action
& A_START
) start_nas_services();
2788 // !!TB - FTP Server
2789 if (strcmp(service
, "ftpd") == 0) {
2790 if (action
& A_STOP
) stop_ftpd();
2794 if (action
& A_START
) start_ftpd();
2799 #ifdef TCONFIG_MEDIA_SERVER
2800 if (strcmp(service
, "media") == 0 || strcmp(service
, "dlna") == 0) {
2801 if (action
& A_STOP
) stop_media_server();
2802 if (action
& A_START
) start_media_server();
2807 #ifdef TCONFIG_SAMBASRV
2809 if (strcmp(service
, "samba") == 0 || strcmp(service
, "smbd") == 0) {
2810 if (action
& A_STOP
) stop_samba();
2811 if (action
& A_START
) {
2821 #ifdef TCONFIG_OPENVPN
2822 if (strncmp(service
, "vpnclient", 9) == 0) {
2823 if (action
& A_STOP
) stop_vpnclient(atoi(&service
[9]));
2824 if (action
& A_START
) start_vpnclient(atoi(&service
[9]));
2828 if (strncmp(service
, "vpnserver", 9) == 0) {
2829 if (action
& A_STOP
) stop_vpnserver(atoi(&service
[9]));
2830 if (action
& A_START
) start_vpnserver(atoi(&service
[9]));
2835 #ifdef TCONFIG_NOCAT
2836 if (strcmp(service
, "splashd") == 0) {
2837 if (action
& A_STOP
) stop_splashd();
2838 if (action
& A_START
) start_splashd();
2843 #ifdef TCONFIG_PPTPD
2844 if (strcmp(service
, "pptpd") == 0) {
2845 if (action
& A_STOP
) stop_pptpd();
2846 if (action
& A_START
) start_pptpd();
2851 #ifdef TCONFIG_USERPPTP
2852 if (strcmp(service
, "pptpclient") == 0) {
2853 if (action
& A_STOP
) stop_pptp_client();
2854 if (action
& A_START
) start_pptp_client();
2855 if (action
& (A_START
| A_STOP
))
2860 if ((action
& A_START
) == 0)
2870 // some functions check action_service and must be cleared at end -- zzz
2871 nvram_set("action_service", "");
2873 // Force recheck in 500 msec
2874 setitimer(ITIMER_REAL
, &pop_tv
, NULL
);
2877 static void do_service(const char *name
, const char *action
, int user
)
2883 while (!nvram_match("action_service", "")) {
2888 else if (--n
< 0) break;
2892 snprintf(s
, sizeof(s
), "%s-%s%s", name
, action
, (user
? "-c" : ""));
2893 nvram_set("action_service", s
);
2895 if (nvram_match("debug_rc_svc", "1")) {
2896 nvram_unset("debug_rc_svc");
2903 while (nvram_match("action_service", s
)) {
2915 int service_main(int argc
, char *argv
[])
2917 if (argc
!= 3) usage_exit(argv
[0], "<service> <action>");
2918 do_service(argv
[1], argv
[2], 1);
2919 printf("\nDone.\n");
2923 void start_service(const char *name
)
2925 do_service(name
, "start", 0);
2928 void stop_service(const char *name
)
2930 do_service(name
, "stop", 0);
2934 void restart_service(const char *name)
2936 do_service(name, "restart", 0);