/contrib/openresolv/libc.in

https://bitbucket.org/freebsd/freebsd-head/ · Autoconf · 170 lines · 123 code · 14 blank · 33 comment · 27 complexity · 747c42bc25f9315e3e28cc49ed410893 MD5 · raw file

  1. #!/bin/sh
  2. # Copyright (c) 2007-2009 Roy Marples
  3. # All rights reserved
  4. # libc subscriber for resolvconf
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. # * Redistributions of source code must retain the above copyright
  9. # notice, this list of conditions and the following disclaimer.
  10. # * Redistributions in binary form must reproduce the above
  11. # copyright notice, this list of conditions and the following
  12. # disclaimer in the documentation and/or other materials provided
  13. # with the distribution.
  14. #
  15. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  16. # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  17. # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  18. # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  19. # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  20. # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  21. # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  22. # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  23. # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  25. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. SYSCONFDIR=@SYSCONFDIR@
  27. LIBEXECDIR=@LIBEXECDIR@
  28. VARDIR=@VARDIR@
  29. IFACEDIR="$VARDIR/interfaces"
  30. NL="
  31. "
  32. # sed may not be available, and this is faster on small files
  33. key_get_value()
  34. {
  35. local key="$1" value= x= line=
  36. shift
  37. if [ $# -eq 0 ]; then
  38. while read line; do
  39. case "$line" in
  40. "$key"*) echo "${line##$key}";;
  41. esac
  42. done
  43. else
  44. for x; do
  45. while read line; do
  46. case "$line" in
  47. "$key"*) echo "${line##$key}";;
  48. esac
  49. done < "$x"
  50. done
  51. fi
  52. }
  53. # Support original resolvconf configuration layout
  54. # as well as the openresolv config file
  55. if [ -f "$SYSCONFDIR"/resolvconf.conf ]; then
  56. . "$SYSCONFDIR"/resolvconf.conf
  57. elif [ -d "$SYSCONFDIR"/resolvconf ]; then
  58. SYSCONFDIR="$SYSCONFDIR/resolvconf/resolv.conf.d"
  59. base="$SYSCONFDIR/resolv.conf.d/base"
  60. if [ -f "$base" ]; then
  61. name_servers="$(key_get_value "nameserver " "$base")"
  62. search_domains="$(key_get_value "search " "$base")"
  63. if [ -z "$search_domains" ]; then
  64. search_domains="$(key_get_value "domain " "$base")"
  65. fi
  66. resolv_conf_options="$(key_get_value "options " "$base")"
  67. fi
  68. if [ -f "$SYSCONFDIR"/resolv.conf.d/head ]; then
  69. resolv_conf_head="$(cat "${SYSCONFDIR}"/resolv.conf.d/head)"
  70. fi
  71. if [ -f "$SYSCONFDIR"/resolv.conf.d/tail ]; then
  72. resolv_conf_tail="$(cat "$SYSCONFDIR"/resolv.conf.d/tail)"
  73. fi
  74. fi
  75. : ${resolv_conf:=/etc/resolv.conf}
  76. : ${libc_service:=nscd}
  77. : ${libc_restart:=@RESTARTCMD ${libc_service}@}
  78. : ${list_resolv:=@PREFIX@/sbin/resolvconf -l}
  79. if [ "${resolv_conf_head-x}" = x -a -f "$SYSCONFDIR"/resolv.conf.head ]; then
  80. resolv_conf_head="$(cat "${SYSCONFDIR}"/resolv.conf.head)"
  81. fi
  82. if [ "${resolv_conf_tail-x}" = x -a -f "$SYSCONFDIR"/resolv.conf.tail ]; then
  83. resolv_conf_tail="$(cat "$SYSCONFDIR"/resolv.conf.tail)"
  84. fi
  85. uniqify()
  86. {
  87. local result=
  88. while [ -n "$1" ]; do
  89. case " $result " in
  90. *" $1 "*);;
  91. *) result="$result $1";;
  92. esac
  93. shift
  94. done
  95. echo "${result# *}"
  96. }
  97. case "${resolv_conf_passthrough:-NO}" in
  98. [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1)
  99. newest=
  100. for conf in "$IFACEDIR"/*; do
  101. if [ -z "$newest" -o "$conf" -nt "$newest" ]; then
  102. newest="$conf"
  103. fi
  104. done
  105. [ -z "$newest" ] && exit 0
  106. newconf="$(cat "$newest")$NL"
  107. ;;
  108. *)
  109. [ -z "$RESOLVCONF" ] && eval "$(@PREFIX@/sbin/resolvconf -v)"
  110. newsearch="$(uniqify $search_domains $SEARCH $search_domains_append)"
  111. NS="$LOCALNAMESERVERS $NAMESERVERS"
  112. newns="$(uniqify $name_servers $NS $name_servers_append)"
  113. # Hold our new resolv.conf in a variable to save on temporary files
  114. newconf="# Generated by resolvconf$NL"
  115. if [ -n "$resolv_conf_head" ]; then
  116. newconf="$newconf$resolv_conf_head$NL"
  117. fi
  118. [ -n "$newsearch" ] && newconf="${newconf}search $newsearch$NL"
  119. for n in $newns; do
  120. newconf="${newconf}nameserver $n$NL"
  121. done
  122. # Now get any configured options
  123. opts="$resolv_conf_options${resolv_conf_options:+ }"
  124. opts="$opts$($list_resolv | key_get_value "options ")"
  125. if [ -n "$opts" ]; then
  126. newconf="${newconf}options"
  127. for opt in $(uniqify $opts); do
  128. newconf="${newconf} $opt"
  129. done
  130. newconf="$newconf$NL"
  131. fi
  132. if [ -n "$resolv_conf_tail" ]; then
  133. newconf="$newconf$resolv_conf_tail$NL"
  134. fi
  135. ;;
  136. esac
  137. # Check if the file has actually changed or not
  138. if [ -e "$resolv_conf" ]; then
  139. [ "$(cat "$resolv_conf")" = "$(printf %s "$newconf")" ] && exit 0
  140. fi
  141. # Create our resolv.conf now
  142. (umask 022; echo "$newconf" >"$resolv_conf")
  143. eval $libc_restart
  144. retval=0
  145. # Notify users of the resolver
  146. for script in "$LIBEXECDIR"/libc.d/*; do
  147. if [ -f "$script" ]; then
  148. if [ -x "$script" ]; then
  149. "$script" "$@"
  150. else
  151. (. "$script" "$@")
  152. fi
  153. retval=$(($retval + $?))
  154. fi
  155. done
  156. exit $retval