getrt.lc 3.1 KB

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