From d0c9d92192a208a4f76ffd7a9e2a580a48698c50 Mon Sep 17 00:00:00 2001 From: Jakub Jankowski Date: Tue, 21 Nov 2017 03:57:16 +0100 Subject: rc.inet1: Check for iface in /sys/class/net, not /proc/net/dev There is a slight problem with things like grep lo: /proc/net/dev especially with tun/tap devices with can have arbitrary names. Consider a scenario where you name your tap iface "trololo": $ grep -c lo: /proc/net/dev 2 $ To fix this (quite hypothetical, but still) problem, instead of simple grepping in /proc/net/dev, check of sysfs path existence (/sys/class/net/). Same fix in if_up() and if_down() for non-loopback interfaces. While there, also strip colon-whatever from interface name (what I think was the original idea behind a construct like grep $(echo ${1}: | cut -f 1 -d :): /proc/net/dev) by using parameter expansion: ${1%%:*} will remove the longest suffix matching ":*", ie. colon-and-everything-after. This is supported by POSIX: http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html Alternative solution would be to change the grep pattern to grep '^ *lo:' /proc/net/dev Signed-off-by: Robby Workman --- rc.inet1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rc.inet1 b/rc.inet1 index 84c39c0..f5ff7b6 100644 --- a/rc.inet1 +++ b/rc.inet1 @@ -55,7 +55,7 @@ debug_log "List of interfaces: '${IFNAME[*]}'" # Function to bring up the loopback interface. If loopback is # already up, do nothing. lo_up() { - if grep lo: /proc/net/dev 1> /dev/null ; then + if [ -e /sys/class/net/lo ]; then if ! /sbin/ip link show dev lo | grep -wq -e "state UP" -e "state UNKNOWN" ; then echo "/etc/rc.d/rc.inet1: /sbin/ip address add 127.0.0.1/8 dev lo" | $LOGGER /sbin/ip address add 127.0.0.1/8 dev lo @@ -68,7 +68,7 @@ lo_up() { # Function to take down the loopback interface: lo_down() { - if grep lo: /proc/net/dev 1> /dev/null ; then + if [ -e /sys/class/net/lo ]; then echo "/etc/rc.d/rc.inet1: /sbin/ip link set dev lo down" | $LOGGER /sbin/ip link set dev lo down fi @@ -148,13 +148,13 @@ if_up() { debug_log "skipping ${1} early, interface is not configured in /etc/rc.d/rc.inet1.conf" return 0 fi - if ! grep $(echo ${1}: | cut -f 1 -d :): /proc/net/dev 1> /dev/null ; then # no interface yet + if [ ! -e /sys/class/net/${1%%:*} ]; then # no interface yet if /sbin/modprobe -c | grep -v "^#" | grep -w "alias ${1}" | grep -vw "alias ${1} off" > /dev/null ; then echo "/etc/rc.d/rc.inet1: /sbin/modprobe ${1}" | $LOGGER /sbin/modprobe ${1} fi fi - if grep $(echo ${1}: | cut -f 1 -d :): /proc/net/dev 1> /dev/null ; then # interface exists + if [ -e /sys/class/net/${1%%:*} ]; then # interface exists if ! /sbin/ip address show dev ${1} 2>/dev/null | grep -wq inet || \ ! /sbin/ip link show dev ${1} | grep -wq "state UP" ; then # interface not up or not configured if [ -n "${HWADDR[$i]}" ]; then # Set hardware address _before_ the interface goes up: @@ -252,7 +252,7 @@ if_down() { echo "/etc/rc.d/rc.inet1: skipping ${1}, you might need to increase MAXNICS" | $LOGGER return fi - if grep $(echo ${1}: | cut -f 1 -d :): /proc/net/dev 1> /dev/null ; then + if [ -e /sys/class/net/${1%%:*} ]; then if [ "${USE_DHCP[$i]}" = "yes" ]; then echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -k -d ${1}" | $LOGGER /sbin/dhcpcd -k -d ${1} 2> /dev/null || /sbin/ip link set dev ${1} down -- cgit v1.2.3