aboutsummaryrefslogtreecommitdiff
path: root/libexec/rc/rc.d/ppp
blob: 93d0655b296f0e86b89ea7be694117cc02f5db0e (plain) (blame)
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
#!/bin/sh
#
# $FreeBSD$
#

# PROVIDE: ppp
# REQUIRE: netif
# KEYWORD: nojail

. /etc/rc.subr

name="ppp"
desc="Point to Point Protocol"
rcvar="ppp_enable"
command="/usr/sbin/${name}"
start_cmd="ppp_start"
stop_cmd="ppp_stop"
start_postcmd="ppp_poststart"

ppp_start_profile()
{
	local _ppp_profile _ppp_mode _ppp_nat _ppp_unit
	local _ppp_profile_cleaned _punct _punct_c

	_ppp_profile=$1
	_ppp_profile_cleaned=$1
	_punct=". - / +"
	for _punct_c in $_punct; do
		_ppp_profile_cleaned=`ltr ${_ppp_profile_cleaned} ${_punct_c} '_'`
	done

	# Check for ppp profile mode override.
	#
	eval _ppp_mode=\$ppp_${_ppp_profile_cleaned}_mode
	if [ -z "$_ppp_mode" ]; then
		_ppp_mode=$ppp_mode
	fi

	# Check for ppp profile nat override.
	#
	eval _ppp_nat=\$ppp_${_ppp_profile_cleaned}_nat
	if [ -z "$_ppp_nat" ]; then
		_ppp_nat=$ppp_nat
	fi

	# Establish ppp mode.
	#
	if [ "${_ppp_mode}" != "ddial" -a "${_ppp_mode}" != "direct" \
		-a "${_ppp_mode}" != "dedicated" \
		-a "${_ppp_mode}" != "background" ]; then
		_ppp_mode="auto"
	fi

	rc_flags="-quiet -${_ppp_mode}"

	# Switch on NAT mode?
	#
	case ${_ppp_nat} in
	[Yy][Ee][Ss])
		rc_flags="$rc_flags -nat"
		;;
	esac

	# Check for hard wired unit
	eval _ppp_unit=\$ppp_${_ppp_profile_cleaned}_unit
	if [ -n "${_ppp_unit}" ]; then
		_ppp_unit="-unit${_ppp_unit}"
	fi
	rc_flags="$rc_flags $_ppp_unit"

	# Run!
	#
	su -m $ppp_user -c "$command ${rc_flags} ${_ppp_profile}"
}

ppp_start()
{
	local _ppp_profile _p

	_ppp_profile=$*
	if [ -z "${_ppp_profile}" ]; then
		_ppp_profile=$ppp_profile
	fi

	echo -n "Starting PPP profile:"

	for _p in $_ppp_profile; do
		echo -n " $_p"
		ppp_start_profile $_p
	done

	echo "."
}

ppp_poststart()
{
	# Re-Sync ipfilter and pf so they pick up any new network interfaces
	#
	if [ -f /etc/rc.d/ipfilter ]; then
		/etc/rc.d/ipfilter quietresync
	fi
	if [ -f /etc/rc.d/pf ]; then
		/etc/rc.d/pf quietresync
	fi
}

ppp_stop_profile() {
	local _ppp_profile

	_ppp_profile=$1

	/bin/pkill -f "^${command}.*[[:space:]]${_ppp_profile}\$" || \
		echo -n "(not running)"
}

ppp_stop() {
	local _ppp_profile _p

	_ppp_profile=$*
	if [ -z "${_ppp_profile}" ]; then
		_ppp_profile=$ppp_profile
	fi

	echo -n "Stopping PPP profile:"

	for _p in $_ppp_profile; do
		echo -n " $_p"
		ppp_stop_profile $_p
	done

	echo "."
}

load_rc_config $name
run_rc_command $*