net.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright (c) 2021, Gunnar Beutner <gbeutner@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <errno.h>
  7. #include <net/if.h>
  8. #include <netinet/in.h>
  9. #include <string.h>
  10. #include <sys/ioctl.h>
  11. #include <sys/socket.h>
  12. in6_addr const in6addr_any = IN6ADDR_ANY_INIT;
  13. in6_addr const in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
  14. // https://pubs.opengroup.org/onlinepubs/9699919799/functions/if_nametoindex.html
  15. unsigned int if_nametoindex([[maybe_unused]] char const* ifname)
  16. {
  17. int dummy_socket = socket(AF_INET, SOCK_DGRAM, 0);
  18. if (dummy_socket < 0) {
  19. errno = -dummy_socket;
  20. return 0;
  21. }
  22. struct ifreq ifr;
  23. memcpy(ifr.ifr_name, ifname, IF_NAMESIZE);
  24. int rc = ioctl(dummy_socket, SIOCGIFINDEX, &ifr);
  25. if (rc) {
  26. errno = -rc;
  27. return 0;
  28. }
  29. return ifr.ifr_index;
  30. }
  31. // https://pubs.opengroup.org/onlinepubs/9699919799/functions/if_indextoname.html#tag_16_236
  32. char* if_indextoname([[maybe_unused]] unsigned int ifindex, [[maybe_unused]] char* ifname)
  33. {
  34. int dummy_socket = socket(AF_INET, SOCK_DGRAM, 0);
  35. if (dummy_socket < 0) {
  36. errno = -dummy_socket;
  37. return 0;
  38. }
  39. struct ifreq ifr;
  40. ifr.ifr_index = ifindex;
  41. int rc = ioctl(dummy_socket, SIOCGIFNAME, &ifr);
  42. if (rc) {
  43. errno = -rc;
  44. return nullptr;
  45. }
  46. memcpy(ifname, ifr.ifr_name, IF_NAMESIZE);
  47. return ifname;
  48. }
  49. // https://pubs.opengroup.org/onlinepubs/9699919799/functions/if_nameindex.html
  50. struct if_nameindex* if_nameindex()
  51. {
  52. errno = ENOSYS;
  53. return nullptr;
  54. }
  55. // https://pubs.opengroup.org/onlinepubs/9699919799/functions/if_freenameindex.html
  56. void if_freenameindex(struct if_nameindex*)
  57. {
  58. }