From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27640 invoked by alias); 9 Sep 2014 01:01:35 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 33132 Received: (qmail 18008 invoked from network); 9 Sep 2014 01:01:22 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 From: Eric Cook To: zsh-workers@zsh.org Subject: [PATCH] Completion: _net_interfaces - try ip(8) first on linux Date: Mon, 8 Sep 2014 20:56:06 -0400 Message-Id: <1410224166-21000-1-git-send-email-llua@gmx.com> X-Mailer: git-send-email 2.1.0 X-Provags-ID: V03:K0:61KOFgbouiPy/tFSHLK5Sdo6QYTHiGnvwuq9XE/JZk7bU3mNuKc HYUNR6JBa5rEDCfJ6WrcJkwMSD6e7zf7hTYw+g1He8pKkta/9/LEetMKBiXeJY4CKw1sPzK OdIFp7RYrnqjJq/CiXWJiFXIGufq5NpcBUd85fVuUJsQsB3UpUtc0oRXgNssD5nYqWLIme+ nq5zvI3chwZSActftM7Zg== X-UI-Out-Filterresults: notjunk:1; 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