#!/bin/sh # dhcpcd client configuration script # Handy variables and functions for our hooks to use from="from" signature_base="# Generated by dhcpcd" signature="${signature_base} ${from} ${interface}" signature_base_end="# End of dhcpcd" signature_end="${signature_base_end} ${from} ${interface}" state_dir="/var/run/dhcpcd" # Ensure that all arguments are unique uniqify() { local result= while [ -n "$1" ]; do case " ${result} " in *" $1 "*);; *) result="${result}${result:+ }$1";; esac shift done echo "${result}" } # List interface config files in a dir # We may wish to control the order at some point rather than just lexical list_interfaces() { local x= interfaces= for x in "$1"/*; do [ -e "${x}" ] || continue interfaces="${interfaces}${interfaces:+ }${x##*/}" done echo "${interfaces}" } # We normally use sed to extract values using a key from a list of files # but sed may not always be available at the time. key_get_value() { local key="$1" value= x= line= shift if type sed >/dev/null 2>&1; then sed -n "s/^${key}//p" $@ else for x; do while read line; do case "${line}" in "${key}"*) echo "${line##${key}}";; esac done < "${x}" done fi } # We normally use sed to remove markers from a configuration file # but sed may not always be available at the time. remove_markers() { local m1="$1" m2="$2" x= line= in_marker=0 shift; shift if type sed >/dev/null 2>&1; then sed "/^${m1}/,/^${m2}/d" $@ else for x; do while read line; do case "${line}" in "${m1}"*) in_marker=1;; "${m2}"*) in_marker=0;; *) [ ${in_marker} = 0 ] && echo "${line}";; esac done < "${x}" done fi } # Compare two files # If different, replace first with second otherwise remove second change_file() { if type cmp >/dev/null 2>&1; then cmp -s "$1" "$2" elif type diff >/dev/null 2>&1; then diff -q "$1" "$2" >/dev/null else # Hopefully we're only working on small text files ... [ "$(cat "$1")" = "$(cat "$2")" ] fi if [ $? -eq 0 ]; then rm -f "$2" return 1 fi mv -f "$2" "$1" return 0 } # Save a config file save_conf() { if [ -f "$1" ]; then rm -f "$1"-pre."${interface}" mv -f "$1" "$1"-pre."${interface}" fi } # Restore a config file restore_conf() { [ -f "$1"-pre."${interface}" ] || return 1 rm -f "$1" mv -f "$1"-pre."${interface}" "$1" } # We source each script into this one so that scripts run earlier can # remove variables from the environment so later scripts don't see them. # Thus, the user can create their dhcpcd.enter/exit-hook script to configure # /etc/resolv.conf how they want and stop the system scripts ever updating it. for hook in \ @SYSCONFDIR@/dhcpcd.enter-hook \ @HOOKDIR@/* \ @SYSCONFDIR@/dhcpcd.exit-hook do for skip in ${skip_hooks}; do case "${hook}" in */"${skip}") continue 2;; */[0-9][0-9]"-${skip}") continue 2;; */[0-9][0-9]"-${skip}.sh") continue 2;; esac done if [ -f "${hook}" ]; then . "${hook}" fi done