diff options
author | jow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-01-03 13:07:30 +0000 |
---|---|---|
committer | jow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-01-03 13:07:30 +0000 |
commit | 4469532cd6f4596a81ac16f2b3765cf2fae6712c (patch) | |
tree | d6f2cb20ca1191d2ae85f7cff0456f302fde6cbf /toolchain/uClibc/patches | |
parent | 68da30977e302ae617c452ecc042fbb12d793a4b (diff) |
[uClibc] enable support for getifaddrs() - required by lldpd
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13834 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'toolchain/uClibc/patches')
-rw-r--r-- | toolchain/uClibc/patches/170-enable-getifaddrs.patch | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/toolchain/uClibc/patches/170-enable-getifaddrs.patch b/toolchain/uClibc/patches/170-enable-getifaddrs.patch new file mode 100644 index 000000000..da393feba --- /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 <unistd.h> + + #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 <features.h> ++#include <sys/socket.h> ++ ++__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 <net/if.h> 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 */ + |