Practical.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include <stdio.h>
  2. #include <netdb.h>
  3. #include <netinet/in.h>
  4. #include <stddef.h>
  5. #include <arpa/inet.h>
  6. #include "Practical.h"
  7. int proto_get_num(const char *name) {
  8. struct protoent *protoent = getprotobyname(name);
  9. if (protoent == NULL) {
  10. DieWithSystemMessage("getprotobyname");
  11. }
  12. return protoent->p_proto;
  13. }
  14. void PrintSocketAddress(const struct sockaddr *address, FILE *stream) {
  15. if (address == nullptr || stream == nullptr) {
  16. return;
  17. }
  18. void *numericAddress = nullptr;
  19. char addrBuffer[INET6_ADDRSTRLEN];
  20. in_port_t port;
  21. switch (address->sa_family) {
  22. case AF_INET:
  23. const struct sockaddr_in *const inet_addr = (struct sockaddr_in *) address;
  24. numericAddress = (void *) &inet_addr->sin_addr;
  25. port = ntohs(inet_addr->sin_port);
  26. break;
  27. case AF_INET6:
  28. const struct sockaddr_in6 *const inet6_addr = (struct sockaddr_in6 *) address;
  29. numericAddress = (void *) &inet6_addr->sin6_addr;
  30. port = ntohs(inet6_addr->sin6_port);
  31. break;
  32. default:
  33. fputs("[unkown type]", stream);
  34. return;
  35. }
  36. if (inet_ntop(
  37. address->sa_family,
  38. numericAddress,
  39. addrBuffer,
  40. sizeof(addrBuffer)
  41. )
  42. != nullptr) {
  43. fprintf(stream, "%s", addrBuffer);
  44. if (port != 0) {
  45. fprintf(stream, "-%u", port);
  46. }
  47. } else {
  48. fputs("[invalid address]", stream);
  49. }
  50. }
  51. // Mentioned as a possible exercise in 3.2.1
  52. int AF_to_PF(const int af) {
  53. switch (af) {
  54. case AF_UNSPEC:
  55. return PF_UNSPEC;
  56. case AF_LOCAL:
  57. return PF_LOCAL;
  58. case AF_INET:
  59. return PF_INET;
  60. case AF_AX25:
  61. return PF_AX25;
  62. case AF_IPX:
  63. return PF_IPX;
  64. case AF_APPLETALK:
  65. return PF_APPLETALK;
  66. case AF_NETROM:
  67. return PF_NETROM;
  68. case AF_BRIDGE:
  69. return PF_BRIDGE;
  70. case AF_ATMPVC:
  71. return PF_ATMPVC;
  72. case AF_X25:
  73. return PF_X25;
  74. case AF_INET6:
  75. return PF_INET6;
  76. case AF_ROSE:
  77. return PF_ROSE;
  78. case AF_DECnet:
  79. return PF_DECnet;
  80. case AF_NETBEUI:
  81. return PF_NETBEUI;
  82. case AF_SECURITY:
  83. return PF_SECURITY;
  84. case AF_KEY:
  85. return PF_KEY;
  86. case AF_PACKET:
  87. return PF_PACKET;
  88. case AF_ASH:
  89. return PF_ASH;
  90. case AF_ECONET:
  91. return PF_ECONET;
  92. case AF_ATMSVC:
  93. return PF_ATMSVC;
  94. case AF_RDS:
  95. return PF_RDS;
  96. case AF_SNA:
  97. return PF_SNA;
  98. case AF_IRDA:
  99. return PF_IRDA;
  100. case AF_PPPOX:
  101. return PF_PPPOX;
  102. case AF_WANPIPE:
  103. return PF_WANPIPE;
  104. case AF_LLC:
  105. return PF_LLC;
  106. case AF_IB:
  107. return PF_IB;
  108. case AF_MPLS:
  109. return PF_MPLS;
  110. case AF_CAN:
  111. return PF_CAN;
  112. case AF_TIPC:
  113. return PF_TIPC;
  114. case AF_BLUETOOTH:
  115. return PF_BLUETOOTH;
  116. case AF_IUCV:
  117. return PF_IUCV;
  118. case AF_RXRPC:
  119. return PF_RXRPC;
  120. case AF_ISDN:
  121. return PF_ISDN;
  122. case AF_PHONET:
  123. return PF_PHONET;
  124. case AF_IEEE802154:
  125. return PF_IEEE802154;
  126. case AF_CAIF:
  127. return PF_CAIF;
  128. case AF_ALG:
  129. return PF_ALG;
  130. case AF_NFC:
  131. return PF_NFC;
  132. case AF_VSOCK:
  133. return PF_VSOCK;
  134. case AF_KCM:
  135. return PF_KCM;
  136. case AF_QIPCRTR:
  137. return PF_QIPCRTR;
  138. case AF_SMC:
  139. return PF_SMC;
  140. case AF_XDP:
  141. return PF_XDP;
  142. case AF_MCTP:
  143. return PF_MCTP;
  144. case AF_MAX:
  145. return PF_MAX;
  146. }
  147. // Handle entries that (currently) have the same value
  148. if (af == AF_UNIX) {
  149. return PF_UNIX;
  150. }
  151. if (af == AF_FILE) {
  152. return PF_FILE;
  153. }
  154. if (af == AF_NETLINK) {
  155. return PF_NETLINK;
  156. }
  157. if (af == AF_ROUTE) {
  158. return PF_ROUTE;
  159. }
  160. DieWithUserMessage("AF_to_PF", "Unkown AF_ value");
  161. return -1; // Unreachable, makes LSP shut up about not returning a value.
  162. }