diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2011-07-28 13:55:06 +0200 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2011-07-28 13:55:06 +0200 |
commit | a0d284cc34c26b8be322eeccd9a46a2e4526a878 (patch) | |
tree | 3e0aeb0b08c9f736a08b28e3e1ddb305e32858f1 /sockaddr_util.c | |
parent | a8986413c299c77c6f57f7e8f8f0e5abf1a882c9 (diff) | |
download | pingu-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.c | 41 |
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; +} |