xref: /freebsd/lib/libc/net/if_indextoname.c (revision 9b10f59a)
18071d8d7SHajimu UMEMOTO /*	$KAME: if_indextoname.c,v 1.7 2000/11/08 03:09:30 itojun Exp $	*/
28071d8d7SHajimu UMEMOTO 
38071d8d7SHajimu UMEMOTO /*-
49b10f59aSPedro F. Giffuni  * SPDX-License-Identifier: BSD-1-Clause
59b10f59aSPedro F. Giffuni  *
68071d8d7SHajimu UMEMOTO  * Copyright (c) 1997, 2000
78071d8d7SHajimu UMEMOTO  *	Berkeley Software Design, Inc.  All rights reserved.
88071d8d7SHajimu UMEMOTO  *
98071d8d7SHajimu UMEMOTO  * Redistribution and use in source and binary forms, with or without
108071d8d7SHajimu UMEMOTO  * modification, are permitted provided that the following conditions
118071d8d7SHajimu UMEMOTO  * are met:
128071d8d7SHajimu UMEMOTO  * 1. Redistributions of source code must retain the above copyright
138071d8d7SHajimu UMEMOTO  *    notice, this list of conditions and the following disclaimer.
148071d8d7SHajimu UMEMOTO  *
158071d8d7SHajimu UMEMOTO  * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
168071d8d7SHajimu UMEMOTO  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
178071d8d7SHajimu UMEMOTO  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
188071d8d7SHajimu UMEMOTO  * ARE DISCLAIMED.  IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
198071d8d7SHajimu UMEMOTO  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
208071d8d7SHajimu UMEMOTO  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
218071d8d7SHajimu UMEMOTO  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
228071d8d7SHajimu UMEMOTO  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
238071d8d7SHajimu UMEMOTO  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
248071d8d7SHajimu UMEMOTO  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
258071d8d7SHajimu UMEMOTO  * SUCH DAMAGE.
268071d8d7SHajimu UMEMOTO  *
278071d8d7SHajimu UMEMOTO  *	BSDI Id: if_indextoname.c,v 2.3 2000/04/17 22:38:05 dab Exp
288071d8d7SHajimu UMEMOTO  */
298071d8d7SHajimu UMEMOTO 
308071d8d7SHajimu UMEMOTO #include <sys/cdefs.h>
318071d8d7SHajimu UMEMOTO __FBSDID("$FreeBSD$");
328071d8d7SHajimu UMEMOTO 
338071d8d7SHajimu UMEMOTO #include <sys/types.h>
348071d8d7SHajimu UMEMOTO #include <sys/socket.h>
358071d8d7SHajimu UMEMOTO #include <net/if_dl.h>
368071d8d7SHajimu UMEMOTO #include <net/if.h>
378071d8d7SHajimu UMEMOTO #include <ifaddrs.h>
388071d8d7SHajimu UMEMOTO #include <stdlib.h>
398071d8d7SHajimu UMEMOTO #include <string.h>
408071d8d7SHajimu UMEMOTO #include <errno.h>
418071d8d7SHajimu UMEMOTO 
428071d8d7SHajimu UMEMOTO /*
438071d8d7SHajimu UMEMOTO  * From RFC 2533:
448071d8d7SHajimu UMEMOTO  *
458071d8d7SHajimu UMEMOTO  * The second function maps an interface index into its corresponding
468071d8d7SHajimu UMEMOTO  * name.
478071d8d7SHajimu UMEMOTO  *
488071d8d7SHajimu UMEMOTO  *    #include <net/if.h>
498071d8d7SHajimu UMEMOTO  *
508071d8d7SHajimu UMEMOTO  *    char  *if_indextoname(unsigned int ifindex, char *ifname);
518071d8d7SHajimu UMEMOTO  *
528071d8d7SHajimu UMEMOTO  * The ifname argument must point to a buffer of at least IF_NAMESIZE
538071d8d7SHajimu UMEMOTO  * bytes into which the interface name corresponding to the specified
548071d8d7SHajimu UMEMOTO  * index is returned.  (IF_NAMESIZE is also defined in <net/if.h> and
558071d8d7SHajimu UMEMOTO  * its value includes a terminating null byte at the end of the
568071d8d7SHajimu UMEMOTO  * interface name.) This pointer is also the return value of the
578071d8d7SHajimu UMEMOTO  * function.  If there is no interface corresponding to the specified
588071d8d7SHajimu UMEMOTO  * index, NULL is returned, and errno is set to ENXIO, if there was a
598071d8d7SHajimu UMEMOTO  * system error (such as running out of memory), if_indextoname returns
608071d8d7SHajimu UMEMOTO  * NULL and errno would be set to the proper value (e.g., ENOMEM).
618071d8d7SHajimu UMEMOTO  */
628071d8d7SHajimu UMEMOTO 
638071d8d7SHajimu UMEMOTO char *
648071d8d7SHajimu UMEMOTO if_indextoname(unsigned int ifindex, char *ifname)
658071d8d7SHajimu UMEMOTO {
668071d8d7SHajimu UMEMOTO 	struct ifaddrs *ifaddrs, *ifa;
678071d8d7SHajimu UMEMOTO 	int error = 0;
688071d8d7SHajimu UMEMOTO 
698071d8d7SHajimu UMEMOTO 	if (getifaddrs(&ifaddrs) < 0)
708071d8d7SHajimu UMEMOTO 		return(NULL);	/* getifaddrs properly set errno */
718071d8d7SHajimu UMEMOTO 
728071d8d7SHajimu UMEMOTO 	for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
738071d8d7SHajimu UMEMOTO 		if (ifa->ifa_addr &&
748071d8d7SHajimu UMEMOTO 		    ifa->ifa_addr->sa_family == AF_LINK &&
75cf0d539fSMarcel Moolenaar 		    ifindex == LLINDEX((struct sockaddr_dl*)ifa->ifa_addr))
768071d8d7SHajimu UMEMOTO 			break;
778071d8d7SHajimu UMEMOTO 	}
788071d8d7SHajimu UMEMOTO 
798071d8d7SHajimu UMEMOTO 	if (ifa == NULL) {
808071d8d7SHajimu UMEMOTO 		error = ENXIO;
818071d8d7SHajimu UMEMOTO 		ifname = NULL;
828071d8d7SHajimu UMEMOTO 	}
838071d8d7SHajimu UMEMOTO 	else
848071d8d7SHajimu UMEMOTO 		strncpy(ifname, ifa->ifa_name, IFNAMSIZ);
858071d8d7SHajimu UMEMOTO 
868071d8d7SHajimu UMEMOTO 	freeifaddrs(ifaddrs);
878071d8d7SHajimu UMEMOTO 
888071d8d7SHajimu UMEMOTO 	errno = error;
898071d8d7SHajimu UMEMOTO 	return(ifname);
908071d8d7SHajimu UMEMOTO }
91