Patchwork [meta-oe] inetutils: ifconfig -a includes interfaces without an address

login
register
mail settings
Submitter chunrong guo
Date Nov. 1, 2012, 9:59 a.m.
Message ID <1351763967-14739-1-git-send-email-b40290@freescale.com>
Download mbox | patch
Permalink /patch/38755/
State Superseded
Headers show

Comments

chunrong guo - Nov. 1, 2012, 9:59 a.m.
*ifconfig/if_index.c (if_nameindex): Remove local variables
        `ifc', `i', `rq_len', `last_len', `ifr', `end', `cur'.
        Add local variables `content', `it', `length', `index'.
        Remove code that uses the SIOCGIFCONF ioctl to get the interfaces
        list.  Parse the PATH_PROCNET_DEV file to fetch the list of
        interfaces.
Signed-off-by: Chunrong Guo <b40290@freescale.com>
---
 .../inetutils/inetutils-1.8/15.patch               |  197 +++++++++++++++
 .../inetutils/inetutils-1.8/add-module.patch       |   18 ++
 .../inetutils/inetutils-1.8/add-readfile.patch     |  250 ++++++++++++++++++++
 .../inetutils/inetutils_1.8.bb                     |    3 +
 4 files changed, 468 insertions(+), 0 deletions(-)
 create mode 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
 create mode 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
 create mode 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch
Joe MacDonald - Nov. 1, 2012, 2:27 p.m.
[[oe] [meta-oe ] inetutils: ifconfig -a includes interfaces without an address] On 12.11.01 (Thu 17:59) Chunrong Guo wrote:

> 	*ifconfig/if_index.c (if_nameindex): Remove local variables
>         `ifc', `i', `rq_len', `last_len', `ifr', `end', `cur'.
>         Add local variables `content', `it', `length', `index'.
>         Remove code that uses the SIOCGIFCONF ioctl to get the interfaces
>         list.  Parse the PATH_PROCNET_DEV file to fetch the list of
>         interfaces.
> Signed-off-by: Chunrong Guo <b40290@freescale.com>

I'm still not understanding the objective of these changes.  The above
commit log says what you're doing, but I cannot tell why.  Since the
patch itself is leaving largeish chunks of code commented out and/or
dead, removing previous ifdef's and using an inconsistent style, it's
kind of caught my attention and I can't help asking why.

Particularly since the short log message seems to me that you're trying
to change existing, documented and reasonably correct behaviour.  What's
actually broken here?

-J.

