6relayd: Fix some RFC 6204 compatibility issues
[openwrt/svn-archive/archive.git] / package / network / ipv6 / 6relayd / files / 6relayd.init
1 #!/bin/sh /etc/rc.common
2 # Copyright (c) 2011-2012 OpenWrt.org
3 START=80
4
5 resolve_ifname() {
6 grep -qs "^ *$1:" /proc/net/dev && {
7 append ifaces "$1"
8 }
9 }
10
11 resolve_network() {
12 local ifn
13 fixup_interface "$1"
14 config_get ifn "$1" ifname
15 [ -z "$ifn" ] && return 1
16 resolve_ifname "$ifn"
17 }
18
19 start_6relayd() {
20 local cfg="$1"
21 local mode="$2"
22 local args="-s -l"
23 local ifaces=""
24
25 SERVICE_DAEMONIZE=1
26 SERVICE_WRITE_PID=1
27 SERVICE_PID_FILE="/var/run/6relayd-$cfg.pid"
28 [ -f "$SERVICE_PID_FILE" ] && {
29 if grep -q 6relayd "/proc/$(cat $SERVICE_PID_FILE)/cmdline"; then
30 return 0
31 else
32 rm -f "$SERVICE_PID_FILE"
33 fi
34 }
35
36 local net networks
37 config_get networks "$cfg" network
38 for net in $networks; do
39 resolve_network "$net" || {
40 return 1
41 }
42 done
43
44 local ifn ifnames
45 config_get ifnames "$cfg" ifname
46 for ifn in $ifnames; do
47 resolve_ifname "$ifn"
48 done
49
50 local rd
51 config_get rd "$cfg" rd
52 [ -n "$rd" ] && append args "-R$rd"
53
54 local dhcpv6
55 config_get dhcpv6 "$cfg" dhcpv6
56 [ -n "$dhcpv6" ] && append args "-D$dhcpv6"
57
58 local ndp
59 config_get ndp "$cfg" ndp
60 [ "$ndp" == "relay" ] && append args "-N -r"
61
62 local always_rewrite_dns
63 config_get_bool always_rewrite_dns "$cfg" always_rewrite_dns 0
64 [ $always_rewrite_dns -eq 1 ] && append args "-n"
65
66 # In server mode the first interface needs to be passed twice
67 [ "$mode" == "server" ] && ifaces=". $ifaces"
68
69 service_start /usr/sbin/6relayd $args $ifaces
70 }
71
72 stop() {
73 for pid in /var/run/6relayd-*.pid; do
74 SERVICE_PID_FILE="$pid"
75 service_stop /usr/sbin/6relayd
76 rm -f "$SERVICE_PID_FILE"
77 done
78 }
79
80 start() {
81 include /lib/network
82 config_load 6relayd
83 config_foreach start_6relayd relay relay
84 config_foreach start_6relayd server server
85 }