sourceroute.lc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* include inet_srcrt_init */
  2. #include "unp.h"## 1 ##src/ipopts/sourceroute.c##
  3. #include <netinet/in_systm.h>## 2 ##src/ipopts/sourceroute.c##
  4. #include <netinet/ip.h>## 3 ##src/ipopts/sourceroute.c##
  5. static u_char *optr; /* pointer into options being formed */## 4 ##src/ipopts/sourceroute.c##
  6. static u_char *lenptr; /* pointer to length byte in SRR option */## 5 ##src/ipopts/sourceroute.c##
  7. static int ocnt; /* count of # addresses */## 6 ##src/ipopts/sourceroute.c##
  8. u_char *## 7 ##src/ipopts/sourceroute.c##
  9. inet_srcrt_init(void)## 8 ##src/ipopts/sourceroute.c##
  10. {## 9 ##src/ipopts/sourceroute.c##
  11. optr = Malloc(44); /* NOP, code, len, ptr, up to 10 addresses */## 10 ##src/ipopts/sourceroute.c##
  12. bzero(optr, 44); /* guarantees EOLs at end */## 11 ##src/ipopts/sourceroute.c##
  13. ocnt = 0;## 12 ##src/ipopts/sourceroute.c##
  14. return (optr); /* pointer for setsockopt() */## 13 ##src/ipopts/sourceroute.c##
  15. }## 14 ##src/ipopts/sourceroute.c##
  16. /* end inet_srcrt_init */
  17. /* include inet_srcrt_add */
  18. int## 15 ##src/ipopts/sourceroute.c##
  19. inet_srcrt_add(char *hostptr, int type)## 16 ##src/ipopts/sourceroute.c##
  20. {## 17 ##src/ipopts/sourceroute.c##
  21. int len;## 18 ##src/ipopts/sourceroute.c##
  22. struct addrinfo *ai;## 19 ##src/ipopts/sourceroute.c##
  23. struct sockaddr_in *sin;## 20 ##src/ipopts/sourceroute.c##
  24. if (ocnt > 9)## 21 ##src/ipopts/sourceroute.c##
  25. err_quit("too many source routes with: %s", hostptr);## 22 ##src/ipopts/sourceroute.c##
  26. if (ocnt == 0) {## 23 ##src/ipopts/sourceroute.c##
  27. *optr++ = IPOPT_NOP; /* NOP for alignment */## 24 ##src/ipopts/sourceroute.c##
  28. *optr++ = type ? IPOPT_SSRR : IPOPT_LSRR;## 25 ##src/ipopts/sourceroute.c##
  29. lenptr = optr++; /* we fill in the length later */## 26 ##src/ipopts/sourceroute.c##
  30. *optr++ = 4; /* offset to first address */## 27 ##src/ipopts/sourceroute.c##
  31. }## 28 ##src/ipopts/sourceroute.c##
  32. ai = Host_serv(hostptr, "", AF_INET, 0);## 29 ##src/ipopts/sourceroute.c##
  33. sin = (struct sockaddr_in *) ai->ai_addr;## 30 ##src/ipopts/sourceroute.c##
  34. memcpy(optr, &sin->sin_addr, sizeof(struct in_addr));## 31 ##src/ipopts/sourceroute.c##
  35. freeaddrinfo(ai);## 32 ##src/ipopts/sourceroute.c##
  36. optr += sizeof(struct in_addr);## 33 ##src/ipopts/sourceroute.c##
  37. ocnt++;## 34 ##src/ipopts/sourceroute.c##
  38. len = 3 + (ocnt * sizeof(struct in_addr));## 35 ##src/ipopts/sourceroute.c##
  39. *lenptr = len;## 36 ##src/ipopts/sourceroute.c##
  40. return (len + 1); /* size for setsockopt() */## 37 ##src/ipopts/sourceroute.c##
  41. }## 38 ##src/ipopts/sourceroute.c##
  42. /* end inet_srcrt_add */
  43. /* include inet_srcrt_print */
  44. void## 39 ##src/ipopts/sourceroute.c##
  45. inet_srcrt_print(u_char *ptr, int len)## 40 ##src/ipopts/sourceroute.c##
  46. {## 41 ##src/ipopts/sourceroute.c##
  47. u_char c;## 42 ##src/ipopts/sourceroute.c##
  48. char str[INET_ADDRSTRLEN];## 43 ##src/ipopts/sourceroute.c##
  49. struct in_addr hop1;## 44 ##src/ipopts/sourceroute.c##
  50. memcpy(&hop1, ptr, sizeof(struct in_addr));## 45 ##src/ipopts/sourceroute.c##
  51. ptr += sizeof(struct in_addr);## 46 ##src/ipopts/sourceroute.c##
  52. while ((c = *ptr++) == IPOPT_NOP) ; /* skip any leading NOPs */## 47 ##src/ipopts/sourceroute.c##
  53. if (c == IPOPT_LSRR)## 48 ##src/ipopts/sourceroute.c##
  54. printf("received LSRR: ");## 49 ##src/ipopts/sourceroute.c##
  55. else if (c == IPOPT_SSRR)## 50 ##src/ipopts/sourceroute.c##
  56. printf("received SSRR: ");## 51 ##src/ipopts/sourceroute.c##
  57. else {## 52 ##src/ipopts/sourceroute.c##
  58. printf("received option type %d\n", c);## 53 ##src/ipopts/sourceroute.c##
  59. return;## 54 ##src/ipopts/sourceroute.c##
  60. }## 55 ##src/ipopts/sourceroute.c##
  61. printf("%s ", Inet_ntop(AF_INET, &hop1, str, sizeof(str)));## 56 ##src/ipopts/sourceroute.c##
  62. len = *ptr++ - sizeof(struct in_addr); /* subtract dest IP addr */## 57 ##src/ipopts/sourceroute.c##
  63. ptr++; /* skip over pointer */## 58 ##src/ipopts/sourceroute.c##
  64. while (len > 0) {## 59 ##src/ipopts/sourceroute.c##
  65. printf("%s ", Inet_ntop(AF_INET, ptr, str, sizeof(str)));## 60 ##src/ipopts/sourceroute.c##
  66. ptr += sizeof(struct in_addr);## 61 ##src/ipopts/sourceroute.c##
  67. len -= sizeof(struct in_addr);## 62 ##src/ipopts/sourceroute.c##
  68. }## 63 ##src/ipopts/sourceroute.c##
  69. printf("\n");## 64 ##src/ipopts/sourceroute.c##
  70. }## 65 ##src/ipopts/sourceroute.c##
  71. /* end inet_srcrt_print */