auto import from //depot/cupcake/@135843
diff --git a/dhcpcd-run-hooks.in b/dhcpcd-run-hooks.in
new file mode 100644
index 0000000..1e5d5b3
--- /dev/null
+++ b/dhcpcd-run-hooks.in
@@ -0,0 +1,138 @@
+#!/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
+# It 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