getrt.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /* include getrt1 */
  2. #include "unproute.h"
  3. #define BUFLEN (sizeof(struct rt_msghdr) + 512)
  4. /* sizeof(struct sockaddr_in6) * 8 = 192 */
  5. #define SEQ 9999
  6. int
  7. main(int argc, char **argv)
  8. {
  9. int sockfd;
  10. char *buf;
  11. pid_t pid;
  12. ssize_t n;
  13. struct rt_msghdr *rtm;
  14. struct sockaddr *sa, *rti_info[RTAX_MAX];
  15. struct sockaddr_in *sin;
  16. if (argc != 2)
  17. err_quit("usage: getrt <IPaddress>");
  18. sockfd = Socket(AF_ROUTE, SOCK_RAW, 0); /* need superuser privileges */
  19. buf = Calloc(1, BUFLEN); /* and initialized to 0 */
  20. rtm = (struct rt_msghdr *) buf;
  21. rtm->rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
  22. rtm->rtm_version = RTM_VERSION;
  23. rtm->rtm_type = RTM_GET;
  24. rtm->rtm_addrs = RTA_DST;
  25. rtm->rtm_pid = pid = getpid();
  26. rtm->rtm_seq = SEQ;
  27. sin = (struct sockaddr_in *) (rtm + 1);
  28. sin->sin_len = sizeof(struct sockaddr_in);
  29. sin->sin_family = AF_INET;
  30. Inet_pton(AF_INET, argv[1], &sin->sin_addr);
  31. Write(sockfd, rtm, rtm->rtm_msglen);
  32. do {
  33. n = Read(sockfd, rtm, BUFLEN);
  34. } while (rtm->rtm_type != RTM_GET || rtm->rtm_seq != SEQ ||
  35. rtm->rtm_pid != pid);
  36. /* end getrt1 */
  37. /* include getrt2 */
  38. rtm = (struct rt_msghdr *) buf;
  39. sa = (struct sockaddr *) (rtm + 1);
  40. get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
  41. if ( (sa = rti_info[RTAX_DST]) != NULL)
  42. printf("dest: %s\n", Sock_ntop_host(sa, sa->sa_len));
  43. if ( (sa = rti_info[RTAX_GATEWAY]) != NULL)
  44. printf("gateway: %s\n", Sock_ntop_host(sa, sa->sa_len));
  45. if ( (sa = rti_info[RTAX_NETMASK]) != NULL)
  46. printf("netmask: %s\n", Sock_masktop(sa, sa->sa_len));
  47. if ( (sa = rti_info[RTAX_GENMASK]) != NULL)
  48. printf("genmask: %s\n", Sock_masktop(sa, sa->sa_len));
  49. exit(0);
  50. }
  51. /* end getrt2 */