I got some feedback from rpe@, which relied heavily on grep and sed and
removed $ifscandir.
The reason I build this patch the way it is is because, according to
line 27 of the original script we can't rely on /usr yet, so no grep and
sed.
Furthermore, if the $ifscandir isn't used every interface is scanned as
many times as there are hostname[.$nwid].$if files. I think waiting just
one time on a scan operation takes long enough, let alone multiple
times.
Below a new patch based on rpe@'s feedback with extra comments, minor
cleanups and extra ifconfig $if sanitizing.
On Tue, 2014-02-04 at 22:32 +0100, Martijn van Duren wrote:
> On 02/04/14 22:27, Ted Unangst wrote:
> > On Tue, Feb 04, 2014 at 22:14, Martijn van Duren wrote:
> >
> >> + # Test if we already configured the interface
> >> + test -f /tmp/$if.scan && return
> >> + touch /tmp/$if.scan
> >
> > this absolutely needs to use mktemp. It may be easier to use
> > mktemp -d and then put your files inside.
> >
>
> updated diff
>
Index: netstart
===================================================================
RCS file: /cvs/src/etc/netstart,v
retrieving revision 1.139
diff -u -r1.139 netstart
--- netstart 22 Aug 2013 07:53:11 -0000 1.139
+++ netstart 5 Feb 2014 07:14:13 -0000
@@ -12,6 +12,9 @@
done<$1
}
+# Use the filesystem to make sure every interface is parsed once
+ifscandir=`mktemp -d`
+
# Start the $1 interface
ifstart() {
if=$1
@@ -19,11 +22,52 @@
# configuring backup or temp files, and to catch the "*" case.
[[ $if != +([[:alpha:]])+([[:digit:]]) ]] && return
- file=/etc/hostname.$if
+ local file=/etc/hostname.$if nwid
+
+ # Check for ifconfig'able interface.
+ (ifconfig $if || ifconfig $if create) >/dev/null 2>&1 || return
+
+ # Test if we already configured the interface
+ test -f $ifscandir/$if.scan && return
+ touch $ifscandir/$if.scan
+
+ test -h $file rm -f $file
+
if ! [ -f $file ]; then
- echo "netstart: $file: No such file or directory"
- return
+ if ! ifconfig $if -chan -nwid -bssid -nwkey -wpakey \
+ 2> /dev/null; then
+ echo "netstart: $file: No such file or directory"
+ return
+ fi
+ ifconfig $if scan > $ifscandir/$if.scan
+ IFS_OLD=$IFS
+ IFS='
+'
+ # Test if any of the nwids has a config file
+ # Not using grep(1) and sed(1), we can't rely on having /usr yet
+ while read line; do
+ line="$line nwid "
+ line="${line#*nwid }"
+ test -z "$line" && continue;
+
+ if [[ "$line" = \"* ]]; then
+ IFS='"'
+ set -A scan -- $line
+ nwid="${scan[1]}"
+ else
+ IFS=' '
+ set -A scan -- $line
+ nwid="${scan[0]}"
+ fi
+
+ if [ -f /etc/hostname.$nwid.$if ]; then
+ ln -s /etc/hostname.$nwid.$if $file
+ break
+ fi
+ done < $ifscandir/$if.scan
+ IFS=$IFS_OLD
fi
+
# Not using stat(1), we can't rely on having /usr yet
set -A stat -- `ls -nL $file`
if [ "${stat[0]#???????} ${stat[2]} ${stat[3]}" != "--- 0 0" ]; then
@@ -31,8 +75,6 @@
chmod -LR o-rwx $file
chown -LR root.wheel $file
fi
- # Check for ifconfig'able interface.
- (ifconfig $if || ifconfig $if create) >/dev/null 2>&1 || return
# Now parse the hostname.* file
while :; do
@@ -129,8 +171,8 @@
ifmstart() {
for sif in ${1:-ALL}; do
for hn in /etc/hostname.*; do
- # Strip off /etc/hostname. prefix
- if=${hn#/etc/hostname.}
+ # Strip off /etc/hostname. and potential nwid
information
+ if=${hn##*.}
test "$if" = "*" && continue
# Skip unwanted ifs
@@ -146,6 +188,7 @@
&& ifstart $if
done
done
+ rm -rf $ifscandir
}
# Re-read /etc/rc.conf
@@ -161,6 +204,7 @@
ifstart $1
shift
done
+ rm -rf $ifscandir
return
fi