> ---
>  .../inetutils/inetutils-1.8/15.patch               |  197 +++++++++++++++
>  .../inetutils/inetutils-1.8/add-module.patch       |   18 ++
>  .../inetutils/inetutils-1.8/add-readfile.patch     |  250 ++++++++++++++++++++
>  .../inetutils/inetutils_1.8.bb                     |    3 +
>  4 files changed, 468 insertions(+), 0 deletions(-)
>  create mode 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
>  create mode 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
>  create mode 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch
> 
> diff --git a/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
> new file mode 100644
> index 0000000..c2d4f11
> --- /dev/null
> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
> @@ -0,0 +1,197 @@
> +--- inetutils-1.8/ifconfig/if_index.c	2010-05-15 06:25:47.000000000 -0500
> ++++ ../inetutils-1.8-r0+fsl.1/inetutils-1.8/ifconfig/if_index.c	2012-10-30 04:03:19.595348659 -0500
> +@@ -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 @@
> + 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 @@
> + # 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 @@
> + 	  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 @@
> +   }
> +   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/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
> new file mode 100644
> index 0000000..7acc3a4
> --- /dev/null
> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
> @@ -0,0 +1,18 @@
> +--- inetutils-1.8/lib/gnulib.mk	2010-05-15 06:34:54.000000000 -0500
> ++++ inetutils-1.8/lib/gnulib.mk	2012-10-29 21:50:44.821671025 -0500
> +@@ -111,6 +111,15 @@
> + 
> + ## 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/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch
> new file mode 100644
> index 0000000..bb18ae9
> --- /dev/null
> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch
> @@ -0,0 +1,250 @@
> +Signed-off-by: Chunrong Guo <b40290@freescale.com>
> +---
> + inetutils-1.8/lib/read-file.c |  191 +++++++++++++++++++++++++++++++++++++++++
> + inetutils-1.8/lib/read-file.h |   36 ++++++++
> + 2 files changed, 227 insertions(+)
> + create mode 100644 inetutils-1.8/lib/read-file.c
> + create mode 100644 inetutils-1.8/lib/read-file.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
> +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..74a9875 100644
> --- a/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
> @@ -22,6 +22,9 @@ 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://add-readfile.patch \
> +           file://15.patch \
> +           file://add-module.patch \
>  " 
>  SRC_URI[md5sum] = "ad8fdcdf1797b9ca258264a6b04e48fd"
>  SRC_URI[sha256sum] = "c8500baee04b9ea408c9e65e24ad7f5b41e7d96d42fb1d29abf25b52b68311c7"
McClintock Matthew-B29882 - Nov. 1, 2012, 3:19 p.m.
On Thu, Nov 1, 2012 at 9:27 AM, Joe MacDonald
<Joe.MacDonald@windriver.com> wrote:
> [[oe] [meta-oe ] inetutils: ifconfig -a includes interfaces without an address] On 12.11.01 (Thu 17:59) Chunrong Guo wrote:
>
>>       *ifconfig/if_index.c (if_nameindex): Remove local variables
>>         `ifc', `i', `rq_len', `last_len', `ifr', `end', `cur'.
>>         Add local variables `content', `it', `length', `index'.
>>         Remove code that uses the SIOCGIFCONF ioctl to get the interfaces
>>         list.  Parse the PATH_PROCNET_DEV file to fetch the list of
>>         interfaces.
>> Signed-off-by: Chunrong Guo <b40290@freescale.com>
>
> I'm still not understanding the objective of these changes.  The above
> commit log says what you're doing, but I cannot tell why.  Since the
> patch itself is leaving largeish chunks of code commented out and/or
> dead, removing previous ifdef's and using an inconsistent style, it's
> kind of caught my attention and I can't help asking why.
>
> Particularly since the short log message seems to me that you're trying
> to change existing, documented and reasonably correct behaviour.  What's
> actually broken here?

Chunrong,

I'm having a hard time parsing this as well... is this fixing the
issue with ifconfig were we are not seeing all the ethernet
interfaces?

-M

>
> -J.
>
>> ---
>>  .../inetutils/inetutils-1.8/15.patch               |  197 +++++++++++++++
>>  .../inetutils/inetutils-1.8/add-module.patch       |   18 ++
>>  .../inetutils/inetutils-1.8/add-readfile.patch     |  250 ++++++++++++++++++++
>>  .../inetutils/inetutils_1.8.bb                     |    3 +
>>  4 files changed, 468 insertions(+), 0 deletions(-)
>>  create mode 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
>>  create mode 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
>>  create mode 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch
>>
>> diff --git a/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
>> new file mode 100644
>> index 0000000..c2d4f11
>> --- /dev/null
>> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
>> @@ -0,0 +1,197 @@
>> +--- inetutils-1.8/ifconfig/if_index.c        2010-05-15 06:25:47.000000000 -0500
>> ++++ ../inetutils-1.8-r0+fsl.1/inetutils-1.8/ifconfig/if_index.c      2012-10-30 04:03:19.595348659 -0500
>> +@@ -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 @@
>> + 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 @@
>> + # 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 @@
>> +       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 @@
>> +   }
>> +   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/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
>> new file mode 100644
>> index 0000000..7acc3a4
>> --- /dev/null
>> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
>> @@ -0,0 +1,18 @@
>> +--- inetutils-1.8/lib/gnulib.mk      2010-05-15 06:34:54.000000000 -0500
>> ++++ inetutils-1.8/lib/gnulib.mk      2012-10-29 21:50:44.821671025 -0500
>> +@@ -111,6 +111,15 @@
>> +
>> + ## 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/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch
>> new file mode 100644
>> index 0000000..bb18ae9
>> --- /dev/null
>> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch
>> @@ -0,0 +1,250 @@
>> +Signed-off-by: Chunrong Guo <b40290@freescale.com>
>> +---
>> + inetutils-1.8/lib/read-file.c |  191 +++++++++++++++++++++++++++++++++++++++++
>> + inetutils-1.8/lib/read-file.h |   36 ++++++++
>> + 2 files changed, 227 insertions(+)
>> + create mode 100644 inetutils-1.8/lib/read-file.c
>> + create mode 100644 inetutils-1.8/lib/read-file.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
>> +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..74a9875 100644
>> --- a/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
>> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
>> @@ -22,6 +22,9 @@ 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://add-readfile.patch \
>> +           file://15.patch \
>> +           file://add-module.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
Zhenhua Luo - Nov. 2, 2012, 2:14 a.m.
The patch fixes "inetutils.ifconfig -a" doesn't show all interfaces. 

