From add8d94665bc180e781b87051d8dcf71e7b3cb53 Mon Sep 17 00:00:00 2001 From: Eric Cook Date: Mon, 8 Sep 2014 20:56:06 -0400 Subject: 33132: use ip on Linux to get interface names --- Completion/Unix/Type/_net_interfaces | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'Completion') diff --git a/Completion/Unix/Type/_net_interfaces b/Completion/Unix/Type/_net_interfaces index 666287259..2cac3e3bb 100644 --- a/Completion/Unix/Type/_net_interfaces +++ b/Completion/Unix/Type/_net_interfaces @@ -3,6 +3,10 @@ local expl list intf sep local -a disp +# Make sure needed tools are in the path. +local PATH=$PATH +PATH=/sbin:$PATH + case $OSTYPE in aix*) intf=( ${(f)"$(lsdev -C -c if -F 'name:description')"} ) @@ -14,17 +18,22 @@ case $OSTYPE in ;; darwin*|freebsd*|dragonfly*) intf=( $(ifconfig -l) ) ;; irix*) intf=( ${${${(f)"$(/usr/etc/netstat -i)"}%% *}[2,-1]} ) ;; + *linux*) + if (( $+commands[ip] )); then + intf=( ${${(m)${(f)"$(ip -o link)"}#*: }%%: *} ) + fi + ;& *) - # Make sure ifconfig is in the path. - local PATH=$PATH - PATH=/sbin:$PATH - intf=( $(ifconfig -a 2>/dev/null | sed -n 's/^\([^ :]*\).*/\1/p') ) - if [[ ${#intf} -eq 0 && -d /proc/sys/net/ipv4/conf ]]; then - # On linux we used to use the following as the default. - # However, we now use ifconfig since it finds additional devices such - # as tunnels. So only do this if that didn't work. - intf=( /proc/sys/net/ipv4/conf/*~*(all|default)(N:t) ) + if [[ ${#intf} -eq 0 ]]; then + # linux's deprecated ifconfig may truncate long interface names + intf=( $(ifconfig -a 2>/dev/null | sed -n 's/^\([^ :]*\).*/\1/p') ) + if [[ -d /proc/sys/net/ipv4/conf ]]; then + # On linux we used to use the following as the default. + # However, we now use ip or ifconfig since it finds additional devices such + # as tunnels. So only do this if that didn't work. + intf=( /proc/sys/net/ipv4/conf/*~*(all|default)(N:t) ) + fi fi ;; esac -- cgit 1.4.1