1*0c0346aeSpooka /* $NetBSD: if_indextoname.c,v 1.7 2010/12/13 23:10:12 pooka Exp $ */
21bc25f59Sitojun /* $KAME: if_indextoname.c,v 1.7 2000/11/08 03:09:30 itojun Exp $ */
392db021bSitojun
492db021bSitojun /*-
592db021bSitojun * Copyright (c) 1997, 2000
692db021bSitojun * Berkeley Software Design, Inc. All rights reserved.
792db021bSitojun *
892db021bSitojun * Redistribution and use in source and binary forms, with or without
992db021bSitojun * modification, are permitted provided that the following conditions
1092db021bSitojun * are met:
1192db021bSitojun * 1. Redistributions of source code must retain the above copyright
1292db021bSitojun * notice, this list of conditions and the following disclaimer.
1392db021bSitojun *
1492db021bSitojun * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
1592db021bSitojun * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1692db021bSitojun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1792db021bSitojun * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
1892db021bSitojun * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1992db021bSitojun * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2092db021bSitojun * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2192db021bSitojun * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2292db021bSitojun * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2392db021bSitojun * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2492db021bSitojun * SUCH DAMAGE.
2592db021bSitojun *
2692db021bSitojun * BSDI Id: if_indextoname.c,v 2.3 2000/04/17 22:38:05 dab Exp
2792db021bSitojun */
2892db021bSitojun
2972eddcacSitojun #include <sys/cdefs.h>
3072eddcacSitojun #if defined(LIBC_SCCS) && !defined(lint)
31*0c0346aeSpooka __RCSID("$NetBSD: if_indextoname.c,v 1.7 2010/12/13 23:10:12 pooka Exp $");
3272eddcacSitojun #endif /* LIBC_SCCS and not lint */
3372eddcacSitojun
345f35396eSpooka #ifndef RUMP_ACTION
3592db021bSitojun #include "namespace.h"
365f35396eSpooka #endif
3792db021bSitojun #include <sys/types.h>
3892db021bSitojun #include <sys/socket.h>
3992db021bSitojun #include <net/if_dl.h>
4092db021bSitojun #include <net/if.h>
4192db021bSitojun #include <ifaddrs.h>
4292db021bSitojun #include <stdlib.h>
4392db021bSitojun #include <string.h>
441bc25f59Sitojun #include <errno.h>
4592db021bSitojun
46*0c0346aeSpooka #ifndef RUMP_ACTION
4792db021bSitojun #ifdef __weak_alias
__weak_alias(if_indextoname,_if_indextoname)4892db021bSitojun __weak_alias(if_indextoname,_if_indextoname)
4992db021bSitojun #endif
50*0c0346aeSpooka #endif
5192db021bSitojun
5292db021bSitojun /*
531bc25f59Sitojun * From RFC 2533:
5492db021bSitojun *
5592db021bSitojun * The second function maps an interface index into its corresponding
5692db021bSitojun * name.
5792db021bSitojun *
5892db021bSitojun * #include <net/if.h>
5992db021bSitojun *
6092db021bSitojun * char *if_indextoname(unsigned int ifindex, char *ifname);
6192db021bSitojun *
621bc25f59Sitojun * The ifname argument must point to a buffer of at least IF_NAMESIZE
631bc25f59Sitojun * bytes into which the interface name corresponding to the specified
641bc25f59Sitojun * index is returned. (IF_NAMESIZE is also defined in <net/if.h> and
651bc25f59Sitojun * its value includes a terminating null byte at the end of the
661bc25f59Sitojun * interface name.) This pointer is also the return value of the
671bc25f59Sitojun * function. If there is no interface corresponding to the specified
681bc25f59Sitojun * index, NULL is returned, and errno is set to ENXIO, if there was a
691bc25f59Sitojun * system error (such as running out of memory), if_indextoname returns
701bc25f59Sitojun * NULL and errno would be set to the proper value (e.g., ENOMEM).
7192db021bSitojun */
7292db021bSitojun
7392db021bSitojun char *
7492db021bSitojun if_indextoname(unsigned int ifindex, char *ifname)
7592db021bSitojun {
7692db021bSitojun struct ifaddrs *ifaddrs, *ifa;
771bc25f59Sitojun int error = 0;
7892db021bSitojun
7992db021bSitojun if (getifaddrs(&ifaddrs) < 0)
801bc25f59Sitojun return(NULL); /* getifaddrs properly set errno */
8192db021bSitojun
8292db021bSitojun for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
8392db021bSitojun if (ifa->ifa_addr &&
8492db021bSitojun ifa->ifa_addr->sa_family == AF_LINK &&
8597072423Schristos ifindex == ((struct sockaddr_dl*)
8697072423Schristos (void *)ifa->ifa_addr)->sdl_index)
8792db021bSitojun break;
8892db021bSitojun }
8992db021bSitojun
901bc25f59Sitojun if (ifa == NULL) {
911bc25f59Sitojun error = ENXIO;
9292db021bSitojun ifname = NULL;
931bc25f59Sitojun }
9492db021bSitojun else
95020be40eSelad strlcpy(ifname, ifa->ifa_name, IFNAMSIZ);
9692db021bSitojun
9792db021bSitojun freeifaddrs(ifaddrs);
9892db021bSitojun
991bc25f59Sitojun errno = error;
10092db021bSitojun return(ifname);
10192db021bSitojun }
102