Make pccard.ether working if there is already a dhclient running

Martin Blapp mb at imp.ch
Fri Aug 8 15:51:20 PDT 2003


Hi Folks, what do you think about this temporary
solution untill we have a full working dhcp client which
does the same as win XP :P ?

This patch does read the fix dhcp interfaces from
rc.conf, starts itself with the pccard interface _AND_
the system interface (if one or more exist). Then, after
removal, it kills the existing dhclient, and starts again
one from rc.conf without the pccard one.

I could fix that just easy to work with more pccards.
Currently it only works with one. And of course rc.d/dhclient
needs to be fixed to include the pccard interface if it has
been attached _before_ devd has been started.

My rc.conf config is simple:

ifconfig_sis0="DHCP"
pccard_ifconfig=DHCP
removable_interfaces="an0 wi0"

It just works great. (Btw. the IMAPI way of adding/removinf interfaces
is complety broken, and even the authors told be that it not working and
difficult to fix)

Comments ?

--- etc/pccard_ether	Thu Jun 26 04:44:08 2003
+++ /etc/pccard_ether	Sat Aug  9 00:32:06 2003
@@ -7,20 +7,48 @@
 # example: pccard_ether fxp0 start link0
 #

+. /etc/network.subr
+
+dhclient_common()
+{
+	dhcp_list="`list_net_interfaces dhcp`"
+	if [ -z "$dhcp_list" ]; then
+		return 1
+	fi
+
+        # Determine the scope of the command
+        #
+	_cooked_list="$dhcp_list"
+	if [ -n "$_cmdifn" ]; then
+	eval _cooked_list=\"`expr "$dhcp_list" : ".*\($_cmdifn\).*"`\"
+		if [ -z "$_cooked_list" ]; then
+			err "No such network interface: $_cmdifn"
+			return 1
+		fi
+	fi
+}
+
 stop_dhcp() {
 	if [ -s /var/run/dhclient.${interface}.pid ]; then
 		pidfile="/var/run/dhclient.${interface}.pid"
+		restart="/etc/rc.d/dhclient start"
 	elif [ -s /var/run/dhcpc.${interface}.pid ]; then
 		pidfile="/var/run/dhcpc.${interface}.pid"
+		restart="/etc/rc.d/dhclient start"
+	elif [ -s /var/run/dhclient.pid ]; then
+		pidfile="/var/run/dhclient.pid"
+		restart=""
 	else
 		return
 	fi
 	kill `cat ${pidfile}`
 	rm -f ${pidfile}
+	sh `$restart`
 }

 start_dhcp() {
 	stop_dhcp
+	dhclient_common
 	case ${pccard_ether_delay} in
 	[Nn][Oo])
 		;;
@@ -35,7 +63,8 @@
 			pidfile="/var/run/dhclient.${interface}.pid"
 			dhclient_flags="${dhclient_flags} -pf ${pidfile}"
 		fi
-		${dhclient_program} ${dhclient_flags} ${interface}
+		eval __cooked_list=\"`echo ${interface} $_cooked_list | tr -cs '[:alnum:]' '\n' | sort -u | tr '\n' ' '`\"
+		${dhclient_program} ${dhclient_flags} $__cooked_list
 	else
 		echo "${dhclient_program}: DHCP client software not available"
 	fi

Martin Blapp, <mb at imp.ch> <mbr at FreeBSD.org>
------------------------------------------------------------------
ImproWare AG, UNIXSP & ISP, Zurlindenstrasse 29, 4133 Pratteln, CH
Phone: +41 61 826 93 00 Fax: +41 61 826 93 01
PGP: <finger -l mbr at freebsd.org>
PGP Fingerprint: B434 53FC C87C FE7B 0A18 B84C 8686 EF22 D300 551E
------------------------------------------------------------------


More information about the freebsd-mobile mailing list