Release openresolv-1.7
[openresolv] / libc.in
diff --git a/libc.in b/libc.in
index 8d6f9ae8d1e8f148ec6cfc0795f2ee30dd36cad4..165cbdb64be9a37525f122bf09da50fd7a52ba4d 100755 (executable)
--- a/libc.in
+++ b/libc.in
@@ -34,27 +34,49 @@ SYSCONFDIR=@SYSCONFDIR@
 RESOLVCONFS="$(resolvconf -l)"
 BASE="${SYSCONFDIR}/resolv.conf.d/base"
 
-uniqify() {
+uniqify()
+{
     local result=
     while [ -n "$1" ]; do
                case " ${result} " in
-                       *" $1 "*);;
-                       *) result="${result} $1";;
+               *" $1 "*);;
+               *) result="${result} $1";;
                esac
                shift
        done
     echo "${result# *}"
 }
 
+# sed may not be available, and this is faster on small files
+key_get_value()
+{
+       local key="$1" value= x= line=
+
+       shift
+       if [ $# -eq 0 ]; then
+               while read line; do
+                       case "${line}" in
+                       "${key}"*) echo "${line##${key}}";;
+                       esac
+               done
+       else
+               for x; do
+                       while read line; do
+                               case "${line}" in
+                               "${key}"*) echo "${line##${key}}";;
+                               esac
+                       done < "${x}"
+               done
+       fi
+}
+
 OUR_NS=
 if [ -e "${BASE}" ]; then
-       OUR_NS="$(sed -n -e 's/^[[:space:]]*nameserver[[:space:]]*//p' "${BASE}")"
+       OUR_NS="$(key_get_value "nameserver " "${BASE}")"
 fi
 OUR_NS="$(uniqify \
        ${OUR_NS} \
-       $(echo "${RESOLVCONFS}" \
-       | sed -n -e 's/^[[:space:]]*nameserver[[:space:]]*//p') \
-)"
+       $(echo "${RESOLVCONFS}" | key_get_value "nameserver "))"
 
 # libc only allows for 3 nameservers
 # truncate after 127 as well
@@ -78,23 +100,25 @@ done
 OUR_SEARCH=
 if ${LOCALH}; then
        if [ -e "${BASE}" ]; then
-               OUR_SEARCH="$(sed -n -e 's/^[[:space:]]*search[[:space:]]*//p' "${BASE}")"
+               OUR_SEARCH="$(key_get_value "search " "${BASE}")"
        fi
-       OUR_SEARCH="${OUR_SEARCH} $(echo "${RESOLVCONFS}" \
-               | sed -n 's/^[[:space:]]*search[[:space:]]*//p')"
+       RESS="$(echo "${RESOLVCONFS}" | key_get_value "search ")"
+       OUR_SEARCH="${OUR_SEARCH} ${RESS}"
        if [ -e "${BASE}" ]; then
-               OUR_SEARCH="${OUR_SEARCH} $(sed -n -e 's/^[[:space:]]*domain[[:space:]]*//p' "${BASE}")"
+               RESD="$(key_get_value "domain " "${BASE}")"
+               OUR_SEARCH="${OUR_SEARCH} ${RESD}"
        fi
-       OUR_SEARCH="${OUR_SEARCH} $( echo "${RESOLVCONFS}" \
-               | sed -n -e 's/^[[:space:]]*domain[[:space:]]*//p')"
+       RESD="$(echo "${RESOLVCONFS}" | key_get_value "domain ")"
+       OUR_SEARCH="${OUR_SEARCH} ${RESD}"
 else
        if [ -e "${BASE}" ]; then
-               OUR_SEARCH="$(sed -n -e 's/^[[:space:]]*search[[:space:]]*//p' \
-                       -e 's/^[[:space:]]*domain[[:space:]]*//p' "${BASE}")"
+               RESS="$(key_get_value "search " "${BASE}")"
+               RESD="$(key_get_value "domain " "${BASE}")"
+               OUR_SEARCH="${RESS} ${RESD}"
        fi
-       OUR_SEARCH="${OUR_SEARCH} $(echo "${RESOLVCONFS}" \
-               | sed -n -e 's/^[[:space:]]*search[[:space:]]*//p' \
-                       -e 's/^[[:space:]]*domain[[:space:]]*//p')"
+       RESS="$(echo "${RESOLVCONFS}" | key_get_value "search ")"
+       RESD="$(echo "${RESOLVCONFS}" | key_get_value "domain ")"
+       OUR_SEARCH="${OUR_SEARCH} ${RESS} ${RESD}"
 fi
 
 # libc only allows for 6 search domains 
@@ -116,22 +140,20 @@ for N in ${NS}; do
        NEWCONF="${NEWCONF}nameserver ${N}\n"
 done
 
-# Now dump everything else from our resolvs
+# Now get any configured options
+OPTS=
 if [ -e "${BASE}" ]; then
-       NEWCONF="${NEWCONF}$(sed -e '/^[[:space:]]*$/d' \
-               -e '/^[[:space:]]*nameserver[[:space:]]*.*/d' \
-               -e '/^[[:space:]]*search[[:space:]]*.*/d' \
-               -e '/^[[:space:]]*domain[[:space:]]*.*/d' \
-               "${BASE}")\n" 
+       OPTS="$(key_get_value "options " "${BASE}")"
+fi
+OPTS="${OPTS}${OPTS:+ }$(echo ${RESOLVCONFS} | key_get_value "options ")"
+if [ -n "${OPTS}" ]; then
+       NEWCONF="${NEWCONF}options"
+       for OPT in $(uniqify ${OPTS}); do
+               NEWCONF="${NEWCONF} ${OPT}"
+       done
+       NEWCONF="${NEWCONF}\n"
 fi
 
-# We don't know we're using GNU sed, so we do it like this
-NEWCONF="${NEWCONF}$(echo "${RESOLVCONFS}" | sed -e '/^[[:space:]]*$/d' \
-       -e '/^[[:space:]]*#/d' \
-       -e '/^[[:space:]]*nameserver[[:space:]]*.*/d' \
-       -e '/^[[:space:]]*search[[:space:]]*.*/d' \
-       -e '/^[[:space:]]*domain[[:space:]]*.*/d' \
-       )"
 [ -e "${SYSCONFDIR}"/resolv.conf.d/tail ] \
        && NEWCONF="${NEWCONF}$(cat "${SYSCONFDIR}"/resolv.conf.d/tail)\n"