rt-addr.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <ynl.h>
  5. #include <arpa/inet.h>
  6. #include <net/if.h>
  7. #include "rt-addr-user.h"
  8. static void rt_addr_print(struct rt_addr_getaddr_rsp *a)
  9. {
  10. char ifname[IF_NAMESIZE];
  11. char addr_str[64];
  12. const char *addr;
  13. const char *name;
  14. name = if_indextoname(a->_hdr.ifa_index, ifname);
  15. if (name)
  16. printf("%16s: ", name);
  17. switch (a->_len.address) {
  18. case 4:
  19. addr = inet_ntop(AF_INET, a->address,
  20. addr_str, sizeof(addr_str));
  21. break;
  22. case 16:
  23. addr = inet_ntop(AF_INET6, a->address,
  24. addr_str, sizeof(addr_str));
  25. break;
  26. default:
  27. addr = NULL;
  28. break;
  29. }
  30. if (addr)
  31. printf("%s", addr);
  32. else
  33. printf("[%d]", a->_len.address);
  34. printf("\n");
  35. }
  36. int main(int argc, char **argv)
  37. {
  38. struct rt_addr_getaddr_list *rsp;
  39. struct rt_addr_getaddr_req *req;
  40. struct ynl_error yerr;
  41. struct ynl_sock *ys;
  42. ys = ynl_sock_create(&ynl_rt_addr_family, &yerr);
  43. if (!ys) {
  44. fprintf(stderr, "YNL: %s\n", yerr.msg);
  45. return 1;
  46. }
  47. req = rt_addr_getaddr_req_alloc();
  48. if (!req)
  49. goto err_destroy;
  50. rsp = rt_addr_getaddr_dump(ys, req);
  51. rt_addr_getaddr_req_free(req);
  52. if (!rsp)
  53. goto err_close;
  54. if (ynl_dump_empty(rsp))
  55. fprintf(stderr, "Error: no addresses reported\n");
  56. ynl_dump_foreach(rsp, addr)
  57. rt_addr_print(addr);
  58. rt_addr_getaddr_list_free(rsp);
  59. ynl_sock_destroy(ys);
  60. return 0;
  61. err_close:
  62. fprintf(stderr, "YNL: %s\n", ys->err.msg);
  63. err_destroy:
  64. ynl_sock_destroy(ys);
  65. return 2;
  66. }