]> git.proxmox.com Git - mirror_kronosnet.git/commitdiff
[netutils] cleanup cmpaddr and add cpyaddrport
authorFabio M. Di Nitto <fdinitto@redhat.com>
Thu, 26 Jan 2017 17:02:01 +0000 (18:02 +0100)
committerFabio M. Di Nitto <fdinitto@redhat.com>
Thu, 26 Jan 2017 17:02:01 +0000 (18:02 +0100)
cpyaddrport specifically copies _only_ address and port and skip
over other fields that are unnecessary for what we need

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
libknet/netutils.c
libknet/netutils.h

index 4e5859a5512622daa969d149ae9e19cf9e7f03e2..ae9a3b105e19d48f94ba55c42cbacce91ba649ab 100644 (file)
 #include "internals.h"
 #include "netutils.h"
 
-static int is_v4_mapped(struct sockaddr_storage *ss, socklen_t salen)
+static int is_v4_mapped(const struct sockaddr_storage *ss, socklen_t salen)
 {
        char map[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff };
        struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) ss;
        return memcmp(&addr6->sin6_addr, map, 12);
 }
 
-/*
- * unused now - move to libknet for ACL
- */
-
-int cmpaddr(struct sockaddr_storage *ss1, socklen_t sslen1,
-           struct sockaddr_storage *ss2, socklen_t sslen2)
+int cmpaddr(const struct sockaddr_storage *ss1, socklen_t sslen1,
+           const struct sockaddr_storage *ss2, socklen_t sslen2)
 {
        int ss1_offset = 0, ss2_offset = 0;
        struct sockaddr_in6 *ss1_addr6 = (struct sockaddr_in6 *)ss1;
@@ -40,30 +36,50 @@ int cmpaddr(struct sockaddr_storage *ss1, socklen_t sslen1,
        struct sockaddr_in *ss2_addr = (struct sockaddr_in *)ss2;
        char *addr1, *addr2;
 
-       if (ss1->ss_family == ss2->ss_family)
+       if (ss1->ss_family == ss2->ss_family) {
                return memcmp(ss1, ss2, sslen1);
+       }
 
        if (ss1->ss_family == AF_INET6) {
-               if (is_v4_mapped(ss1, sslen1))
+               if (is_v4_mapped(ss1, sslen1)) {
                        return 1;
-
+               }
                addr1 = (char *)&ss1_addr6->sin6_addr;
                ss1_offset = 12;
-       } else
+       } else {
                addr1 = (char *)&ss1_addr->sin_addr;
+       }
 
        if (ss2->ss_family == AF_INET6) {
-               if (is_v4_mapped(ss2, sslen2))
+               if (is_v4_mapped(ss2, sslen2)) {
                        return 1;
-
+               }
                addr2 = (char *)&ss2_addr6->sin6_addr;
                ss2_offset = 12;
-       } else
+       } else {
                addr2 = (char *)&ss2_addr->sin_addr;
+       }
 
        return memcmp(addr1+ss1_offset, addr2+ss2_offset, 4);
 }
 
+int cpyaddrport(struct sockaddr_storage *dst, const struct sockaddr_storage *src)
+{
+       struct sockaddr_in6 *dst_addr6 = (struct sockaddr_in6 *)dst;
+       struct sockaddr_in6 *src_addr6 = (struct sockaddr_in6 *)src;
+
+       memset(dst, 0, sizeof(struct sockaddr_storage));
+
+       if (src->ss_family == AF_INET6) {
+               dst->ss_family = src->ss_family;
+               memmove(&dst_addr6->sin6_port, &src_addr6->sin6_port, sizeof(in_port_t));
+               memmove(&dst_addr6->sin6_addr, &src_addr6->sin6_addr, sizeof(struct in6_addr));
+       } else {
+               memmove(dst, src, sizeof(struct sockaddr_in));
+       }
+       return 0;
+}
+
 socklen_t sockaddr_len(const struct sockaddr_storage *ss)
 {
         if (ss->ss_family == AF_INET) {
index 4dddcb59021ae800677e73f78977588879069fa3..4be7c3e0a5533eef7ee26debbc6f845489e3f81f 100644 (file)
@@ -12,6 +12,8 @@
 
 #include <sys/socket.h>
 
-int cmpaddr(struct sockaddr_storage *ss1, socklen_t sslen1, struct sockaddr_storage *ss2, socklen_t sslen2);
+int cmpaddr(const struct sockaddr_storage *ss1, socklen_t sslen1, const struct sockaddr_storage *ss2, socklen_t sslen2);
+int cpyaddrport(struct sockaddr_storage *dst, const struct sockaddr_storage *src);
+
 socklen_t knet_sockaddr_len(const struct sockaddr_storage *ss);
 #endif