More story is in http://www.mail-archive.com/bug-inetutils@gnu.org/msg01745.html


Best Regards,

Zhenhua

> -----Original Message-----
> From: McClintock Matthew-B29882
> Sent: Thursday, November 01, 2012 11:19 PM
> To: Joe MacDonald
> Cc: openembedded-devel@lists.openembedded.org; McClintock Matthew-B29882;
> Luo Zhenhua-B19537
> Subject: Re: [oe] [meta-oe ] inetutils: ifconfig -a includes interfaces
> without an address
> 
> On Thu, Nov 1, 2012 at 9:27 AM, Joe MacDonald
> <Joe.MacDonald@windriver.com> wrote:
> > [[oe] [meta-oe ] inetutils: ifconfig -a includes interfaces without an
> address] On 12.11.01 (Thu 17:59) Chunrong Guo wrote:
> >
> >>       *ifconfig/if_index.c (if_nameindex): Remove local variables
> >>         `ifc', `i', `rq_len', `last_len', `ifr', `end', `cur'.
> >>         Add local variables `content', `it', `length', `index'.
> >>         Remove code that uses the SIOCGIFCONF ioctl to get the
> interfaces
> >>         list.  Parse the PATH_PROCNET_DEV file to fetch the list of
> >>         interfaces.
> >> Signed-off-by: Chunrong Guo <b40290@freescale.com>
> >
> > I'm still not understanding the objective of these changes.  The above
> > commit log says what you're doing, but I cannot tell why.  Since the
> > patch itself is leaving largeish chunks of code commented out and/or
> > dead, removing previous ifdef's and using an inconsistent style, it's
> > kind of caught my attention and I can't help asking why.
> >
> > Particularly since the short log message seems to me that you're
> > trying to change existing, documented and reasonably correct
> > behaviour.  What's actually broken here?
> 
> Chunrong,
> 
> I'm having a hard time parsing this as well... is this fixing the issue
> with ifconfig were we are not seeing all the ethernet interfaces?
> 
> -M
> 
> >
> > -J.
> >
> >> ---
> >>  .../inetutils/inetutils-1.8/15.patch               |  197
> +++++++++++++++
> >>  .../inetutils/inetutils-1.8/add-module.patch       |   18 ++
> >>  .../inetutils/inetutils-1.8/add-readfile.patch     |  250
> ++++++++++++++++++++
> >>  .../inetutils/inetutils_1.8.bb                     |    3 +
> >>  4 files changed, 468 insertions(+), 0 deletions(-)  create mode
> >> 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
> >>  create mode 100644
> >> meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
> >>  create mode 100644
> >> meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.pat
> >> ch
> >>
> >> diff --git
> >> a/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
> >> b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
> >> new file mode 100644
> >> index 0000000..c2d4f11
> >> --- /dev/null
> >> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
> >> @@ -0,0 +1,197 @@
> >> +--- inetutils-1.8/ifconfig/if_index.c        2010-05-15
> 06:25:47.000000000 -0500
> >> ++++ ../inetutils-1.8-r0+fsl.1/inetutils-1.8/ifconfig/if_index.c
> 2012-10-30 04:03:19.595348659 -0500
> >> +@@ -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 @@  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 @@  # 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 @@
> >> +       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 @@
> >> +   }
> >> +   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/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.pat
> >> ch
> >> b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.pat
> >> ch
> >> new file mode 100644
> >> index 0000000..7acc3a4
> >> --- /dev/null
> >> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module
> >> +++ .patch
> >> @@ -0,0 +1,18 @@
> >> +--- inetutils-1.8/lib/gnulib.mk      2010-05-15 06:34:54.000000000 -
> 0500
> >> ++++ inetutils-1.8/lib/gnulib.mk      2012-10-29 21:50:44.821671025 -
> 0500
> >> +@@ -111,6 +111,15 @@
> >> +
> >> + ## 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/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.p
> >> atch
> >> b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.p
> >> atch
> >> new file mode 100644
> >> index 0000000..bb18ae9
> >> --- /dev/null
> >> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfi
> >> +++ le.patch
> >> @@ -0,0 +1,250 @@
> >> +Signed-off-by: Chunrong Guo <b40290@freescale.com>
> >> +---
> >> + inetutils-1.8/lib/read-file.c |  191
> +++++++++++++++++++++++++++++++++++++++++
> >> + inetutils-1.8/lib/read-file.h |   36 ++++++++
> >> + 2 files changed, 227 insertions(+)
> >> + create mode 100644 inetutils-1.8/lib/read-file.c  create mode
> >> +100644 inetutils-1.8/lib/read-file.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 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..74a9875 100644
> >> --- a/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
> >> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
> >> @@ -22,6 +22,9 @@ 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://add-readfile.patch \
> >> +           file://15.patch \
> >> +           file://add-module.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
McClintock Matthew-B29882 - Nov. 2, 2012, 2:27 a.m.
On Thu, Nov 1, 2012 at 9:14 PM, Luo Zhenhua-B19537 <B19537@freescale.com> wrote:
> The patch fixes "inetutils.ifconfig -a" doesn't show all interfaces.
>
> More story is in http://www.mail-archive.com/bug-inetutils@gnu.org/msg01745.html

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

