aboutsummaryrefslogtreecommitdiffstats
path: root/sockaddr_util.c
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2011-07-28 13:55:06 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2011-07-28 13:55:06 +0200
commita0d284cc34c26b8be322eeccd9a46a2e4526a878 (patch)
tree3e0aeb0b08c9f736a08b28e3e1ddb305e32858f1 /sockaddr_util.c
parenta8986413c299c77c6f57f7e8f8f0e5abf1a882c9 (diff)
downloadpingu-a0d284cc34c26b8be322eeccd9a46a2e4526a878.tar.bz2
pingu-a0d284cc34c26b8be322eeccd9a46a2e4526a878.tar.xz
pingu: use sockaddr_any
add common sockaddr utility functions
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;
+}