blob: 628636dc72fd3620df81518e21910756b6979457 [file] [log] [blame]
The Android Open Source Projectf7c54212009-03-03 19:29:22 -08001# Generate /etc/resolv.conf
2# Support resolvconf(8) if available
3# We can merge other dhcpcd resolv.conf files into one like resolvconf,
4# but resolvconf is preferred as other applications like VPN clients
5# can readily hook into it.
6# Also, resolvconf can configure local nameservers such as bind
7# or dnsmasq. This is important as the libc resolver isn't that powerful.
8
Dmitry Shmidte86eee12011-01-24 16:27:51 -08009resolv_conf_dir="$state_dir/resolv.conf"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080010
11build_resolv_conf()
12{
Dmitry Shmidte86eee12011-01-24 16:27:51 -080013 local cf="$state_dir/resolv.conf.$interface"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080014 local interfaces= header= search= srvs= servers= x=
15
16 # Build a list of interfaces
Dmitry Shmidte86eee12011-01-24 16:27:51 -080017 interfaces=$(list_interfaces "$resolv_conf_dir")
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080018
19 # Build the resolv.conf
Dmitry Shmidte86eee12011-01-24 16:27:51 -080020 if [ -n "$interfaces" ]; then
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080021 # Build the header
22 for x in ${interfaces}; do
Dmitry Shmidte86eee12011-01-24 16:27:51 -080023 header="$header${header:+, }$x"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080024 done
25
26 # Build the search list
Dmitry Shmidte86eee12011-01-24 16:27:51 -080027 domain=$(cd "$resolv_conf_dir"; \
28 key_get_value "domain " ${interfaces})
29 search=$(cd "$resolv_conf_dir"; \
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080030 key_get_value "search " ${interfaces})
Dmitry Shmidte86eee12011-01-24 16:27:51 -080031 set -- ${domain}
32 unset domain
33 if [ -n "$2" ]; then
34 search="$search $@"
35 elif [ -n "$1" ]; then
36 domain="domain $1\n"
37 fi
38 [ -n "$search" ] && search="search $(uniqify $search)\n"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080039
40 # Build the nameserver list
Dmitry Shmidte86eee12011-01-24 16:27:51 -080041 srvs=$(cd "$resolv_conf_dir"; \
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080042 key_get_value "nameserver " ${interfaces})
43 for x in $(uniqify ${srvs}); do
Dmitry Shmidte86eee12011-01-24 16:27:51 -080044 servers="${servers}nameserver $x\n"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080045 done
46 fi
Dmitry Shmidte86eee12011-01-24 16:27:51 -080047 header="$signature_base${header:+ $from }$header"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080048
49 # Assemble resolv.conf using our head and tail files
Dmitry Shmidte86eee12011-01-24 16:27:51 -080050 [ -f "$cf" ] && rm -f "$cf"
51 [ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir"
52 echo "$header" > "$cf"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080053 if [ -f /etc/resolv.conf.head ]; then
Dmitry Shmidte86eee12011-01-24 16:27:51 -080054 cat /etc/resolv.conf.head >> "$cf"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080055 else
Dmitry Shmidte86eee12011-01-24 16:27:51 -080056 echo "# /etc/resolv.conf.head can replace this line" >> "$cf"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080057 fi
Dmitry Shmidte86eee12011-01-24 16:27:51 -080058 printf "$domain$search$servers" >> "$cf"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080059 if [ -f /etc/resolv.conf.tail ]; then
Dmitry Shmidte86eee12011-01-24 16:27:51 -080060 cat /etc/resolv.conf.tail >> "$cf"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080061 else
Dmitry Shmidte86eee12011-01-24 16:27:51 -080062 echo "# /etc/resolv.conf.tail can replace this line" >> "$cf"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080063 fi
Dmitry Shmidte86eee12011-01-24 16:27:51 -080064 cat "$cf" > /etc/resolv.conf
65 chmod 644 /etc/resolv.conf
66 rm -f "$cf"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080067}
68
69add_resolv_conf()
70{
Dmitry Shmidte86eee12011-01-24 16:27:51 -080071 local x= conf="$signature\n"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080072
73 # If we don't have any configuration, remove it
Dmitry Shmidte86eee12011-01-24 16:27:51 -080074 if [ -z "$new_domain_name_servers" -a \
75 -z "$new_domain_name" -a \
76 -z "$new_domain_search" ]; then
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080077 remove_resolv_conf
78 return $?
79 fi
80
Dmitry Shmidte86eee12011-01-24 16:27:51 -080081 if [ -n "$new_domain_name" ]; then
82 set -- $new_domain_name
83 new_domain_name="$1"
84 conf="${conf}domain $new_domain_name\n"
85 # Support RFC violating search in domain
86 if [ -z "$new_domain_search" -a -n "$2" ]; then
87 new_domain_search="$@"
88 fi
89 fi
90 if [ -n "$new_domain_search" ]; then
91 conf="${conf}search $new_domain_search\n"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080092 fi
93 for x in ${new_domain_name_servers}; do
Dmitry Shmidte86eee12011-01-24 16:27:51 -080094 conf="${conf}nameserver $x\n"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080095 done
96 if type resolvconf >/dev/null 2>&1; then
Dmitry Shmidte86eee12011-01-24 16:27:51 -080097 [ -n "$metric" ] && export IF_METRIC="$metric"
98 printf "$conf" | resolvconf -a "$interface"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -080099 return $?
100 fi
101
Dmitry Shmidte86eee12011-01-24 16:27:51 -0800102 if [ -e "$resolv_conf_dir/$interface" ]; then
103 rm -f "$resolv_conf_dir/$interface"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -0800104 fi
Dmitry Shmidte86eee12011-01-24 16:27:51 -0800105 [ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir"
106 printf "$conf" > "$resolv_conf_dir/$interface"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -0800107 build_resolv_conf
108}
109
110remove_resolv_conf()
111{
112 if type resolvconf >/dev/null 2>&1; then
Dmitry Shmidte86eee12011-01-24 16:27:51 -0800113 resolvconf -d "$interface" -f
The Android Open Source Projectf7c54212009-03-03 19:29:22 -0800114 else
Dmitry Shmidte86eee12011-01-24 16:27:51 -0800115 if [ -e "$resolv_conf_dir/$interface" ]; then
116 rm -f "$resolv_conf_dir/$interface"
The Android Open Source Projectf7c54212009-03-03 19:29:22 -0800117 fi
118 build_resolv_conf
119 fi
120}
121
Dmitry Shmidte86eee12011-01-24 16:27:51 -0800122if $if_up; then
123 add_resolv_conf
124elif $if_down; then
125 remove_resolv_conf
126fi