From: Jo-Philipp Wich Date: Sat, 3 Jan 2009 13:07:30 +0000 (+0000) Subject: enable support for getifaddrs() - required by lldpd X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=e0a77da8fbff4c4c43049254f3d892424025045c;p=openwrt%2Fstaging%2Fwigyori.git enable support for getifaddrs() - required by lldpd SVN-Revision: 13834 --- diff --git a/toolchain/uClibc/patches/170-enable-getifaddrs.patch b/toolchain/uClibc/patches/170-enable-getifaddrs.patch new file mode 100644 index 0000000000..da393feba9 --- /dev/null +++ b/toolchain/uClibc/patches/170-enable-getifaddrs.patch @@ -0,0 +1,162 @@ +Index: uclibc/libc/inet/ifaddrs.c +=================================================================== +--- uclibc.orig/libc/inet/ifaddrs.c ++++ uclibc/libc/inet/ifaddrs.c +@@ -38,6 +38,7 @@ + #include + + #include "netlinkaccess.h" ++#include "ifaddrs.h" + + libc_hidden_proto(socket) + libc_hidden_proto(close) +@@ -57,7 +58,6 @@ libc_hidden_proto(abort) + + + #if __ASSUME_NETLINK_SUPPORT +-#if 0 /* unused code */ + /* struct to hold the data for one ifaddrs entry, so we can allocate + everything at once. */ + struct ifaddrs_storage +@@ -74,8 +74,6 @@ struct ifaddrs_storage + } addr, netmask, broadaddr; + char name[IF_NAMESIZE + 1]; + }; +-#endif /* unused code */ +- + + void + __netlink_free_handle (struct netlink_handle *h) +@@ -323,8 +321,6 @@ __netlink_open (struct netlink_handle *h + return 0; + } + +- +-#if 0 /* unused code */ + /* We know the number of RTM_NEWLINK entries, so we reserve the first + # of entries for this type. All RTM_NEWADDR entries have an index + pointer to the RTM_NEWLINK entry. To find the entry, create +@@ -562,7 +558,7 @@ getifaddrs (struct ifaddrs **ifap) + if ((rta_payload + 1) <= sizeof (ifas[ifa_index].name)) + { + ifas[ifa_index].ifa.ifa_name = ifas[ifa_index].name; +- *(char *) __mempcpy (ifas[ifa_index].name, rta_data, ++ *(char *) mempcpy (ifas[ifa_index].name, rta_data, + rta_payload) = '\0'; + } + break; +@@ -761,7 +757,7 @@ getifaddrs (struct ifaddrs **ifap) + if (rta_payload + 1 <= sizeof (ifas[ifa_index].name)) + { + ifas[ifa_index].ifa.ifa_name = ifas[ifa_index].name; +- *(char *) __mempcpy (ifas[ifa_index].name, rta_data, ++ *(char *) mempcpy (ifas[ifa_index].name, rta_data, + rta_payload) = '\0'; + } + else +@@ -872,6 +868,4 @@ freeifaddrs (struct ifaddrs *ifa) + } + #endif + +-#endif /* unused code */ +- + #endif /* __ASSUME_NETLINK_SUPPORT */ +Index: uclibc/libc/inet/netlinkaccess.h +=================================================================== +--- uclibc.orig/libc/inet/netlinkaccess.h ++++ uclibc/libc/inet/netlinkaccess.h +@@ -61,14 +61,11 @@ struct netlink_handle + }; + + +-#if 0 /* unused code */ + #if __ASSUME_NETLINK_SUPPORT == 0 + extern int __no_netlink_support attribute_hidden; + #else + # define __no_netlink_support 0 + #endif +-#endif /* unused code */ +- + + extern int __netlink_open (struct netlink_handle *h) attribute_hidden; + extern void __netlink_close (struct netlink_handle *h) attribute_hidden; +Index: uclibc/include/ifaddrs.h +=================================================================== +--- /dev/null ++++ uclibc/include/ifaddrs.h +@@ -0,0 +1,74 @@ ++/* ifaddrs.h -- declarations for getting network interface addresses ++ Copyright (C) 2002 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ The GNU C Library 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 ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with the GNU C Library; if not, write to the Free ++ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA ++ 02111-1307 USA. */ ++ ++#ifndef _IFADDRS_H ++#define _IFADDRS_H 1 ++ ++#include ++#include ++ ++__BEGIN_DECLS ++ ++/* The `getifaddrs' function generates a linked list of these structures. ++ Each element of the list describes one network interface. */ ++struct ifaddrs ++{ ++ struct ifaddrs *ifa_next; /* Pointer to the next structure. */ ++ ++ char *ifa_name; /* Name of this network interface. */ ++ unsigned int ifa_flags; /* Flags as from SIOCGIFFLAGS ioctl. */ ++ ++ struct sockaddr *ifa_addr; /* Network address of this interface. */ ++ struct sockaddr *ifa_netmask; /* Netmask of this interface. */ ++ union ++ { ++ /* At most one of the following two is valid. If the IFF_BROADCAST ++ bit is set in `ifa_flags', then `ifa_broadaddr' is valid. If the ++ IFF_POINTOPOINT bit is set, then `ifa_dstaddr' is valid. ++ It is never the case that both these bits are set at once. */ ++ struct sockaddr *ifu_broadaddr; /* Broadcast address of this interface. */ ++ struct sockaddr *ifu_dstaddr; /* Point-to-point destination address. */ ++ } ifa_ifu; ++ /* These very same macros are defined by for `struct ifaddr'. ++ So if they are defined already, the existing definitions will be fine. */ ++# ifndef ifa_broadaddr ++# define ifa_broadaddr ifa_ifu.ifu_broadaddr ++# endif ++# ifndef ifa_dstaddr ++# define ifa_dstaddr ifa_ifu.ifu_dstaddr ++# endif ++ ++ void *ifa_data; /* Address-specific data (may be unused). */ ++}; ++ ++ ++/* Create a linked list of `struct ifaddrs' structures, one for each ++ network interface on the host machine. If successful, store the ++ list in *IFAP and return 0. On errors, return -1 and set `errno'. ++ ++ The storage returned in *IFAP is allocated dynamically and can ++ only be properly freed by passing it to `freeifaddrs'. */ ++extern int getifaddrs (struct ifaddrs **__ifap) __THROW; ++ ++/* Reclaim the storage allocated by a previous `getifaddrs' call. */ ++extern void freeifaddrs (struct ifaddrs *__ifa) __THROW; ++ ++__END_DECLS ++ ++#endif /* ifaddrs.h */ +