[oe] [meta-oe ] inetutils: ifconfig -a includes interfaces without an address
Joe MacDonald
Joe.MacDonald at windriver.com
Thu Nov 1 14:27:01 UTC 2012
[[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 at 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 at 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.openembedded.org/pipermail/openembedded-devel/attachments/20121101/302993c0/attachment-0002.sig>
More information about the Openembedded-devel
mailing list