-M

>
>
> Best Regards,
>
> Zhenhua
>
>> -----Original Message-----
>> From: McClintock Matthew-B29882
>> Sent: Thursday, November 01, 2012 11:19 PM
>> To: Joe MacDonald
>> Cc: openembedded-devel@lists.openembedded.org; McClintock Matthew-B29882;
>> Luo Zhenhua-B19537
>> Subject: Re: [oe] [meta-oe ] inetutils: ifconfig -a includes interfaces
>> without an address
>>
>> On Thu, Nov 1, 2012 at 9:27 AM, Joe MacDonald
>> <Joe.MacDonald@windriver.com> wrote:
>> > [[oe] [meta-oe ] inetutils: ifconfig -a includes interfaces without an
>> address] On 12.11.01 (Thu 17:59) Chunrong Guo wrote:
>> >
>> >>       *ifconfig/if_index.c (if_nameindex): Remove local variables
>> >>         `ifc', `i', `rq_len', `last_len', `ifr', `end', `cur'.
>> >>         Add local variables `content', `it', `length', `index'.
>> >>         Remove code that uses the SIOCGIFCONF ioctl to get the
>> interfaces
>> >>         list.  Parse the PATH_PROCNET_DEV file to fetch the list of
>> >>         interfaces.
>> >> Signed-off-by: Chunrong Guo <b40290@freescale.com>
>> >
>> > I'm still not understanding the objective of these changes.  The above
>> > commit log says what you're doing, but I cannot tell why.  Since the
>> > patch itself is leaving largeish chunks of code commented out and/or
>> > dead, removing previous ifdef's and using an inconsistent style, it's
>> > kind of caught my attention and I can't help asking why.
>> >
>> > Particularly since the short log message seems to me that you're
>> > trying to change existing, documented and reasonably correct
>> > behaviour.  What's actually broken here?
>>
>> Chunrong,
>>
>> I'm having a hard time parsing this as well... is this fixing the issue
>> with ifconfig were we are not seeing all the ethernet interfaces?
>>
>> -M
>>
>> >
>> > -J.
>> >
>> >> ---
>> >>  .../inetutils/inetutils-1.8/15.patch               |  197
>> +++++++++++++++
>> >>  .../inetutils/inetutils-1.8/add-module.patch       |   18 ++
>> >>  .../inetutils/inetutils-1.8/add-readfile.patch     |  250
>> ++++++++++++++++++++
>> >>  .../inetutils/inetutils_1.8.bb                     |    3 +
>> >>  4 files changed, 468 insertions(+), 0 deletions(-)  create mode
>> >> 100644 meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
>> >>  create mode 100644
>> >> meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
>> >>  create mode 100644
>> >> meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.pat
>> >> ch
>> >>
>> >> diff --git
>> >> a/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
>> >> b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
>> >> new file mode 100644
>> >> index 0000000..c2d4f11
>> >> --- /dev/null
>> >> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
>> >> @@ -0,0 +1,197 @@
>> >> +--- inetutils-1.8/ifconfig/if_index.c        2010-05-15
>> 06:25:47.000000000 -0500
>> >> ++++ ../inetutils-1.8-r0+fsl.1/inetutils-1.8/ifconfig/if_index.c
>> 2012-10-30 04:03:19.595348659 -0500
>> >> +@@ -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 @@  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 @@  # 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 @@
>> >> +       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 @@
>> >> +   }
>> >> +   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/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.pat
>> >> ch
>> >> b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.pat
>> >> ch
>> >> new file mode 100644
>> >> index 0000000..7acc3a4
>> >> --- /dev/null
>> >> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module
>> >> +++ .patch
>> >> @@ -0,0 +1,18 @@
>> >> +--- inetutils-1.8/lib/gnulib.mk      2010-05-15 06:34:54.000000000 -
>> 0500
>> >> ++++ inetutils-1.8/lib/gnulib.mk      2012-10-29 21:50:44.821671025 -
>> 0500
>> >> +@@ -111,6 +111,15 @@
>> >> +
>> >> + ## 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/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.p
>> >> atch
>> >> b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.p
>> >> atch
>> >> new file mode 100644
>> >> index 0000000..bb18ae9
>> >> --- /dev/null
>> >> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfi
>> >> +++ le.patch
>> >> @@ -0,0 +1,250 @@
>> >> +Signed-off-by: Chunrong Guo <b40290@freescale.com>
>> >> +---
>> >> + inetutils-1.8/lib/read-file.c |  191
>> +++++++++++++++++++++++++++++++++++++++++
>> >> + inetutils-1.8/lib/read-file.h |   36 ++++++++
>> >> + 2 files changed, 227 insertions(+)
>> >> + create mode 100644 inetutils-1.8/lib/read-file.c  create mode
>> >> +100644 inetutils-1.8/lib/read-file.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 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..74a9875 100644
>> >> --- a/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
>> >> +++ b/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
>> >> @@ -22,6 +22,9 @@ 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://add-readfile.patch \
>> >> +           file://15.patch \
>> >> +           file://add-module.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

