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 /* 43*fa556e83SGordon Bergling * From RFC 2553: 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 6936dcd97dSKristof Provost if (ifindex == 0) { 7036dcd97dSKristof Provost errno = ENXIO; 7136dcd97dSKristof Provost return(NULL); 7236dcd97dSKristof Provost } 7336dcd97dSKristof Provost 748071d8d7SHajimu UMEMOTO if (getifaddrs(&ifaddrs) < 0) 758071d8d7SHajimu UMEMOTO return(NULL); /* getifaddrs properly set errno */ 768071d8d7SHajimu UMEMOTO 778071d8d7SHajimu UMEMOTO for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) { 788071d8d7SHajimu UMEMOTO if (ifa->ifa_addr && 798071d8d7SHajimu UMEMOTO ifa->ifa_addr->sa_family == AF_LINK && 80cf0d539fSMarcel Moolenaar ifindex == LLINDEX((struct sockaddr_dl*)ifa->ifa_addr)) 818071d8d7SHajimu UMEMOTO break; 828071d8d7SHajimu UMEMOTO } 838071d8d7SHajimu UMEMOTO 848071d8d7SHajimu UMEMOTO if (ifa == NULL) { 858071d8d7SHajimu UMEMOTO error = ENXIO; 868071d8d7SHajimu UMEMOTO ifname = NULL; 878071d8d7SHajimu UMEMOTO } 888071d8d7SHajimu UMEMOTO else 898071d8d7SHajimu UMEMOTO strncpy(ifname, ifa->ifa_name, IFNAMSIZ); 908071d8d7SHajimu UMEMOTO 918071d8d7SHajimu UMEMOTO freeifaddrs(ifaddrs); 928071d8d7SHajimu UMEMOTO 938071d8d7SHajimu UMEMOTO errno = error; 948071d8d7SHajimu UMEMOTO return(ifname); 958071d8d7SHajimu UMEMOTO } 96