diff options
author | Eric Cook <llua@gmx.com> | 2014-09-08 20:56:06 -0400 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2014-09-09 09:33:23 +0100 |
commit | add8d94665bc180e781b87051d8dcf71e7b3cb53 (patch) | |
tree | 960b9e0cbeac8f0cf93517047f0f1dbbf4a81d92 /Completion/Unix | |
parent | 8bf3595e3a05f0cea7f12c463a0df09e4010cd1c (diff) | |
download | zsh-add8d94665bc180e781b87051d8dcf71e7b3cb53.tar.gz zsh-add8d94665bc180e781b87051d8dcf71e7b3cb53.tar.xz zsh-add8d94665bc180e781b87051d8dcf71e7b3cb53.zip |
33132: use ip on Linux to get interface names
Diffstat (limited to 'Completion/Unix')
-rw-r--r-- | Completion/Unix/Type/_net_interfaces | 27 |
1 files changed, 18 insertions, 9 deletions
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 |