* [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.