The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 1 | # 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 Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 9 | resolv_conf_dir="$state_dir/resolv.conf" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 10 | |
| 11 | build_resolv_conf() |
| 12 | { |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 13 | local cf="$state_dir/resolv.conf.$interface" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 14 | local interfaces= header= search= srvs= servers= x= |
| 15 | |
| 16 | # Build a list of interfaces |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 17 | interfaces=$(list_interfaces "$resolv_conf_dir") |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 18 | |
| 19 | # Build the resolv.conf |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 20 | if [ -n "$interfaces" ]; then |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 21 | # Build the header |
| 22 | for x in ${interfaces}; do |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 23 | header="$header${header:+, }$x" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 24 | done |
| 25 | |
| 26 | # Build the search list |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 27 | domain=$(cd "$resolv_conf_dir"; \ |
| 28 | key_get_value "domain " ${interfaces}) |
| 29 | search=$(cd "$resolv_conf_dir"; \ |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 30 | key_get_value "search " ${interfaces}) |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 31 | 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 Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 39 | |
| 40 | # Build the nameserver list |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 41 | srvs=$(cd "$resolv_conf_dir"; \ |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 42 | key_get_value "nameserver " ${interfaces}) |
| 43 | for x in $(uniqify ${srvs}); do |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 44 | servers="${servers}nameserver $x\n" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 45 | done |
| 46 | fi |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 47 | header="$signature_base${header:+ $from }$header" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 48 | |
| 49 | # Assemble resolv.conf using our head and tail files |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 50 | [ -f "$cf" ] && rm -f "$cf" |
| 51 | [ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir" |
| 52 | echo "$header" > "$cf" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 53 | if [ -f /etc/resolv.conf.head ]; then |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 54 | cat /etc/resolv.conf.head >> "$cf" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 55 | else |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 56 | echo "# /etc/resolv.conf.head can replace this line" >> "$cf" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 57 | fi |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 58 | printf "$domain$search$servers" >> "$cf" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 59 | if [ -f /etc/resolv.conf.tail ]; then |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 60 | cat /etc/resolv.conf.tail >> "$cf" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 61 | else |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 62 | echo "# /etc/resolv.conf.tail can replace this line" >> "$cf" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 63 | fi |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 64 | cat "$cf" > /etc/resolv.conf |
| 65 | chmod 644 /etc/resolv.conf |
| 66 | rm -f "$cf" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 67 | } |
| 68 | |
| 69 | add_resolv_conf() |
| 70 | { |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 71 | local x= conf="$signature\n" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 72 | |
| 73 | # If we don't have any configuration, remove it |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 74 | if [ -z "$new_domain_name_servers" -a \ |
| 75 | -z "$new_domain_name" -a \ |
| 76 | -z "$new_domain_search" ]; then |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 77 | remove_resolv_conf |
| 78 | return $? |
| 79 | fi |
| 80 | |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 81 | 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 Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 92 | fi |
| 93 | for x in ${new_domain_name_servers}; do |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 94 | conf="${conf}nameserver $x\n" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 95 | done |
| 96 | if type resolvconf >/dev/null 2>&1; then |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 97 | [ -n "$metric" ] && export IF_METRIC="$metric" |
| 98 | printf "$conf" | resolvconf -a "$interface" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 99 | return $? |
| 100 | fi |
| 101 | |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 102 | if [ -e "$resolv_conf_dir/$interface" ]; then |
| 103 | rm -f "$resolv_conf_dir/$interface" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 104 | fi |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 105 | [ -d "$resolv_conf_dir" ] || mkdir -p "$resolv_conf_dir" |
| 106 | printf "$conf" > "$resolv_conf_dir/$interface" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 107 | build_resolv_conf |
| 108 | } |
| 109 | |
| 110 | remove_resolv_conf() |
| 111 | { |
| 112 | if type resolvconf >/dev/null 2>&1; then |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 113 | resolvconf -d "$interface" -f |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 114 | else |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 115 | if [ -e "$resolv_conf_dir/$interface" ]; then |
| 116 | rm -f "$resolv_conf_dir/$interface" |
The Android Open Source Project | f7c5421 | 2009-03-03 19:29:22 -0800 | [diff] [blame] | 117 | fi |
| 118 | build_resolv_conf |
| 119 | fi |
| 120 | } |
| 121 | |
Dmitry Shmidt | e86eee1 | 2011-01-24 16:27:51 -0800 | [diff] [blame] | 122 | if $if_up; then |
| 123 | add_resolv_conf |
| 124 | elif $if_down; then |
| 125 | remove_resolv_conf |
| 126 | fi |