#include #include #include #include #include #include "Practical.h" int proto_get_num(const char *name) { struct protoent *protoent = getprotobyname(name); if (protoent == NULL) { DieWithSystemMessage("getprotobyname"); } return protoent->p_proto; } void PrintSocketAddress(const struct sockaddr *address, FILE *stream) { if (address == nullptr || stream == nullptr) { return; } void *numericAddress = nullptr; char addrBuffer[INET6_ADDRSTRLEN]; in_port_t port; switch (address->sa_family) { case AF_INET: const struct sockaddr_in *const inet_addr = (struct sockaddr_in *) address; numericAddress = (void *) &inet_addr->sin_addr; port = ntohs(inet_addr->sin_port); break; case AF_INET6: const struct sockaddr_in6 *const inet6_addr = (struct sockaddr_in6 *) address; numericAddress = (void *) &inet6_addr->sin6_addr; port = ntohs(inet6_addr->sin6_port); break; default: fputs("[unkown type]", stream); return; } if (inet_ntop( address->sa_family, numericAddress, addrBuffer, sizeof(addrBuffer) ) != nullptr) { fprintf(stream, "%s", addrBuffer); if (port != 0) { fprintf(stream, "-%u", port); } } else { fputs("[invalid address]", stream); } } // Mentioned as a possible exercise in 3.2.1 int AF_to_PF(const int af) { switch (af) { case AF_UNSPEC: return PF_UNSPEC; case AF_LOCAL: return PF_LOCAL; case AF_INET: return PF_INET; case AF_AX25: return PF_AX25; case AF_IPX: return PF_IPX; case AF_APPLETALK: return PF_APPLETALK; case AF_NETROM: return PF_NETROM; case AF_BRIDGE: return PF_BRIDGE; case AF_ATMPVC: return PF_ATMPVC; case AF_X25: return PF_X25; case AF_INET6: return PF_INET6; case AF_ROSE: return PF_ROSE; case AF_DECnet: return PF_DECnet; case AF_NETBEUI: return PF_NETBEUI; case AF_SECURITY: return PF_SECURITY; case AF_KEY: return PF_KEY; case AF_PACKET: return PF_PACKET; case AF_ASH: return PF_ASH; case AF_ECONET: return PF_ECONET; case AF_ATMSVC: return PF_ATMSVC; case AF_RDS: return PF_RDS; case AF_SNA: return PF_SNA; case AF_IRDA: return PF_IRDA; case AF_PPPOX: return PF_PPPOX; case AF_WANPIPE: return PF_WANPIPE; case AF_LLC: return PF_LLC; case AF_IB: return PF_IB; case AF_MPLS: return PF_MPLS; case AF_CAN: return PF_CAN; case AF_TIPC: return PF_TIPC; case AF_BLUETOOTH: return PF_BLUETOOTH; case AF_IUCV: return PF_IUCV; case AF_RXRPC: return PF_RXRPC; case AF_ISDN: return PF_ISDN; case AF_PHONET: return PF_PHONET; case AF_IEEE802154: return PF_IEEE802154; case AF_CAIF: return PF_CAIF; case AF_ALG: return PF_ALG; case AF_NFC: return PF_NFC; case AF_VSOCK: return PF_VSOCK; case AF_KCM: return PF_KCM; case AF_QIPCRTR: return PF_QIPCRTR; case AF_SMC: return PF_SMC; case AF_XDP: return PF_XDP; case AF_MCTP: return PF_MCTP; case AF_MAX: return PF_MAX; } // Handle entries that (currently) have the same value if (af == AF_UNIX) { return PF_UNIX; } if (af == AF_FILE) { return PF_FILE; } if (af == AF_NETLINK) { return PF_NETLINK; } if (af == AF_ROUTE) { return PF_ROUTE; } DieWithUserMessage("AF_to_PF", "Unkown AF_ value"); return -1; // Unreachable, makes LSP shut up about not returning a value. }