diff options
author | cvs2git <rtems-devel@rtems.org> | 2009-07-13 14:20:38 +0000 |
---|---|---|
committer | cvs2git <rtems-devel@rtems.org> | 2009-07-13 14:20:38 +0000 |
commit | 31f25514fb558b81b48038ccd789b087a093c9ed (patch) | |
tree | f446f9da6ccebd990a023077a7f5ff1c4933898a /cpukit/libnetworking/libc/if_indextoname.c | |
parent | 2008-02-14 Joel Sherrill <joel.sherrill@OARcorp.com> (diff) | |
download | rtems-d63b003c6f9c52fcbedbbfcc4d74f97012a15183.tar.bz2 |
This commit was manufactured by cvs2svn to create tag 'rtems-4-8-0'.4.8.0
Sprout from rtems-4-8-branch 2008-02-14 17:31:53 UTC Joel Sherrill <joel.sherrill@OARcorp.com> '2008-02-14 Joel Sherrill <joel.sherrill@OARcorp.com>'
Cherrypick from rtems-4-8-branch 2009-07-13 14:20:37 UTC cvs2git <rtems-devel@rtems.org> 'This commit was manufactured by cvs2svn to create branch 'rtems-4-8-branch'.':
contrib/crossrpms/patches/gdb-6.5-bfinrtems-20071114.diff
cpukit/libnetworking/ifaddrs.h
cpukit/libnetworking/libc/getifaddrs.c
cpukit/libnetworking/libc/if_indextoname.c
cpukit/libnetworking/libc/if_nameindex.c
Diffstat (limited to 'cpukit/libnetworking/libc/if_indextoname.c')
-rw-r--r-- | cpukit/libnetworking/libc/if_indextoname.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/cpukit/libnetworking/libc/if_indextoname.c b/cpukit/libnetworking/libc/if_indextoname.c new file mode 100644 index 0000000000..89e9f2fd66 --- /dev/null +++ b/cpukit/libnetworking/libc/if_indextoname.c @@ -0,0 +1,87 @@ +/* $KAME: if_indextoname.c,v 1.7 2000/11/08 03:09:30 itojun Exp $ */ + +/*- + * Copyright (c) 1997, 2000 + * Berkeley Software Design, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * BSDI Id: if_indextoname.c,v 2.3 2000/04/17 22:38:05 dab Exp + */ + +#include <rtems/bsd/sys/cdefs.h> + +#include <sys/types.h> +#include <sys/socket.h> +#include <net/if_dl.h> +#include <net/if.h> +#include <ifaddrs.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +/* + * From RFC 2533: + * + * The second function maps an interface index into its corresponding + * name. + * + * #include <net/if.h> + * + * char *if_indextoname(unsigned int ifindex, char *ifname); + * + * The ifname argument must point to a buffer of at least IF_NAMESIZE + * bytes into which the interface name corresponding to the specified + * index is returned. (IF_NAMESIZE is also defined in <net/if.h> and + * its value includes a terminating null byte at the end of the + * interface name.) This pointer is also the return value of the + * function. If there is no interface corresponding to the specified + * index, NULL is returned, and errno is set to ENXIO, if there was a + * system error (such as running out of memory), if_indextoname returns + * NULL and errno would be set to the proper value (e.g., ENOMEM). + */ + +char * +if_indextoname(unsigned int ifindex, char *ifname) +{ + struct ifaddrs *ifaddrs, *ifa; + int error = 0; + + if (getifaddrs(&ifaddrs) < 0) + return(NULL); /* getifaddrs properly set errno */ + + for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr && + ifa->ifa_addr->sa_family == AF_LINK && + ifindex == ((struct sockaddr_dl*)ifa->ifa_addr)->sdl_index) + break; + } + + if (ifa == NULL) { + error = ENXIO; + ifname = NULL; + } + else + strncpy(ifname, ifa->ifa_name, IFNAMSIZ); + + freeifaddrs(ifaddrs); + + errno = error; + return(ifname); +} |