Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] Completion: _net_interfaces - try ip(8) first on linux



Another tweak for linux, try to use ip(8) first and fallback to ifconfig or procfs if needed.
ifconfig(8) may truncate long interface names, without patches.

left the `*' case pattern since solaris uses it.

---
 Completion/Unix/Type/_net_interfaces | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/Completion/Unix/Type/_net_interfaces b/Completion/Unix/Type/_net_interfaces
index 6662872..2cac3e3 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
-- 
2.1.0



Messages sorted by: Reverse Date, Date, Thread, Author