pccard_ether revision 126646
1#!/bin/sh -
2#
3# $FreeBSD: head/etc/pccard_ether 126646 2004-03-05 08:49:59Z rse $
4#
5# pccard_ether interfacename [start|stop] [ifconfig option]
6#
7# example: pccard_ether fxp0 start link0
8#
9
10. /etc/network.subr
11
12stop_dhcp() {
13	# If dhclient is already running, record
14	# its interfaces.
15	if [ -x /usr/bin/grep ]; then
16		eval _active_list=\"`/bin/ps -axwww | \
17			/usr/bin/grep dhclient | \
18			/usr/bin/grep -v grep | \
19			/usr/bin/sed -e 's|^.*dhclient||' | \
20			/usr/bin/awk '{for (i=1;i<=NF;i++) \
21				{ if ($i~/[a-zA-Z].[0-9]$/) \
22				{ printf(" %s",$i) } }}'` \
23			\"
24	fi
25
26	# Get the rc.conf list of dhcp configured interfaces
27	static_dhcp_list="`list_net_interfaces dhcp`"
28
29	# Get the current ifconfig list of interfaces
30	_aprefix=
31	_nlist=
32	for _if in ${_active_list} ; do
33		_test_if=`ifconfig ${_if} 2>&1`
34		case "$_test_if" in
35		"ifconfig: interface $_if does not exist")
36			;;
37		${interface})
38			# Don't record the same device twice.
39			;;
40		*)
41			#
42			# Catch devices which were specified before,
43			# but have not been part of the rc. We need
44			# them again for the restart.
45			#
46			for _cif in ${static_dhcp_list} ; do
47				case "$_cif" in
48				${_if})
49					# Nothing to add
50					;;
51				*)
52					# Found interface beside rc.conf
53					_nlist="${_nlist}${_aprefix}${_if}"
54					;;
55				esac
56			done
57			_dhcplist="${_dhcplist}${_aprefix}${_if}"
58			[ -z "$_aprefix" ] && _aprefix=' '
59			;;
60		esac
61	done
62
63	if [ -s /var/run/dhclient.pid ]; then
64		pidfile="/var/run/dhclient.pid"
65	else
66		return
67	fi
68	/sbin/dhclient -r ${interface}
69	rm -f ${pidfile}
70	case ${startstop} in
71	[Ss][Tt][Oo][Pp])
72		if [ -z "${_nlist}" ]; then
73			sh `/etc/rc.d/dhclient start`
74		else
75			start_dhcp_keep_current
76		fi
77		;;
78	*)
79		;;
80	esac
81}
82
83start_dhcp() {
84	stop_dhcp
85	case ${pccard_ether_delay} in
86	[Nn][Oo])
87		;;
88	[0-9]*)
89		sleep ${pccard_ether_delay}
90		;;
91        esac
92	[ -n "$dhcp_program" ] && dhclient_program="$dhcp_program"
93	[ -n "$dhcp_flags" ] && dhclient_flags="$dhcp_flags"
94	if [ -x "${dhclient_program}" ]; then
95		interfaces=`echo $_dhcplist ${interface} | xargs -n 1 echo | sort -u`
96		${dhclient_program} ${dhclient_flags}  ${interfaces}
97	else
98		echo "${dhclient_program}: DHCP client software not available"
99	fi
100}
101
102# Called after detaching a card, if dhclient has been
103# used for more than one interface.
104start_dhcp_keep_current() {
105	[ -n "$dhcp_program" ] && dhclient_program="$dhcp_program"
106	[ -n "$dhcp_flags" ] && dhclient_flags="$dhcp_flags"
107	if [ -x "${dhclient_program}" ]; then
108		${dhclient_program} ${dhclient_flags} \
109			${_dhcplist}
110	else
111		echo "${dhclient_program}: DHCP client software not available"
112	fi
113}
114
115# Suck in the configuration variables
116#
117if [ -r /etc/defaults/rc.conf ]; then
118	. /etc/defaults/rc.conf
119	source_rc_confs
120elif [ -r /etc/rc.conf ]; then
121	. /etc/rc.conf
122fi
123
124interface=$1
125shift
126startstop=$1
127shift
128
129case ${pccard_ifconfig} in
130[Nn][Oo] | '')
131	expr "${removable_interfaces}" : ".*${interface}" > /dev/null || exit 0
132	;;
133*)
134	# Backward compatible
135	eval ifconfig_${interface}=\${pccard_ifconfig}
136	;;
137esac
138
139case ${startstop} in
140[Ss][Tt][Aa][Rr][Tt] | '')
141	if [ -x /usr/bin/grep ]; then
142		if ifconfig ${interface} | grep -s netmask > /dev/null 2>&1; then
143		    # Interface is already up, so ignore it.
144		    exit 0
145		fi
146	fi
147
148	if [ -r /etc/start_if.${interface} ]; then
149		. /etc/start_if.${interface}
150	fi
151
152	eval ifconfig_args=\$ifconfig_${interface}
153	case ${ifconfig_args} in
154	[Nn][Oo] | '')
155		;;
156	[Dd][Hh][Cc][Pp])
157		# Start up the DHCP client program
158		start_dhcp
159		;;
160	*)
161		# Do the primary ifconfig if specified
162		ifconfig ${interface} ${ifconfig_args} $*
163
164		# Check to see if aliases need to be added
165		alias=0
166		while :
167		do
168			eval ifx_args=\$ifconfig_${interface}_alias${alias}
169			if [ -n "${ifx_args}" ]; then
170				ifconfig ${interface} ${ifx_args} alias
171				alias=`expr ${alias} + 1`
172			else
173				break;
174			fi
175		done
176
177		# Do ipx address if specified
178		eval ifx_args=\$ifconfig_${interface}_ipx
179		if [ -n "${ifx_args}" ]; then
180			ifconfig ${interface} ${ifx_args}
181		fi
182
183		# Add default route into $static_routes
184		case ${defaultrouter} in
185		[Nn][Oo] | '')
186		        ;;
187		*)
188			static_routes="default ${static_routes}"
189			route_default="default ${defaultrouter}"
190			;;
191		esac
192
193		# Add private route for this interface into $static_routes
194		eval ifx_routes=\$static_routes_${interface}
195		if [ -n "${ifx_routes}" ]; then
196			static_routes="${ifx_routes} ${static_routes}"
197		fi
198
199		# Set up any static routes if specified
200		if [ -n "${static_routes}" ]; then
201			for i in ${static_routes}; do
202				eval route_args=\$route_${i}
203				route add ${route_args}
204			done
205		fi
206		;;
207	esac
208
209	# IPv6 setup
210	case ${ipv6_enable} in
211	[Yy][Ee][Ss])
212		if [ -r /etc/network.subr ]; then
213			. /etc/network.subr
214			network6_interface_setup ${interface}
215		fi
216		;;
217	esac
218	;;
219# Stop the interface
220*)
221	if [ -r /etc/stop_if.${interface} ]; then
222		. /etc/stop_if.${interface}
223	fi
224
225	eval ifconfig_args=\$ifconfig_${interface}
226	case ${ifconfig_args} in
227	[Nn][Oo] | '')
228	        ;;
229	[Dd][Hh][Cc][Pp])
230		# Stop the DHCP client for this interface
231		stop_dhcp
232		;;
233	*)
234		# Delete static route if specified
235		eval ifx_routes=\$static_routes_${interface}
236		if [ -n "${ifx_routes}" ]; then
237			for i in ${ifx_routes}; do
238				eval route_args=\$route_${i}
239				route delete ${route_args}
240			done
241		fi
242
243		# Delete aliases if exist
244		alias=0
245		while :
246		do
247			eval ifx_args=\$ifconfig_${interface}_alias${alias}
248			if [ -n "${ifx_args}" ]; then
249				ifconfig ${interface} ${ifx_args} alias delete
250				alias=`expr ${alias} + 1`
251			else
252				break;
253			fi
254		done
255		;;
256	esac
257
258	# Remove the network interface and cleaning ARP table
259	ifconfig ${interface} delete
260	arp -d -a
261
262	# Clean the routing table
263	case ${removable_route_flush} in
264	[Nn][Oo])
265	        ;;
266	*)	
267		# flush beforehand, just in case....
268		route -n flush -inet
269		;;
270	esac
271	;;
272esac
273