From: Chunrong Guo <[email protected]> *ifconfig/if_index.c (if_nameindex): Remove local variables `ifc', `i', `rq_len', `last_len', `ifr', `end', `cur'. Add local variables `content', `it', `length', `index'. Remove code that uses the SIOCGIFCONF ioctl to get the interfaces list. Parse the PATH_PROCNET_DEV file to fetch the list of interfaces.
Signed-off-by: Chunrong Guo <[email protected]> --- 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 <[email protected]> +--- + inetutils-1.8/lib/read-file.c | 191 +++++++++++++++++++++++++++++++++++++++++ + inetutils-1.8/lib/read-file.h | 36 ++++++++ + 2 files changed, 227 insertions(+) + create mode 100644 inetutils-1.8/lib/read-file.c + create mode 100644 inetutils-1.8/lib/read-file.h + +diff --git a/lib/read-file.c b/lib/read-file.c +new file mode 100644 +index 0000000..ba7aef3 +--- /dev/null ++++ b/lib/read-file.c +@@ -0,0 +1,191 @@ ++/* -*- buffer-read-only: t -*- vi: set ro: */ ++/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ ++/* read-file.c -- read file contents into a string ++ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. ++ Written by Simon Josefsson and Bruno Haible. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ ++ ++#include <config.h> ++ ++#include "read-file.h" ++ ++/* Get fstat. */ ++#include <sys/stat.h> ++ ++/* Get ftello. */ ++#include <stdio.h> ++ ++/* Get SIZE_MAX. */ ++#include <stdint.h> ++ ++/* Get malloc, realloc, free. */ ++#include <stdlib.h> ++ ++/* Get errno. */ ++#include <errno.h> ++ ++/* Read a STREAM and return a newly allocated string with the content, ++ and set *LENGTH to the length of the string. The string is ++ zero-terminated, but the terminating zero byte is not counted in ++ *LENGTH. On errors, *LENGTH is undefined, errno preserves the ++ values set by system functions (if any), and NULL is returned. */ ++char * ++fread_file (FILE *stream, size_t *length) ++{ ++ char *buf = NULL; ++ size_t alloc = BUFSIZ; ++ ++ /* For a regular file, allocate a buffer that has exactly the right ++ size. This avoids the need to do dynamic reallocations later. */ ++ { ++ struct stat st; ++ ++ if (fstat (fileno (stream), &st) >= 0 && S_ISREG (st.st_mode)) ++ { ++ off_t pos = ftello (stream); ++ ++ if (pos >= 0 && pos < st.st_size) ++ { ++ off_t alloc_off = st.st_size - pos; ++ ++ /* '1' below, accounts for the trailing NUL. */ ++ if (SIZE_MAX - 1 < alloc_off) ++ { ++ errno = ENOMEM; ++ return NULL; ++ } ++ ++ alloc = alloc_off + 1; ++ } ++ } ++ } ++ ++ if (!(buf = malloc (alloc))) ++ return NULL; /* errno is ENOMEM. */ ++ ++ { ++ size_t size = 0; /* number of bytes read so far */ ++ int save_errno; ++ ++ for (;;) ++ { ++ /* This reads 1 more than the size of a regular file ++ so that we get eof immediately. */ ++ size_t requested = alloc - size; ++ size_t count = fread (buf + size, 1, requested, stream); ++ size += count; ++ ++ if (count != requested) ++ { ++ save_errno = errno; ++ if (ferror (stream)) ++ break; ++ ++ /* Shrink the allocated memory if possible. */ ++ if (size < alloc - 1) ++ { ++ char *smaller_buf = realloc (buf, size + 1); ++ if (smaller_buf != NULL) ++ buf = smaller_buf; ++ } ++ ++ buf[size] = '\0'; ++ *length = size; ++ return buf; ++ } ++ ++ { ++ char *new_buf; ++ ++ if (alloc == SIZE_MAX) ++ { ++ save_errno = ENOMEM; ++ break; ++ } ++ ++ if (alloc < SIZE_MAX - alloc / 2) ++ alloc = alloc + alloc / 2; ++ else ++ alloc = SIZE_MAX; ++ ++ if (!(new_buf = realloc (buf, alloc))) ++ { ++ save_errno = errno; ++ break; ++ } ++ ++ buf = new_buf; ++ } ++ } ++ ++ free (buf); ++ errno = save_errno; ++ return NULL; ++ } ++} ++ ++static char * ++internal_read_file (const char *filename, size_t *length, const char *mode) ++{ ++ FILE *stream = fopen (filename, mode); ++ char *out; ++ int save_errno; ++ ++ if (!stream) ++ return NULL; ++ ++ out = fread_file (stream, length); ++ ++ save_errno = errno; ++ ++ if (fclose (stream) != 0) ++ { ++ if (out) ++ { ++ save_errno = errno; ++ free (out); ++ } ++ errno = save_errno; ++ return NULL; ++ } ++ ++ return out; ++} ++ ++/* Open and read the contents of FILENAME, and return a newly ++ allocated string with the content, and set *LENGTH to the length of ++ the string. The string is zero-terminated, but the terminating ++ zero byte is not counted in *LENGTH. On errors, *LENGTH is ++ undefined, errno preserves the values set by system functions (if ++ any), and NULL is returned. */ ++char * ++read_file (const char *filename, size_t *length) ++{ ++ return internal_read_file (filename, length, "r"); ++} ++ ++/* Open (on non-POSIX systems, in binary mode) and read the contents ++ of FILENAME, and return a newly allocated string with the content, ++ and set LENGTH to the length of the string. The string is ++ zero-terminated, but the terminating zero byte is not counted in ++ the LENGTH variable. On errors, *LENGTH is undefined, errno ++ preserves the values set by system functions (if any), and NULL is ++ returned. */ ++char * ++read_binary_file (const char *filename, size_t *length) ++{ ++ return internal_read_file (filename, length, "rb"); ++} + +diff --git a/lib/read-file.h b/lib/read-file.h +index 0000000..14041dc +--- /dev/null ++++ b/lib/read-file.h +@@ -0,0 +1,36 @@ ++/* -*- buffer-read-only: t -*- vi: set ro: */ ++/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ ++/* read-file.h -- read file contents into a string ++ Copyright (C) 2006, 2009-2011 Free Software Foundation, Inc. ++ Written by Simon Josefsson. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software Foundation, ++ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ ++ ++#ifndef READ_FILE_H ++#define READ_FILE_H ++ ++/* Get size_t. */ ++#include <stddef.h> ++ ++/* Get FILE. */ ++#include <stdio.h> ++ ++extern char *fread_file (FILE * stream, size_t * length); ++ ++extern char *read_file (const char *filename, size_t * length); ++ ++extern char *read_binary_file (const char *filename, size_t * length); ++ ++#endif /* READ_FILE_H */ +-- +1.7.9.7 + diff --git a/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" - -- 1.7.9.7 _______________________________________________ yocto mailing list [email protected] https://lists.yoctoproject.org/listinfo/yocto
