s4-ipv6: added socket_address_from_sockaddr_storage()
authorAndrew Tridgell <tridge@samba.org>
Thu, 12 May 2011 10:29:21 +0000 (12:29 +0200)
committerAndrew Tridgell <tridge@samba.org>
Mon, 6 Jun 2011 02:26:09 +0000 (12:26 +1000)
this converts a struct sockaddr_storage to a struct socket_address

source4/lib/socket/socket.c
source4/lib/socket/socket.h

index cecd1026d598951d32e5d1723dbbd950807d1518..41638b3d72f3fd7655041437f8308f06a35d0c62 100644 (file)
@@ -510,6 +510,50 @@ _PUBLIC_ struct socket_address *socket_address_from_sockaddr(TALLOC_CTX *mem_ctx
        return addr;
 }
 
+
+/*
+   Create a new socket_address from sockaddr_storage
+ */
+_PUBLIC_ struct socket_address *socket_address_from_sockaddr_storage(TALLOC_CTX *mem_ctx,
+                                                                    const struct sockaddr_storage *sockaddr,
+       uint16_t port)
+{
+       struct socket_address *addr = talloc_zero(mem_ctx, struct socket_address);
+       char addr_str[INET6_ADDRSTRLEN+1];
+       const char *str;
+
+       if (!addr) {
+               return NULL;
+       }
+       addr->port = port;
+       switch (sockaddr->ss_family) {
+       case AF_INET:
+               addr->family = "ipv4";
+               break;
+#ifdef HAVE_IPV6
+       case AF_INET6:
+               addr->family = "ipv6";
+               break;
+#endif
+       default:
+               talloc_free(addr);
+               return NULL;
+       }
+
+       str = print_sockaddr(addr_str, sizeof(addr_str), sockaddr);
+       if (str == NULL) {
+               talloc_free(addr);
+               return NULL;
+       }
+       addr->addr = talloc_strdup(addr, str);
+       if (addr->addr == NULL) {
+               talloc_free(addr);
+               return NULL;
+       }
+
+       return addr;
+}
+
 /* Copy a socket_address structure */
 struct socket_address *socket_address_copy(TALLOC_CTX *mem_ctx,
                                           const struct socket_address *oaddr)
index 88360ac8f338af79b1f7707535961431d759a820..e00b61ba6cde7241a1e9e90bd4960f3d09171d0f 100644 (file)
@@ -174,6 +174,10 @@ struct socket_address *socket_address_from_strings(TALLOC_CTX *mem_ctx,
 struct socket_address *socket_address_from_sockaddr(TALLOC_CTX *mem_ctx, 
                                                    struct sockaddr *sockaddr, 
                                                    size_t addrlen);
+struct sockaddr_storage;
+struct socket_address *socket_address_from_sockaddr_storage(TALLOC_CTX *mem_ctx,
+                                                           const struct sockaddr_storage *sockaddr,
+                                                           uint16_t port);
 _PUBLIC_ void socket_address_set_port(struct socket_address *a,
                                      uint16_t port);
 struct socket_address *socket_address_copy(TALLOC_CTX *mem_ctx,