Patch

diff --git a/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
new file mode 100644
index 0000000..c2d4f11
--- /dev/null
+++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/15.patch
@@ -0,0 +1,197 @@ 
+--- inetutils-1.8/ifconfig/if_index.c	2010-05-15 06:25:47.000000000 -0500
++++ ../inetutils-1.8-r0+fsl.1/inetutils-1.8/ifconfig/if_index.c	2012-10-30 04:03:19.595348659 -0500
+@@ -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 @@
+ 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 @@
+ # 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 @@
+ 	  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 @@
+   }
+   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/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
new file mode 100644
index 0000000..7acc3a4
--- /dev/null
+++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-module.patch
@@ -0,0 +1,18 @@ 
+--- inetutils-1.8/lib/gnulib.mk	2010-05-15 06:34:54.000000000 -0500
++++ inetutils-1.8/lib/gnulib.mk	2012-10-29 21:50:44.821671025 -0500
+@@ -111,6 +111,15 @@
+ 
+ ## 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/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch
new file mode 100644
index 0000000..bb18ae9
--- /dev/null
+++ b/meta-oe/recipes-connectivity/inetutils/inetutils-1.8/add-readfile.patch
@@ -0,0 +1,250 @@ 
+Signed-off-by: Chunrong Guo <b40290@freescale.com>
+---
+ inetutils-1.8/lib/read-file.c |  191 +++++++++++++++++++++++++++++++++++++++++
+ inetutils-1.8/lib/read-file.h |   36 ++++++++
+ 2 files changed, 227 insertions(+)
+ create mode 100644 inetutils-1.8/lib/read-file.c
+ create mode 100644 inetutils-1.8/lib/read-file.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
+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..74a9875 100644
--- a/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
+++ b/meta-oe/recipes-connectivity/inetutils/inetutils_1.8.bb
@@ -22,6 +22,9 @@  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://add-readfile.patch \
+           file://15.patch \
+           file://add-module.patch \
 " 
 SRC_URI[md5sum] = "ad8fdcdf1797b9ca258264a6b04e48fd"
 SRC_URI[sha256sum] = "c8500baee04b9ea408c9e65e24ad7f5b41e7d96d42fb1d29abf25b52b68311c7"