#include #include #include "addr.h" int addr_len(const sockaddr_any *addr) { switch (addr->any.sa_family) { case AF_INET: return sizeof(struct sockaddr_in); default: return 0; } } sockaddr_any *addr_parse(blob_t b, sockaddr_any *addr) { memset(addr, 0, sizeof(*addr)); addr->ipv4.sin_family = AF_INET; addr->ipv4.sin_addr.s_addr = blob_inet_addr(b); if (addr->ipv4.sin_addr.s_addr == -1) return NULL; return addr; } unsigned long addr_hash(const sockaddr_any *addr) { switch (addr->any.sa_family) { case AF_INET: return htonl(addr->ipv4.sin_addr.s_addr); default: return 0; } } const char *addr_print(const sockaddr_any *addr) { switch (addr->any.sa_family) { case AF_INET: return inet_ntoa(addr->ipv4.sin_addr); default: return "unknown"; } } blob_t addr_get_hostaddr_blob(const sockaddr_any *addr) { switch (addr->any.sa_family) { case AF_INET: return BLOB_BUF(&addr->ipv4.sin_addr); default: return BLOB_NULL; } } void addr_push_hostaddr(blob_t *b, const sockaddr_any *addr) { char buf[64]; blob_t f; unsigned int t; switch (addr->any.sa_family) { case AF_INET: t = ntohl(addr->ipv4.sin_addr.s_addr); f.ptr = buf; f.len = sprintf(buf, "%d.%d.%d.%d", (t ) & 0xff, (t >> 8) & 0xff, (t >> 16) & 0xff, (t >> 24) & 0xff); break; default: return; } blob_push(b, f); }