mynetstat.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "unproute.h"
  2. void pr_rtable(int);
  3. void pr_iflist(int);
  4. int
  5. main(int argc, char **argv)
  6. {
  7. int family;
  8. if (argc != 2)
  9. err_quit("usage: mynetstat <inet4|inet6|all>");
  10. if (strcmp(argv[1], "inet4") == 0)
  11. family = AF_INET;
  12. #ifdef AF_INET6
  13. else if (strcmp(argv[1], "inet6") == 0)
  14. family = AF_INET6;
  15. #endif
  16. else if (strcmp(argv[1], "all") == 0)
  17. family = 0;
  18. else
  19. err_quit("invalid <address-family>");
  20. pr_rtable(family);
  21. pr_iflist(family);
  22. exit(0);
  23. }
  24. void
  25. pr_rtable(int family)
  26. {
  27. char *buf, *next, *lim;
  28. size_t len;
  29. struct rt_msghdr *rtm;
  30. struct sockaddr *sa, *rti_info[RTAX_MAX];
  31. buf = Net_rt_dump(family, 0, &len);
  32. lim = buf + len;
  33. for (next = buf; next < lim; next += rtm->rtm_msglen) {
  34. rtm = (struct rt_msghdr *) next;
  35. sa = (struct sockaddr *)(rtm + 1);
  36. get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
  37. if ( (sa = rti_info[RTAX_DST]) != NULL)
  38. printf("dest: %s", sock_ntop(sa, sa->sa_len));
  39. if ( (sa = rti_info[RTAX_GATEWAY]) != NULL)
  40. printf(", gateway: %s", sock_ntop(sa, sa->sa_len));
  41. printf("\n");
  42. }
  43. }
  44. void
  45. pr_iflist(int family)
  46. {
  47. int flags;
  48. char *buf, *next, *lim;
  49. u_char *ptr;
  50. size_t len;
  51. struct if_msghdr *ifm;
  52. struct ifa_msghdr *ifam;
  53. struct sockaddr *sa, *rti_info[RTAX_MAX];
  54. struct sockaddr_dl *sdl;
  55. buf = Net_rt_iflist(family, 0, &len);
  56. lim = buf + len;
  57. for (next = buf; next < lim; next += ifm->ifm_msglen) {
  58. ifm = (struct if_msghdr *) next;
  59. if (ifm->ifm_type == RTM_IFINFO) {
  60. sa = (struct sockaddr *)(ifm + 1);
  61. get_rtaddrs(ifm->ifm_addrs, sa, rti_info);
  62. if ( (sa = rti_info[RTAX_IFP]) != NULL) {
  63. if (((flags = ifm->ifm_flags) & IFF_UP) == 0)
  64. continue;
  65. printf("interface: %s: <", Sock_ntop(sa, sa->sa_len));
  66. if (flags & IFF_UP) printf("UP ");
  67. if (flags & IFF_BROADCAST) printf("BCAST ");
  68. if (flags & IFF_MULTICAST) printf("MCAST ");
  69. if (flags & IFF_LOOPBACK) printf("LOOP ");
  70. if (flags & IFF_POINTOPOINT) printf("P2P ");
  71. printf(">\n");
  72. if (sa->sa_family == AF_LINK &&
  73. (sdl = (struct sockaddr_dl *) sa) &&
  74. (sdl->sdl_alen > 0)) {
  75. ptr = (u_char *) &sdl->sdl_data[sdl->sdl_nlen];
  76. printf(" %x:%x:%x:%x:%x:%x\n", *ptr, *(ptr+1),
  77. *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));
  78. }
  79. }
  80. } else if (ifm->ifm_type == RTM_NEWADDR) {
  81. ifam = (struct ifa_msghdr *) next;
  82. sa = (struct sockaddr *)(ifam + 1);
  83. get_rtaddrs(ifam->ifam_addrs, sa, rti_info);
  84. if ( (sa = rti_info[RTAX_IFA]) != NULL)
  85. printf(" IP addr: %s\n", Sock_ntop(sa, sa->sa_len));
  86. if ((flags & IFF_BROADCAST) && (sa = rti_info[RTAX_BRD]))
  87. printf(" bcast addr: %s\n", Sock_ntop(sa, sa->sa_len));
  88. } else
  89. err_quit("unexpected message type %d", ifm->ifm_type);
  90. }
  91. }