[oe] [meta-oe v2] inetutils: fix the issue of "ifconfig -a" that can not display all interfaces

Joe MacDonald Joe.MacDonald at windriver.com
Fri Nov 2 13:56:41 UTC 2012


The follow-up to the previous thread was helpful.  Though I think when
Matthew said this:

   This info should be in the commit message. It provides much needed
   context for others to review and ultimately accept this patch.

he meant the link to the discussion would help.  I'm not sure, but it
certainly helped me understand what was going on here.  The below log
still doesn't contain enough information, so either a quick summary of
the discussion might help if a link to the archive isn't appropriate,
though I kind of think it is in this case.

On to my real question.

This patch looks like a modified version of the one proposed here:

   http://www.mail-archive.com/bug-inetutils@gnu.org/msg01796.html

Which was v1 of, I think, three before the final commit that was pushed
to resolve the issue.  v3 appears to be here:

   http://www.mail-archive.com/bug-inetutils@gnu.org/msg01808.html

But I went to the git repo directly to see what was committed and it
looks like this is the winner:

commit e071c3e5b215ad725d23932ef0d2cacaa1701f17
Author: Giuseppe Scrivano <gscrivano at gnu.org>
Date:   Wed Aug 18 01:28:09 2010 +0200

    Under GNU/Linux print interfaces without an address with ifconfig -a.
    
    * bootstrap.conf (gnulib_modules): Add module `read-file'.
    
    * NEWS: Update.
    
    * ifconfig/options.c (parse_cmdline): Use system_if_nameindex, not
    if_nameindex.
    
    * ifconfig/system.h: Include <if_index.h>.
    
    * ifconfig/system/generic.c (system_if_nameindex): New variable.
    * ifconfig/system/hpux.c (system_if_nameindex): New variable.
    * ifconfig/system/osf.c (system_if_nameindex): Likewise.
    * ifconfig/system/qnc.c (system_if_nameindex): Likewise.
    * ifconfig/system/solaris.c (system_if_nameindex): Likewise.
    
    * ifconfig/system/linux.c (linux_if_nameindex): New function.
    (system_if_nameindex): New variable.

Which is significantly different than what you've sent out.  Though I
know there was also quite a bit of discussion in the thread about
addressing the issue (if present) in OSes that aren't Linux, but that's
not really our concern here, is it?  :-)

So, short version, can you give a bit of detail on why you opted for
this patch instead of the final version that was committed to the
inetutils tree?

Thanks,
-J.

[[oe] [meta-oe v2] inetutils: fix the issue of "ifconfig -a" that can not display all interfaces] On 12.11.02 (Fri 18:20) Chunrong Guo wrote:

> "ifconfig -a" doesn't show all avaiable ethernet interfaces, the patch fixes the issue.
> 
> Signed-off-by: Chunrong Guo <b40290 at freescale.com>
> ---
>  ...ue-of-ifconfig-a-that-can-not-display-all.patch |  482 ++++++++++++++++++++
>  .../inetutils/inetutils_1.8.bb                     |    3 +-
>  2 files changed, 484 insertions(+), 1 deletions(-)
>  create mode 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/0001-fix-the-issue-of-ifconfig-a-that-can-not-display-all.patch
> 
> diff --git a/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/0001-fix-the-issue-of-ifconfig-a-that-can-not-display-all.patch b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/0001-fix-the-issue-of-ifconfig-a-that-can-not-display-all.patch
> new file mode 100644
> index 0000000..dd01ff2
> --- /dev/null
> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/0001-fix-the-issue-of-ifconfig-a-that-can-not-display-all.patch
> @@ -0,0 +1,482 @@
> +From 7d8af05baeec680f17d6070708893f1a4f05bfa4 Mon Sep 17 00:00:00 2001
> +From: Chunrong Guo <b40290 at freescale.com>
> +Date: Fri, 2 Nov 2012 01:28:37 -0500
> +Subject: [PATCH] fix the issue of "ifconfig -a" that can not display all
> + interfaces
> +
> +Upstream-Status: Accepted
> +
> +"ifconfig -a" doesn't show all avaiable ethernet interfaces, the patch can
> +fix the issue.
> +
> +Signed-off-by: Chunrong Guo <b40290 at freescale.com>
> +---
> + ifconfig/if_index.c |  135 ++++++++++++++++++++++++++----------
> + lib/gnulib.mk       |    9 +++
> + lib/read-file.c     |  191 +++++++++++++++++++++++++++++++++++++++++++++++++++
> + lib/read-file.h     |   36 ++++++++++
> + 4 files changed, 333 insertions(+), 38 deletions(-)
> + create mode 100644 lib/read-file.c
> + create mode 100644 lib/read-file.h
> +
> +diff --git a/ifconfig/if_index.c b/ifconfig/if_index.c
> +index e2737c2..5fb0ac7 100644
> +--- a/ifconfig/if_index.c
> ++++ b/ifconfig/if_index.c
> +@@ -28,7 +28,7 @@
> + #include <unistd.h>
> + #include <sys/types.h>
> + #include <sys/socket.h>
> +-
> ++#include <read-file.h>
> + /* Solaris at least earlier 2.6 and before does not include
> +    the ioctl definitions if BSD_COMP is not set.  */
> + #if defined(__svr4__)
> +@@ -97,24 +97,29 @@ if_freenameindex (struct if_nameindex *ifn)
> + struct if_nameindex *
> + if_nameindex (void)
> + {
> +-#if defined(SIOCGIFCONF)
> +-  int fd = socket (AF_INET, SOCK_DGRAM, 0);
> +-  struct ifconf ifc;
> +-  unsigned int i = 0;
> +-  int rq_len, last_len;
> +-  struct if_nameindex *idx = NULL;
> +-  struct ifreq *ifr, *end, *cur;
> ++  //printk("if_nameindex\n");
> + 
> ++//#if defined(SIOCGIFCONF)
> ++//  int fd = socket (AF_INET, SOCK_DGRAM, 0);
> ++//  struct ifconf ifc;
> ++//  unsigned int i = 0;
> ++//  int rq_len, last_len;
> ++    char *content, *it;
> ++    size_t length, index;
> ++    struct if_nameindex *idx = NULL;
> ++//  struct ifreq *ifr, *end, *cur;
> ++     int fd;
> ++    fd = socket (AF_INET, SOCK_DGRAM, 0);
> +   if (fd < 0)
> +     return NULL;
> + 
> +   /* A first estimate.  */
> +-  rq_len = 4 * sizeof (struct ifreq);
> ++ // rq_len = 4 * sizeof (struct ifreq);
> + 
> +-  ifc.ifc_buf = NULL;
> +-  ifc.ifc_len = 0;
> ++//  ifc.ifc_buf = NULL;
> ++//  ifc.ifc_len = 0;
> +   /* Read all the interfaces out of the kernel.  */
> +-  do
> ++/*  do
> +     {
> +       last_len = ifc.ifc_len;
> +       ifc.ifc_buf = alloca (ifc.ifc_len = rq_len);
> +@@ -142,30 +147,59 @@ if_nameindex (void)
> + # endif
> + 
> +       cur = ifr;
> +-
> +-      /* Step along the array by the size of the current structure */
> +-      ifr = (struct ifreq *) ((caddr_t) ifr + len + IFNAMSIZ);
> ++*/
> ++      content = read_file (PATH_PROCNET_DEV, &length);
> ++      if (content == NULL)
> ++         return NULL;
> ++         /* Count how many interfaces we have.  */
> ++   {
> ++    size_t n = 0;
> ++    it = content;
> ++    do
> ++      {
> ++        it = memchr (it + 1, ':', length - (it - content));
> ++        n++;
> ++      }
> ++    while (it);
> ++ 
> ++     /* Step along the array by the size of the current structure */
> ++     // ifr = (struct ifreq *) ((caddr_t) ifr + len + IFNAMSIZ);
> + 
> +       /* We ignore the other families .. OK ?  */
> +-      if (cur->ifr_addr.sa_family != AF_INET)
> +-	continue;
> +-
> ++    //  if (cur->ifr_addr.sa_family != AF_INET)
> ++	//continue;
> ++   idx = malloc (n * sizeof(*idx));
> ++   if (idx == NULL)
> +       /* Make Room safely.  */
> +       {
> +-	struct if_nameindex *tidx = NULL;
> +-	tidx = realloc (idx, (i + 1) * sizeof (*idx));
> +-	if (tidx == NULL)
> +-	  {
> +-	    if_freenameindex (idx);
> +-	    close (fd);
> +-	    errno = ENOBUFS;
> +-	    return NULL;
> +-	  }
> +-	idx = tidx;
> ++	//struct if_nameindex *tidx = NULL;
> ++	//tidx = realloc (idx, (i + 1) * sizeof (*idx));
> ++	//if (tidx == NULL)
> ++	//  {
> ++	 //   if_freenameindex (idx);
> ++	  //  close (fd);
> ++	   // errno = ENOBUFS;
> ++	  //  return NULL;
> ++	 // }
> ++//	idx = tidx;
> ++      int saved_errno = errno;
> ++      close (fd);
> ++      free(content);
> ++      errno = saved_errno;
> ++     return NULL;
> +       }
> +-
> ++  }
> +       /* FIXME: We did not deal with duplicates or interface aliases.  */
> ++  for (it = memchr (content, ':', length), index = 0; it;
> ++       it = memchr (it, ':', it - content), index++)
> ++    {
> ++      char *start = it - 1;
> ++      *it = '\0';
> + 
> ++      while (*start != ' ' && *start != '\n')
> ++        start--;
> ++
> ++/*
> +       idx[i].if_name = strdup (cur->ifr_name);
> +       if (idx[i].if_name == NULL)
> + 	{
> +@@ -174,18 +208,38 @@ if_nameindex (void)
> + 	  errno = ENOBUFS;
> + 	  return NULL;
> + 	}
> ++*/
> ++      idx[index].if_name = strdup (start + 1);
> ++      idx[index].if_index = index + 1;
> + 
> + # if defined(SIOCGIFINDEX)
> +-      if (ioctl (fd, SIOCGIFINDEX, cur) >= 0)
> +-	idx[i].if_index = cur->ifr_index;
> +-      else
> ++  //    if (ioctl (fd, SIOCGIFINDEX, cur) >= 0)
> ++//	idx[i].if_index = cur->ifr_index;
> ++ //     else
> ++    {
> ++        struct ifreq cur;
> ++        strcpy (cur.ifr_name, idx[index].if_name);
> ++        cur.ifr_index = -1;
> ++        if (ioctl (fd, SIOCGIFINDEX, &cur) >= 0)
> ++          idx[index].if_index = cur.ifr_index;
> ++      }
> ++
> + # endif
> +-	idx[i].if_index = i + 1;
> +-      i++;
> ++//	idx[i].if_index = i + 1;
> ++ //      i++;
> ++   if (idx[index].if_name == NULL)
> ++        {
> ++          int saved_errno = errno;
> ++          close (fd);
> ++          free (content);
> ++          errno = saved_errno;
> ++          return NULL;
> ++        }
> ++
> +     }
> + 
> +   /* Terminate the array with an empty solt.  */
> +-  {
> ++/*  {
> +     struct if_nameindex *tidx = NULL;
> +     tidx = realloc (idx, (i + 1) * sizeof (*idx));
> +     if (tidx == NULL)
> +@@ -199,14 +253,19 @@ if_nameindex (void)
> +   }
> +   idx[i].if_index = 0;
> +   idx[i].if_name = NULL;
> +-
> +-  close (fd);
> ++*/
> ++  idx[index].if_index = 0;
> ++  idx[index].if_name = NULL;
> ++ 
> ++ // close (fd);
> ++ free(content);
> +   return idx;
> +-
> ++/*
> + #else
> +   errno = ENOSYS;
> +   return NULL;
> + #endif
> ++*/
> + }
> + 
> + char *
> +diff --git a/lib/gnulib.mk b/lib/gnulib.mk
> +index ebc3b22..defb086 100644
> +--- a/lib/gnulib.mk
> ++++ b/lib/gnulib.mk
> +@@ -111,6 +111,15 @@ libgnu_a_SOURCES += argp-version-etc.h argp-version-etc.c
> + 
> + ## end   gnulib module argp-version-etc
> + 
> ++
> ++## begin gnulib module read-file
> ++
> ++libgnu_a_SOURCES += read-file.c
> ++
> ++EXTRA_DIST += read-file.h
> ++
> ++## end   gnulib module read-file
> ++
> + ## begin gnulib module arpa_inet
> + 
> + BUILT_SOURCES += arpa/inet.h
> +diff --git a/lib/read-file.c b/lib/read-file.c
> +new file mode 100644
> +index 0000000..ba7aef3
> +--- /dev/null
> ++++ b/lib/read-file.c
> +@@ -0,0 +1,191 @@
> ++/* -*- buffer-read-only: t -*- vi: set ro: */
> ++/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
> ++/* read-file.c -- read file contents into a string
> ++   Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
> ++   Written by Simon Josefsson and Bruno Haible.
> ++
> ++   This program is free software; you can redistribute it and/or modify
> ++   it under the terms of the GNU General Public License as published by
> ++   the Free Software Foundation; either version 3, or (at your option)
> ++   any later version.
> ++
> ++   This program is distributed in the hope that it will be useful,
> ++   but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> ++   GNU General Public License for more details.
> ++
> ++   You should have received a copy of the GNU General Public License
> ++   along with this program; if not, write to the Free Software Foundation,
> ++   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
> ++
> ++#include <config.h>
> ++
> ++#include "read-file.h"
> ++
> ++/* Get fstat.  */
> ++#include <sys/stat.h>
> ++
> ++/* Get ftello.  */
> ++#include <stdio.h>
> ++
> ++/* Get SIZE_MAX.  */
> ++#include <stdint.h>
> ++
> ++/* Get malloc, realloc, free. */
> ++#include <stdlib.h>
> ++
> ++/* Get errno. */
> ++#include <errno.h>
> ++
> ++/* Read a STREAM and return a newly allocated string with the content,
> ++   and set *LENGTH to the length of the string.  The string is
> ++   zero-terminated, but the terminating zero byte is not counted in
> ++   *LENGTH.  On errors, *LENGTH is undefined, errno preserves the
> ++   values set by system functions (if any), and NULL is returned.  */
> ++char *
> ++fread_file (FILE *stream, size_t *length)
> ++{
> ++  char *buf = NULL;
> ++  size_t alloc = BUFSIZ;
> ++
> ++  /* For a regular file, allocate a buffer that has exactly the right
> ++     size.  This avoids the need to do dynamic reallocations later.  */
> ++  {
> ++    struct stat st;
> ++
> ++    if (fstat (fileno (stream), &st) >= 0 && S_ISREG (st.st_mode))
> ++      {
> ++        off_t pos = ftello (stream);
> ++
> ++        if (pos >= 0 && pos < st.st_size)
> ++          {
> ++            off_t alloc_off = st.st_size - pos;
> ++
> ++            /* '1' below, accounts for the trailing NUL.  */
> ++            if (SIZE_MAX - 1 < alloc_off)
> ++              {
> ++                errno = ENOMEM;
> ++                return NULL;
> ++              }
> ++
> ++            alloc = alloc_off + 1;
> ++          }
> ++      }
> ++  }
> ++
> ++  if (!(buf = malloc (alloc)))
> ++    return NULL; /* errno is ENOMEM.  */
> ++
> ++  {
> ++    size_t size = 0; /* number of bytes read so far */
> ++    int save_errno;
> ++
> ++    for (;;)
> ++      {
> ++        /* This reads 1 more than the size of a regular file
> ++           so that we get eof immediately.  */
> ++        size_t requested = alloc - size;
> ++        size_t count = fread (buf + size, 1, requested, stream);
> ++        size += count;
> ++
> ++        if (count != requested)
> ++          {
> ++            save_errno = errno;
> ++            if (ferror (stream))
> ++              break;
> ++
> ++            /* Shrink the allocated memory if possible.  */
> ++            if (size < alloc - 1)
> ++              {
> ++                char *smaller_buf = realloc (buf, size + 1);
> ++                if (smaller_buf != NULL)
> ++                  buf = smaller_buf;
> ++              }
> ++
> ++            buf[size] = '\0';
> ++            *length = size;
> ++            return buf;
> ++          }
> ++
> ++        {
> ++          char *new_buf;
> ++
> ++          if (alloc == SIZE_MAX)
> ++            {
> ++              save_errno = ENOMEM;
> ++              break;
> ++            }
> ++
> ++          if (alloc < SIZE_MAX - alloc / 2)
> ++            alloc = alloc + alloc / 2;
> ++          else
> ++            alloc = SIZE_MAX;
> ++
> ++          if (!(new_buf = realloc (buf, alloc)))
> ++            {
> ++              save_errno = errno;
> ++              break;
> ++            }
> ++
> ++          buf = new_buf;
> ++        }
> ++      }
> ++
> ++    free (buf);
> ++    errno = save_errno;
> ++    return NULL;
> ++  }
> ++}
> ++
> ++static char *
> ++internal_read_file (const char *filename, size_t *length, const char *mode)
> ++{
> ++  FILE *stream = fopen (filename, mode);
> ++  char *out;
> ++  int save_errno;
> ++
> ++  if (!stream)
> ++    return NULL;
> ++
> ++  out = fread_file (stream, length);
> ++
> ++  save_errno = errno;
> ++
> ++  if (fclose (stream) != 0)
> ++    {
> ++      if (out)
> ++        {
> ++          save_errno = errno;
> ++          free (out);
> ++        }
> ++      errno = save_errno;
> ++      return NULL;
> ++    }
> ++
> ++  return out;
> ++}
> ++
> ++/* Open and read the contents of FILENAME, and return a newly
> ++   allocated string with the content, and set *LENGTH to the length of
> ++   the string.  The string is zero-terminated, but the terminating
> ++   zero byte is not counted in *LENGTH.  On errors, *LENGTH is
> ++   undefined, errno preserves the values set by system functions (if
> ++   any), and NULL is returned.  */
> ++char *
> ++read_file (const char *filename, size_t *length)
> ++{
> ++  return internal_read_file (filename, length, "r");
> ++}
> ++
> ++/* Open (on non-POSIX systems, in binary mode) and read the contents
> ++   of FILENAME, and return a newly allocated string with the content,
> ++   and set LENGTH to the length of the string.  The string is
> ++   zero-terminated, but the terminating zero byte is not counted in
> ++   the LENGTH variable.  On errors, *LENGTH is undefined, errno
> ++   preserves the values set by system functions (if any), and NULL is
> ++   returned.  */
> ++char *
> ++read_binary_file (const char *filename, size_t *length)
> ++{
> ++  return internal_read_file (filename, length, "rb");
> ++}
> +diff --git a/lib/read-file.h b/lib/read-file.h
> +new file mode 100644
> +index 0000000..14041dc
> +--- /dev/null
> ++++ b/lib/read-file.h
> +@@ -0,0 +1,36 @@
> ++/* -*- buffer-read-only: t -*- vi: set ro: */
> ++/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
> ++/* read-file.h -- read file contents into a string
> ++   Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc.
> ++   Written by Simon Josefsson.
> ++
> ++   This program is free software; you can redistribute it and/or modify
> ++   it under the terms of the GNU General Public License as published by
> ++   the Free Software Foundation; either version 3, or (at your option)
> ++   any later version.
> ++
> ++   This program is distributed in the hope that it will be useful,
> ++   but WITHOUT ANY WARRANTY; without even the implied warranty of
> ++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> ++   GNU General Public License for more details.
> ++
> ++   You should have received a copy of the GNU General Public License
> ++   along with this program; if not, write to the Free Software Foundation,
> ++   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
> ++
> ++#ifndef READ_FILE_H
> ++#define READ_FILE_H
> ++
> ++/* Get size_t.  */
> ++#include <stddef.h>
> ++
> ++/* Get FILE.  */
> ++#include <stdio.h>
> ++
> ++extern char *fread_file (FILE * stream, size_t * length);
> ++
> ++extern char *read_file (const char *filename, size_t * length);
> ++
> ++extern char *read_binary_file (const char *filename, size_t * length);
> ++
> ++#endif /* READ_FILE_H */
> +-- 
> +1.7.9.7
> +
> diff --git a/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb b/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
> index 761b2e6..a3b4359 100644
> --- a/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
> @@ -8,7 +8,7 @@ LICENSE = "GPLv3"
>  
>  LIC_FILES_CHKSUM = "file://COPYING;md5=adefda309052235aa5d1e99ce7557010"
>  
> -PR = "r1"
> +PR = "r2"
>  
>  SRC_URI = "${GNU_MIRROR}/inetutils/inetutils-${PV}.tar.gz \
>             file://inetutils-1.8-0001-printf-parse-pull-in-features.h-for-__GLIBC__.patch \
> @@ -22,6 +22,7 @@ SRC_URI = "${GNU_MIRROR}/inetutils/inetutils-${PV}.tar.gz \
>             file://fix-disable-ipv6.patch \
>             file://disable-pre-ANSI-compilers.patch \
>             file://remove_gets.patch \
> +           file://0001-fix-the-issue-of-ifconfig-a-that-can-not-display-all.patch \
>  " 
>  SRC_URI[md5sum] = "ad8fdcdf1797b9ca258264a6b04e48fd"
>  SRC_URI[sha256sum] = "c8500baee04b9ea408c9e65e24ad7f5b41e7d96d42fb1d29abf25b52b68311c7"
-- 
Joe MacDonald, Sr. Member of Technical Staff, Linux Products Group, Wind River
direct 613.270.5750     mobile 613.291.7421     fax 613.592.2283
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.openembedded.org/pipermail/openembedded-devel/attachments/20121102/8be863eb/attachment-0002.sig>


More information about the Openembedded-devel mailing list