Lines 6-25
Link Here
|
6 |
# |
6 |
# |
7 |
# Sets up the dependancies for the module |
7 |
# Sets up the dependancies for the module |
8 |
pppd_depend() { |
8 |
pppd_depend() { |
9 |
after interface |
9 |
after interface |
10 |
before dhcp |
10 |
before dhcp |
11 |
provide ppp |
11 |
provide ppp |
12 |
} |
12 |
} |
13 |
|
13 |
|
14 |
# bool pppd_check_installed(void) |
14 |
# bool pppd_check_installed(void) |
15 |
# |
15 |
# |
16 |
# Returns 1 if pppd is installed, otherwise 0 |
16 |
# Returns 1 if pppd is installed, otherwise 0 |
17 |
pppd_check_installed() { |
17 |
pppd_check_installed() { |
18 |
if [[ ! -x /usr/sbin/pppd ]]; then |
18 |
if [[ ! -x /usr/sbin/pppd ]]; then |
19 |
${1:-false} && eerror "For PPP support, emerge net-dialup/ppp" |
19 |
${1:-false} && eerror "For PPP support, emerge net-dialup/ppp" |
20 |
return 1 |
20 |
return 1 |
21 |
fi |
21 |
fi |
22 |
return 0 |
22 |
return 0 |
23 |
} |
23 |
} |
24 |
|
24 |
|
25 |
# char *pppd_regex_escape(char *string) |
25 |
# char *pppd_regex_escape(char *string) |
Lines 29-53
Link Here
|
29 |
# This may be a candidate for adding to /sbin/functions.sh or |
29 |
# This may be a candidate for adding to /sbin/functions.sh or |
30 |
# net-scripts functions at some point |
30 |
# net-scripts functions at some point |
31 |
pppd_regex_escape() { |
31 |
pppd_regex_escape() { |
32 |
local escaped_result="$*" |
32 |
local escaped_result="$*" |
33 |
escaped_result=${escaped_result//\\/\\\\} |
33 |
escaped_result=${escaped_result//\\/\\\\} |
34 |
escaped_result=${escaped_result//./\\.} |
34 |
escaped_result=${escaped_result//./\\.} |
35 |
escaped_result=${escaped_result//+/\\+} |
35 |
escaped_result=${escaped_result//+/\\+} |
36 |
escaped_result=${escaped_result//(/\\(} |
36 |
escaped_result=${escaped_result//(/\\(} |
37 |
escaped_result=${escaped_result//)/\\)} |
37 |
escaped_result=${escaped_result//)/\\)} |
38 |
escaped_result=${escaped_result//[/\\[} |
38 |
escaped_result=${escaped_result//[/\\[} |
39 |
escaped_result=${escaped_result//]/\\]} |
39 |
escaped_result=${escaped_result//]/\\]} |
40 |
escaped_result=${escaped_result//\{/\\\{} |
40 |
escaped_result=${escaped_result//\{/\\\{} |
41 |
escaped_result=${escaped_result//\}/\\\}} |
41 |
escaped_result=${escaped_result//\}/\\\}} |
42 |
escaped_result=${escaped_result//\?/\\\?} |
42 |
escaped_result=${escaped_result//\?/\\\?} |
43 |
escaped_result=${escaped_result//\*/\\\*} |
43 |
escaped_result=${escaped_result//\*/\\\*} |
44 |
escaped_result=${escaped_result//\//\\/} |
44 |
escaped_result=${escaped_result//\//\\/} |
45 |
escaped_result=${escaped_result//|/\\|} |
45 |
escaped_result=${escaped_result//|/\\|} |
46 |
escaped_result=${escaped_result//&/\\&} |
46 |
escaped_result=${escaped_result//&/\\&} |
47 |
escaped_result=${escaped_result//~/\\~} |
47 |
escaped_result=${escaped_result//~/\\~} |
48 |
escaped_result=${escaped_result//^/\\^} |
48 |
escaped_result=${escaped_result//^/\\^} |
49 |
escaped_result=${escaped_result//$/\\$} |
49 |
escaped_result=${escaped_result//$/\\$} |
50 |
echo $escaped_result |
50 |
echo $escaped_result |
51 |
} |
51 |
} |
52 |
|
52 |
|
53 |
# bool pppd_update_secrets_file(char* filepath, char* username, \ |
53 |
# bool pppd_update_secrets_file(char* filepath, char* username, \ |
Lines 55-98
Link Here
|
55 |
# |
55 |
# |
56 |
# Add/update PAP/CHAP authentication information |
56 |
# Add/update PAP/CHAP authentication information |
57 |
pppd_update_secrets_file() { |
57 |
pppd_update_secrets_file() { |
58 |
local filepath="$1" username="$2" remotename="$3" password="$4" |
58 |
local filepath="$1" username="$2" remotename="$3" password="$4" |
59 |
if [[ ! -f ${filepath} ]]; then |
59 |
if [[ ! -f ${filepath} ]]; then |
60 |
touch ${filepath} && \ |
60 |
touch ${filepath} && \ |
61 |
chmod 0600 ${filepath} || \ |
61 |
chmod 0600 ${filepath} || \ |
62 |
return 1 |
62 |
return 1 |
63 |
fi |
63 |
fi |
64 |
|
|
|
65 |
#escape username and remotename, used in following sed calls |
66 |
local regex_username=$(pppd_regex_escape ${username}) |
67 |
local regex_remotename=$(pppd_regex_escape ${remotename}) |
68 |
local regex_password |
69 |
local regex_filter="[ \t]*\"?${regex_username}\"?[ \t]*\"?${regex_remotename}\"?[ \t]*" |
70 |
|
71 |
#read old password, including " chars |
72 |
#for being able to distinct when we need to add or update auth info |
73 |
local old_password=$( |
74 |
sed -r -e "/^${regex_filter}\".*\"[ \t]*\$/\ |
75 |
{s/^${regex_filter}(\".*\")[ \t]*\$/\1/;q;};\ |
76 |
d;" \ |
77 |
${filepath} |
78 |
) |
79 |
|
64 |
|
80 |
if [[ -z "${old_password}" ]]; then |
65 |
#escape username and remotename, used in following sed calls |
81 |
regex_username=${username//\\/\\\\} |
66 |
local regex_username=$(pppd_regex_escape ${username}) |
82 |
regex_remotename=${remotename//\\/\\\\} |
67 |
local regex_remotename=$(pppd_regex_escape ${remotename}) |
83 |
regex_password=${password//\\/\\\\} |
68 |
local regex_password |
84 |
regex_password=${password//"/\\"} |
69 |
local regex_filter="[ \t]*\"?${regex_username}\"?[ \t]*\"?${regex_remotename}\"?[ \t]*" |
85 |
sed -r -i -e "\$a\"${regex_username}\" ${regex_remotename} \"${regex_password}\"" ${filepath} |
70 |
|
86 |
vewarn "Authentication info has been added to ${filepath}" |
71 |
#read old password, including " chars |
87 |
elif [[ "\"${password//\"/\\\"}\"" != "${old_password}" ]]; then |
72 |
#for being able to distinct when we need to add or update auth info |
88 |
regex_password=${password//\\/\\\\} |
73 |
local old_password=$( |
89 |
regex_password=${regex_password//\//\\/} |
74 |
sed -r -e "/^${regex_filter}\".*\"[ \t]*\$/\ |
90 |
regex_password=${regex_password//&/\\&} |
75 |
{s/^${regex_filter}(\".*\")[ \t]*\$/\1/;q;};\ |
91 |
regex_password=${regex_password//\"/\\\\\"} |
76 |
d;" \ |
92 |
sed -r -i -e "s/^(${regex_filter}\").*(\"[ \t]*)\$/\1${regex_password}\2/" ${filepath} |
77 |
${filepath} |
93 |
vewarn "Authentication info has been updated in ${filepath}" |
78 |
) |
94 |
fi |
79 |
|
95 |
return 0 |
80 |
if [[ -z "${old_password}" ]]; then |
|
|
81 |
regex_username=${username//\\/\\\\} |
82 |
regex_remotename=${remotename//\\/\\\\} |
83 |
regex_password=${password//\\/\\\\} |
84 |
regex_password=${password//"/\\"} |
85 |
sed -r -i -e "\$a\"${regex_username}\" ${regex_remotename} \"${regex_password}\"" ${filepath} |
86 |
vewarn "Authentication info has been added to ${filepath}" |
87 |
elif [[ "\"${password//\"/\\\"}\"" != "${old_password}" ]]; then |
88 |
regex_password=${password//\\/\\\\} |
89 |
regex_password=${regex_password//\//\\/} |
90 |
regex_password=${regex_password//&/\\&} |
91 |
regex_password=${regex_password//\"/\\\\\"} |
92 |
sed -r -i -e "s/^(${regex_filter}\").*(\"[ \t]*)\$/\1${regex_password}\2/" ${filepath} |
93 |
vewarn "Authentication info has been updated in ${filepath}" |
94 |
fi |
95 |
return 0 |
96 |
} |
96 |
} |
97 |
|
97 |
|
98 |
# bool pppd_start(char *iface) |
98 |
# bool pppd_start(char *iface) |
Lines 101-240
Link Here
|
101 |
# |
101 |
# |
102 |
# Returns 0 (true) when successful, otherwise 1 |
102 |
# Returns 0 (true) when successful, otherwise 1 |
103 |
pppd_start() { |
103 |
pppd_start() { |
104 |
local iface="$1" ifvar=$( bash_variable "$1" ) opts="" link |
104 |
${IN_BACKGROUND} && return 0 |
105 |
if [[ ${iface%%[0-9]*} != "ppp" ]]; then |
|
|
106 |
eerror "PPP can only be invoked from net.ppp[0-9]" |
107 |
return 1 |
108 |
fi |
109 |
|
105 |
|
110 |
local unit="${iface#ppp}" |
106 |
local iface="$1" ifvar=$( bash_variable "$1" ) opts="" link |
111 |
if [[ -z ${unit} ]] ; then |
107 |
if [[ ${iface%%[0-9]*} != "ppp" ]]; then |
112 |
eerror "PPP requires a unit - use net.ppp[0-9] instead of net.ppp" |
108 |
eerror "PPP can only be invoked from net.ppp[0-9]" |
113 |
return 1 |
109 |
return 1 |
114 |
fi |
110 |
fi |
115 |
|
111 |
|
116 |
# PPP requires a link to communicate over - normally a serial port |
112 |
local unit="${iface#ppp}" |
117 |
# PPPoE communicates over ethernet |
113 |
if [[ -z ${unit} ]] ; then |
118 |
# PPPoA communictes over ATM |
114 |
eerror "PPP requires a unit - use net.ppp[0-9] instead of net.ppp" |
119 |
# In all cases, the link needs to be available before we start PPP |
115 |
return 1 |
120 |
eval link=\"\$\{link_${ifvar}\}\" |
116 |
fi |
121 |
if [[ -z ${link} ]]; then |
|
|
122 |
eerror "link_${ifvar} has not been set in /etc/conf.d/net" |
123 |
return 1 |
124 |
fi |
125 |
|
117 |
|
126 |
# Might or might not be set in conf.d/net |
118 |
# PPP requires a link to communicate over - normally a serial port |
127 |
local user password i |
119 |
# PPPoE communicates over Ethernet |
128 |
eval username=\"\$\{username_${ifvar}\}\" |
120 |
# PPPoA communicates over ATM |
129 |
eval password=\"\$\{password_${ifvar}\}\" |
121 |
# In all cases, the link needs to be available before we start PPP |
|
|
122 |
eval link=\"\$\{link_${ifvar}\}\" |
123 |
if [[ -z ${link} ]]; then |
124 |
eerror "link_${ifvar} has not been set in /etc/conf.d/net" |
125 |
return 1 |
126 |
fi |
130 |
|
127 |
|
131 |
#Add/update info in PAP/CHAP secrets files |
128 |
# Might or might not be set in conf.d/net |
132 |
if [[ -n ${username} && -n ${password} ]]; then |
129 |
local user password i |
133 |
for i in chap pap ; do |
130 |
eval username=\"\$\{username_${ifvar}\}\" |
134 |
if ! pppd_update_secrets_file "/etc/ppp/${i}-secrets" \ |
131 |
eval password=\"\$\{password_${ifvar}\}\" |
135 |
"${username}" "${iface}" "${password}" ; then |
|
|
136 |
eerror "Failed to update /etc/ppp/${i}-secrets" |
137 |
return 1 |
138 |
fi |
139 |
done |
140 |
fi |
141 |
|
132 |
|
142 |
# Load any commandline options |
133 |
#Add/update info in PAP/CHAP secrets files |
143 |
eval opts=\"\$\{pppd_${ifvar}\[@\]}\" |
134 |
if [[ -n ${username} && -n ${password} ]]; then |
|
|
135 |
for i in chap pap ; do |
136 |
if ! pppd_update_secrets_file "/etc/ppp/${i}-secrets" \ |
137 |
"${username}" "${iface}" "${password}" ; then |
138 |
eerror "Failed to update /etc/ppp/${i}-secrets" |
139 |
return 1 |
140 |
fi |
141 |
done |
142 |
fi |
144 |
|
143 |
|
145 |
# We don't work if unit, no detach or linkname is set. |
144 |
# Load any commandline options |
146 |
for i in unit nodetach linkname ; do |
145 |
eval opts=\"\$\{pppd_${ifvar}\[@\]}\" |
147 |
if [[ " ${opts} " == *" ${i} "* ]]; then |
|
|
148 |
eerror "The option \"${i}\" is not allowed" |
149 |
return 1 |
150 |
fi |
151 |
done |
152 |
|
146 |
|
153 |
# Check for mtu/mru |
147 |
# We don't work with these options set by the user |
154 |
local mtu |
148 |
for i in unit nodetach linkname maxfail persist ; do |
155 |
eval mtu=\"\$\{mtu_${ifvar}\}\" |
149 |
if [[ " ${opts} " == *" ${i} "* ]]; then |
156 |
if [[ -n ${mtu} ]]; then |
150 |
eerror "The option \"${i}\" is not allowed" |
157 |
[[ " ${opts} " != *" mtu "* ]] && opts="${opts} mtu ${mtu}" |
151 |
return 1 |
158 |
[[ " ${opts} " != *" mru "* ]] && opts="${opts} mru ${mtu}" |
152 |
fi |
159 |
fi |
153 |
done |
160 |
|
154 |
|
161 |
# Set linkname because we need /var/run/ppp-${linkname}.pid |
155 |
# Check for mtu/mru |
162 |
# This pidfile has the advantage of being there, even if ${iface} interface was never started |
156 |
local mtu |
163 |
opts="linkname ${iface} ${opts}" |
157 |
eval mtu=\"\$\{mtu_${ifvar}\}\" |
|
|
158 |
if [[ -n ${mtu} ]]; then |
159 |
[[ " ${opts} " != *" mtu "* ]] && opts="${opts} mtu ${mtu}" |
160 |
[[ " ${opts} " != *" mru "* ]] && opts="${opts} mru ${mtu}" |
161 |
fi |
164 |
|
162 |
|
165 |
# Setup auth info |
163 |
# Set linkname because we need /var/run/ppp-${linkname}.pid |
166 |
[[ -n ${username} ]] && opts="user \"${username}\" ${opts}" |
164 |
# This pidfile has the advantage of being there, even if ${iface} interface was never started |
167 |
opts="remotename ${iface} ${opts}" |
165 |
opts="linkname ${iface} ${opts}" |
168 |
|
166 |
|
169 |
# Load a custom interface configuration file if it exists |
167 |
# Setup auth info |
170 |
[[ -f "/etc/ppp/options.${iface}" ]] \ |
168 |
[[ -n ${username} ]] && opts="user '"${username}"' ${opts}" |
171 |
&& opts="${opts} file /etc/ppp/options.${iface}" |
169 |
opts="remotename ${iface} ${opts}" |
172 |
|
170 |
|
173 |
# Set forced options |
171 |
# Load a custom interface configuration file if it exists |
174 |
opts="unit ${unit} persist maxfail 0 ${opts}" |
172 |
[[ -f "/etc/ppp/options.${iface}" ]] \ |
|
|
173 |
&& opts="${opts} file /etc/ppp/options.${iface}" |
175 |
|
174 |
|
176 |
# Setup connect script |
175 |
# Set forced options |
177 |
local -a chat |
176 |
opts="unit ${unit} persist maxfail 0 ${opts}" |
178 |
eval chat=( \"\$\{chat_${ifvar}\[@\]\}\" ) |
|
|
179 |
if [[ -n "${chat[@]}" ]]; then |
180 |
opts="${opts} connect \"/usr/sbin/chat -e -E -v" |
181 |
|
177 |
|
182 |
local -a phone_number |
178 |
# Setup connect script |
183 |
eval phone_number=( \"\$\{phone_number_${ifvar}\}\" ) |
179 |
local -a chat |
184 |
if [[ ${#phone_number[@]} -ge 1 ]]; then |
180 |
eval chat=( \"\$\{chat_${ifvar}\[@\]\}\" ) |
185 |
opts="${opts} -T '${phone_number[0]}'" |
181 |
if [[ -n "${chat[@]}" ]]; then |
186 |
if [[ ${#phone_number[@]} -ge 2 ]]; then |
182 |
opts="${opts} connect \"/usr/sbin/chat -e -E -v" |
187 |
opts="${opts} -U '${phone_number[1]}'" |
|
|
188 |
fi |
189 |
fi |
190 |
|
183 |
|
191 |
for (( i=0; i<${#chat[@]}; i++ )); do |
184 |
local -a phone_number |
192 |
opts="${opts} '${chat[i]}'" |
185 |
eval phone_number=( \"\$\{phone_number_${ifvar}\}\" ) |
193 |
done |
186 |
if [[ ${#phone_number[@]} -ge 1 ]]; then |
|
|
187 |
opts="${opts} -T '${phone_number[0]}'" |
188 |
if [[ ${#phone_number[@]} -ge 2 ]]; then |
189 |
opts="${opts} -U '${phone_number[1]}'" |
190 |
fi |
191 |
fi |
194 |
|
192 |
|
195 |
opts="${opts}\"" |
193 |
for (( i=0; i<${#chat[@]}; i++ )); do |
196 |
fi |
194 |
opts="${opts} '${chat[i]}'" |
|
|
195 |
done |
197 |
|
196 |
|
198 |
# Add plugins |
197 |
opts="${opts}\"" |
199 |
local -a plugins |
198 |
fi |
200 |
eval plugins=( \"\$\{plugins_${ifvar}\[@\]\}\" ) |
|
|
201 |
if [[ -n "${plugins[@]}" ]]; then |
202 |
for (( i=0; i<${#plugins[@]}; i++ )); do |
203 |
local -a plugin=( ${plugins[i]} ) |
204 |
# Bound to be some users who do this |
205 |
[[ ${plugin[0]} == "pppoe" ]] && plugin[0]="rp-pppoe" |
206 |
[[ ${plugin[0]} == "pppoa" ]] && plugin[0]="pppoatm" |
207 |
[[ ${plugin[0]} == "capi" ]] && plugin[0]="capiplugin" |
208 |
|
199 |
|
209 |
[[ ${plugin[0]} == "rp-pppoe" ]] && opts="${opts} connect true" |
200 |
# Add plugins |
210 |
opts="${opts} plugin ${plugin[0]}.so ${plugin[@]:1}" |
201 |
local -a plugins |
211 |
[[ ${plugin[0]} == "rp-pppoe" ]] && opts="${opts} ${link}" |
202 |
eval plugins=( \"\$\{plugins_${ifvar}\[@\]\}\" ) |
212 |
done |
203 |
if [[ -n "${plugins[@]}" ]]; then |
213 |
fi |
204 |
for (( i=0; i<${#plugins[@]}; i++ )); do |
|
|
205 |
local -a plugin=( ${plugins[i]} ) |
206 |
# Bound to be some users who do this |
207 |
[[ ${plugin[0]} == "pppoe" ]] && plugin[0]="rp-pppoe" |
208 |
[[ ${plugin[0]} == "pppoa" ]] && plugin[0]="pppoatm" |
209 |
[[ ${plugin[0]} == "capi" ]] && plugin[0]="capiplugin" |
214 |
|
210 |
|
215 |
#Specialized stuff. Insert here actions particular to connection type (pppoe,pppoa,capi) |
211 |
[[ ${plugin[0]} == "rp-pppoe" ]] && opts="${opts} connect true" |
216 |
local insert_link_in_opts=1 |
212 |
opts="${opts} plugin ${plugin[0]}.so ${plugin[@]:1}" |
217 |
if [[ " ${opts} " == *" plugin rp-pppoe.so "* ]]; then |
213 |
[[ ${plugin[0]} == "rp-pppoe" ]] && opts="${opts} ${link}" |
218 |
# Ensure that the link exists and is up |
214 |
done |
219 |
interface_exists "${link}" true || return 1 |
215 |
fi |
220 |
interface_up "${link}" |
|
|
221 |
|
216 |
|
222 |
# Load the pppoe kernel module - if this fails, we have to hope |
217 |
#Specialized stuff. Insert here actions particular to connection type (pppoe,pppoa,capi) |
223 |
# that pppoe support is compiled into the kernel |
218 |
local insert_link_in_opts=1 |
224 |
modprobe pppoe 2>/dev/null |
219 |
if [[ " ${opts} " == *" plugin rp-pppoe.so "* ]]; then |
|
|
220 |
if [[ ! -e /proc/net/pppoe ]]; then |
221 |
# Load the PPPoE kernel module |
222 |
if ! modprobe pppoe ; then |
223 |
eerror "kernel does not support PPPoE" |
224 |
return 1 |
225 |
fi |
226 |
fi |
225 |
|
227 |
|
226 |
insert_link_in_opts=0 |
228 |
# Ensure that the link exists and is up |
227 |
fi |
229 |
interface_exists "${link}" true || return 1 |
228 |
[[ ${insert_link_in_opts} -eq 0 ]] || opts="${link} ${opts}" |
230 |
interface_up "${link}" |
229 |
|
|
|
230 |
ebegin "Running pppd" |
231 |
i=$( eval /usr/sbin/pppd ${opts} 2>&1 ) |
232 |
eend $? "${i}" || return 1 |
233 |
|
231 |
|
234 |
if [[ " ${opts} " == *" updetach "* ]]; then |
232 |
insert_link_in_opts=0 |
235 |
local addr=$( interface_get_address "${iface}" ) |
233 |
fi |
236 |
einfo "${iface} received address ${addr}" |
234 |
|
237 |
fi |
235 |
if [[ " ${opts} " == *" plugin pppoatm.so "* ]]; then |
|
|
236 |
if [[ ! -d /proc/net/atm ]]; then |
237 |
# Load the PPPoA kernel module |
238 |
if ! modprobe pppoatm ; then |
239 |
eerror "kernel does not support PPPoATM" |
240 |
return 1 |
241 |
fi |
242 |
fi |
243 |
fi |
244 |
[[ ${insert_link_in_opts} -eq 0 ]] || opts="${link} ${opts}" |
245 |
|
246 |
ebegin "Running pppd" |
247 |
mark_service_inactive "net.${iface}" |
248 |
local quiet="--quiet" |
249 |
[[ ${RC_VERBOSE} == "yes" ]] && quiet="" |
250 |
start-stop-daemon --start ${quiet} --exec /usr/sbin/pppd \ |
251 |
--pidfile "/var/run/ppp-${iface}.pid" -- ${opts} |
252 |
eend $? || mark_service_starting "net.${iface}" && return 1 |
253 |
|
254 |
if [[ " ${opts} " == *" updetach "* ]]; then |
255 |
local addr=$( interface_get_address "${iface}" ) |
256 |
einfo "${iface} received address ${addr}" |
257 |
fi |
258 |
|
259 |
# pppd will call ip-up which will re-call us, so we always |
260 |
# background at this point |
261 |
einfo "Backgrounding ..." |
262 |
exit 0 |
238 |
} |
263 |
} |
239 |
|
264 |
|
240 |
# bool pppd_stop(char *iface) |
265 |
# bool pppd_stop(char *iface) |
Lines 244-258
Link Here
|
244 |
# Returns 0 (true) if no process to kill or it terminates successfully, |
269 |
# Returns 0 (true) if no process to kill or it terminates successfully, |
245 |
# otherwise non-zero (false) |
270 |
# otherwise non-zero (false) |
246 |
pppd_stop() { |
271 |
pppd_stop() { |
247 |
local iface="$1" pidfile="/var/run/ppp-$1.pid" |
272 |
${IN_BACKGROUND} && return 0 |
|
|
273 |
local iface="$1" pidfile="/var/run/ppp-$1.pid" |
248 |
|
274 |
|
249 |
[[ ! -s ${pidfile} ]] && return 0 |
275 |
[[ ! -s ${pidfile} ]] && return 0 |
250 |
|
276 |
|
251 |
local pid |
277 |
einfo "Stopping pppd on ${iface}" |
252 |
read pid <"${pidfile}" #PID is the first line of the pidfile |
278 |
start-stop-daemon --stop --exec /usr/sbin/pppd --pidfile "${pidfile}" |
253 |
einfo "Stopping pppd on ${iface}" |
279 |
eend $? |
254 |
kill -s TERM "${pid}" |
|
|
255 |
process_finished "${pid}" /usr/sbin/pppd |
256 |
|
257 |
eend $? |
258 |
} |
280 |
} |
|
|
281 |
|
282 |
# vim: ts=4 |