lib/libc/net/if_indextoname.c

http://www.minix3.org/ · C · 101 lines · 44 code · 11 blank · 46 comment · 9 complexity · 0df90dedd6ca94766db6b05859f3e76e MD5 · raw file

  1. /* $NetBSD: if_indextoname.c,v 1.7 2010/12/13 23:10:12 pooka Exp $ */
  2. /* $KAME: if_indextoname.c,v 1.7 2000/11/08 03:09:30 itojun Exp $ */
  3. /*-
  4. * Copyright (c) 1997, 2000
  5. * Berkeley Software Design, Inc. All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. *
  13. * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND
  14. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  15. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  16. * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE
  17. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  18. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  19. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  20. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  21. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  22. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  23. * SUCH DAMAGE.
  24. *
  25. * BSDI Id: if_indextoname.c,v 2.3 2000/04/17 22:38:05 dab Exp
  26. */
  27. #include <sys/cdefs.h>
  28. #if defined(LIBC_SCCS) && !defined(lint)
  29. __RCSID("$NetBSD: if_indextoname.c,v 1.7 2010/12/13 23:10:12 pooka Exp $");
  30. #endif /* LIBC_SCCS and not lint */
  31. #ifndef RUMP_ACTION
  32. #include "namespace.h"
  33. #endif
  34. #include <sys/types.h>
  35. #include <sys/socket.h>
  36. #include <net/if_dl.h>
  37. #include <net/if.h>
  38. #include <ifaddrs.h>
  39. #include <stdlib.h>
  40. #include <string.h>
  41. #include <errno.h>
  42. #ifndef RUMP_ACTION
  43. #ifdef __weak_alias
  44. __weak_alias(if_indextoname,_if_indextoname)
  45. #endif
  46. #endif
  47. /*
  48. * From RFC 2533:
  49. *
  50. * The second function maps an interface index into its corresponding
  51. * name.
  52. *
  53. * #include <net/if.h>
  54. *
  55. * char *if_indextoname(unsigned int ifindex, char *ifname);
  56. *
  57. * The ifname argument must point to a buffer of at least IF_NAMESIZE
  58. * bytes into which the interface name corresponding to the specified
  59. * index is returned. (IF_NAMESIZE is also defined in <net/if.h> and
  60. * its value includes a terminating null byte at the end of the
  61. * interface name.) This pointer is also the return value of the
  62. * function. If there is no interface corresponding to the specified
  63. * index, NULL is returned, and errno is set to ENXIO, if there was a
  64. * system error (such as running out of memory), if_indextoname returns
  65. * NULL and errno would be set to the proper value (e.g., ENOMEM).
  66. */
  67. char *
  68. if_indextoname(unsigned int ifindex, char *ifname)
  69. {
  70. struct ifaddrs *ifaddrs, *ifa;
  71. int error = 0;
  72. if (getifaddrs(&ifaddrs) < 0)
  73. return(NULL); /* getifaddrs properly set errno */
  74. for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
  75. if (ifa->ifa_addr &&
  76. ifa->ifa_addr->sa_family == AF_LINK &&
  77. ifindex == ((struct sockaddr_dl*)
  78. (void *)ifa->ifa_addr)->sdl_index)
  79. break;
  80. }
  81. if (ifa == NULL) {
  82. error = ENXIO;
  83. ifname = NULL;
  84. }
  85. else
  86. strlcpy(ifname, ifa->ifa_name, IFNAMSIZ);
  87. freeifaddrs(ifaddrs);
  88. errno = error;
  89. return(ifname);
  90. }