s4:lib/socket: add socket_address_copy()
authorStefan Metzmacher <metze@samba.org>
Fri, 13 Feb 2009 12:07:58 +0000 (13:07 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 13 Feb 2009 12:44:38 +0000 (13:44 +0100)
metze

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

index 9d30e0a77ef7f87aa893b2bd0ad2d1a2248b1b19..8e2f1683f229c35156ce7a6409cd04b60887f980 100644 (file)
@@ -426,6 +426,39 @@ _PUBLIC_ struct socket_address *socket_address_from_sockaddr(TALLOC_CTX *mem_ctx
        return addr;
 }
 
+/* Copy a socket_address structure */
+struct socket_address *socket_address_copy(TALLOC_CTX *mem_ctx,
+                                          const struct socket_address *oaddr)
+{
+       struct socket_address *addr = talloc_zero(mem_ctx, struct socket_address);
+       if (!addr) {
+               return NULL;
+       }
+       addr->family    = oaddr->family;
+       if (oaddr->addr) {
+               addr->addr      = talloc_strdup(addr, oaddr->addr);
+               if (!addr->addr) {
+                       goto nomem;
+               }
+       }
+       addr->port      = oaddr->port;
+       if (oaddr->sockaddr) {
+               addr->sockaddr = (struct sockaddr *)talloc_memdup(addr,
+                                                                 oaddr->sockaddr,
+                                                                 oaddr->sockaddrlen);
+               if (!addr->sockaddr) {
+                       goto nomem;
+               }
+               addr->sockaddrlen = oaddr->sockaddrlen;
+       }
+
+       return addr;
+
+nomem:
+       talloc_free(addr);
+       return NULL;
+}
+
 _PUBLIC_ const struct socket_ops *socket_getops_byname(const char *family, enum socket_type type)
 {
        extern const struct socket_ops *socket_ipv4_ops(enum socket_type);
index e9338127c4b398a219bb0270f41a687496922581..0f469e5ceb992e59f3e9d019679e1c82629617e7 100644 (file)
@@ -167,6 +167,8 @@ 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 socket_address *socket_address_copy(TALLOC_CTX *mem_ctx,
+                                          const struct socket_address *oaddr);
 const struct socket_ops *socket_getops_byname(const char *name, enum socket_type type);
 bool allow_access(TALLOC_CTX *mem_ctx,
                  const char **deny_list, const char **allow_list,