blob: a848260dd78442968dfc093ccb2dbe16b0d81b8d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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
# 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
|