summaryrefslogtreecommitdiffstats
path: root/addr.c
diff options
context:
space:
mode:
Diffstat (limited to 'addr.c')
-rw-r--r--addr.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/addr.c b/addr.c
new file mode 100644
index 0000000..1dddaff
--- /dev/null
+++ b/addr.c
@@ -0,0 +1,53 @@
+#include <string.h>
+
+#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;
+ }
+}