aboutsummaryrefslogtreecommitdiffstats
path: root/sockaddr_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'sockaddr_util.c')
-rw-r--r--sockaddr_util.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/sockaddr_util.c b/sockaddr_util.c
new file mode 100644
index 0000000..ab67b2e
--- /dev/null
+++ b/sockaddr_util.c
@@ -0,0 +1,41 @@
+
+#include <netinet/in.h>
+#include <string.h>
+
+#include "sockaddr_util.h"
+
+int sockaddr_cmp(union sockaddr_any *a, union sockaddr_any *b)
+{
+ if (a->sa.sa_family != b->sa.sa_family)
+ return a->sa.sa_family - b->sa.sa_family;
+ switch (a->sa.sa_family) {
+ case AF_INET:
+ return a->sin.sin_addr.s_addr - b->sin.sin_addr.s_addr;
+ break;
+ case AF_INET6:
+ return memcmp((char *) &a->sin6.sin6_addr,
+ (char *) &b->sin6.sin6_addr,
+ sizeof(a->sin6.sin6_addr));
+ break;
+ }
+ return -1;
+}
+
+union sockaddr_any *sockaddr_init(union sockaddr_any *sa, int family,
+ void *addr)
+{
+ memset(sa, 0, sizeof(sa));
+ if (addr == NULL)
+ return sa;
+ sa->sa.sa_family = family;
+ switch (family) {
+ case AF_INET:
+ sa->sin.sin_addr.s_addr = *(uint32_t *)addr;
+ break;
+ case AF_INET6:
+ memcpy(&sa->sin6.sin6_addr, addr,
+ sizeof(sa->sin6.sin6_addr));
+ break;
+ }
+ return sa;
+}