* [meta-oe ] inetutils: ifconfig -a includes interfaces without an address
@ 2012-11-01 9:59 Chunrong Guo
2012-11-01 14:27 ` Joe MacDonald
0 siblings, 1 reply; 5+ messages in thread
From: Chunrong Guo @ 2012-11-01 9:59 UTC (permalink / raw)
To: openembedded-devel; +Cc: B29882, B19537
*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
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"
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [meta-oe ] inetutils: ifconfig -a includes interfaces without an address
2012-11-01 9:59 [meta-oe ] inetutils: ifconfig -a includes interfaces without an address Chunrong Guo
@ 2012-11-01 14:27 ` Joe MacDonald
2012-11-01 15:19 ` McClintock Matthew-B29882
0 siblings, 1 reply; 5+ messages in thread
From: Joe MacDonald @ 2012-11-01 14:27 UTC (permalink / raw)
To: openembedded-devel; +Cc: B29882, B19537
[-- Attachment #1: Type: text/plain, Size: 17924 bytes --]
[[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"
--
Joe MacDonald, Sr. Member of Technical Staff, Linux Products Group, Wind River
direct 613.270.5750 mobile 613.291.7421 fax 613.592.2283
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 205 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [meta-oe ] inetutils: ifconfig -a includes interfaces without an address
2012-11-01 14:27 ` Joe MacDonald
@ 2012-11-01 15:19 ` McClintock Matthew-B29882
2012-11-02 2:14 ` Luo Zhenhua-B19537
0 siblings, 1 reply; 5+ messages in thread
From: McClintock Matthew-B29882 @ 2012-11-01 15:19 UTC (permalink / raw)
To: Joe MacDonald
Cc: McClintock Matthew-B29882,
openembedded-devel@lists.openembedded.org, Luo Zhenhua-B19537
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [meta-oe ] inetutils: ifconfig -a includes interfaces without an address
2012-11-01 15:19 ` McClintock Matthew-B29882
@ 2012-11-02 2:14 ` Luo Zhenhua-B19537
2012-11-02 2:27 ` McClintock Matthew-B29882
0 siblings, 1 reply; 5+ messages in thread
From: Luo Zhenhua-B19537 @ 2012-11-02 2:14 UTC (permalink / raw)
To: McClintock Matthew-B29882, Joe MacDonald, Guo Chunrong-B40290
Cc: openembedded-devel@lists.openembedded.org
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [meta-oe ] inetutils: ifconfig -a includes interfaces without an address
2012-11-02 2:14 ` Luo Zhenhua-B19537
@ 2012-11-02 2:27 ` McClintock Matthew-B29882
0 siblings, 0 replies; 5+ messages in thread
From: McClintock Matthew-B29882 @ 2012-11-02 2:27 UTC (permalink / raw)
To: Luo Zhenhua-B19537
Cc: McClintock Matthew-B29882, Guo Chunrong-B40290,
openembedded-devel@lists.openembedded.org, Joe MacDonald
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
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-11-02 3:28 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-01 9:59 [meta-oe ] inetutils: ifconfig -a includes interfaces without an address Chunrong Guo
2012-11-01 14:27 ` Joe MacDonald
2012-11-01 15:19 ` McClintock Matthew-B29882
2012-11-02 2:14 ` Luo Zhenhua-B19537
2012-11-02 2:27 ` McClintock Matthew-B29882
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.