From: Joe MacDonald <Joe.MacDonald@windriver.com>
To: <b40290@freescale.com>
Cc: yocto@yoctoproject.org
Subject: Re: [meta-fsl-ppc denzil] inetutils_1.8.bbapend: ifconfig -a includes interfaces without an address
Date: Wed, 31 Oct 2012 08:42:57 -0400 [thread overview]
Message-ID: <20121031124257.GD3265@windriver.com> (raw)
In-Reply-To: <1351663699-6121-1-git-send-email-b40290@freescale.com>
[-- Attachment #1: Type: text/plain, Size: 17928 bytes --]
[[yocto] [meta-fsl-ppc denzil] inetutils_1.8.bbapend: ifconfig -a includes interfaces without an address] On 12.10.31 (Wed 01:08) b40290@freescale.com wrote:
> From: Chunrong Guo <b40290@freescale.com>
>
> *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>
What's the problem you're trying to solve here?
Also, I think you're working in meta-oe here, so you probably wanted to
send this to openembedded-devel@lists.openembedded.org, per the README
in the meta-oe layer.
-J.
> ---
> recipes-append/inetutils/files/15.patch | 197 +++++++++++++++
> recipes-append/inetutils/files/add-module.patch | 18 ++
> recipes-append/inetutils/files/add-readfile.patch | 250 ++++++++++++++++++++
> recipes-append/inetutils/inetutils_1.8.bbappend | 8 +
> .../net-tools/net-tools_1.60-23.bbappend | 9 -
> 5 files changed, 473 insertions(+), 9 deletions(-)
> create mode 100644 recipes-append/inetutils/files/15.patch
> create mode 100644 recipes-append/inetutils/files/add-module.patch
> create mode 100644 recipes-append/inetutils/files/add-readfile.patch
> create mode 100644 recipes-append/inetutils/inetutils_1.8.bbappend
> delete mode 100644 recipes-append/net-tools/net-tools_1.60-23.bbappend
>
> diff --git a/recipes-append/inetutils/files/15.patch b/recipes-append/inetutils/files/15.patch
> new file mode 100644
> index 0000000..c2d4f11
> --- /dev/null
> +++ b/recipes-append/inetutils/files/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/recipes-append/inetutils/files/add-module.patch b/recipes-append/inetutils/files/add-module.patch
> new file mode 100644
> index 0000000..7acc3a4
> --- /dev/null
> +++ b/recipes-append/inetutils/files/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/recipes-append/inetutils/files/add-readfile.patch b/recipes-append/inetutils/files/add-readfile.patch
> new file mode 100644
> index 0000000..bb18ae9
> --- /dev/null
> +++ b/recipes-append/inetutils/files/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/recipes-append/inetutils/inetutils_1.8.bbappend b/recipes-append/inetutils/inetutils_1.8.bbappend
> new file mode 100644
> index 0000000..8134a27
> --- /dev/null
> +++ b/recipes-append/inetutils/inetutils_1.8.bbappend
> @@ -0,0 +1,8 @@
> +FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
> +
> +
> +SRC_URI += "file://add-readfile.patch \
> + file://15.patch \
> + file://add-module.patch \
> + "
> +PR_append_fsl = "+${DISTRO}.0"
> diff --git a/recipes-append/net-tools/net-tools_1.60-23.bbappend b/recipes-append/net-tools/net-tools_1.60-23.bbappend
> deleted file mode 100644
> index b780bac..0000000
> --- a/recipes-append/net-tools/net-tools_1.60-23.bbappend
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -PR_append_fsl = "+${DISTRO}.0"
> -
> -inherit update-alternatives
> -
> -ALTERNATIVE_NAME_fsl = "ifconfig"
> -ALTERNATIVE_LINK_fsl = "${base_sbindir}/ifconfig"
> -ALTERNATIVE_PATH_fsl = "${base_sbindir}/ifconfig.net-tools"
> -ALTERNATIVE_PRIORITY_fsl = "200"
> -
--
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 --]
next prev parent reply other threads:[~2012-10-31 12:43 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-31 6:08 [meta-fsl-ppc denzil] inetutils_1.8.bbapend: ifconfig -a includes interfaces without an address b40290
2012-10-31 12:42 ` Joe MacDonald [this message]
2012-10-31 16:00 ` McClintock Matthew-B29882
2012-11-01 6:50 ` chunrongguo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121031124257.GD3265@windriver.com \
--to=joe.macdonald@windriver.com \
--cc=b40290@freescale.com \
--cc=yocto@yoctoproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.