The patch fixes "inetutils.ifconfig -a" doesn't show all interfaces.
More story is in http://www.mail-archive.com/[email protected]/msg01745.html Best Regards, Zhenhua > -----Original Message----- > From: McClintock Matthew-B29882 > Sent: Thursday, November 01, 2012 11:19 PM > To: Joe MacDonald > Cc: [email protected]; 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 > <[email protected]> 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 <[email protected]> > > > > 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 <[email protected]> > >> +--- > >> + 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 _______________________________________________ Openembedded-devel mailing list [email protected] http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-devel
