diff options
Diffstat (limited to 'source4/lib')
-rw-r--r-- | source4/lib/socket/socket.c | 33 | ||||
-rw-r--r-- | source4/lib/socket/socket.h | 2 |
2 files changed, 35 insertions, 0 deletions
diff --git a/source4/lib/socket/socket.c b/source4/lib/socket/socket.c index 9d30e0a77ef..8e2f1683f22 100644 --- a/source4/lib/socket/socket.c +++ b/source4/lib/socket/socket.c @@ -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); diff --git a/source4/lib/socket/socket.h b/source4/lib/socket/socket.h index e9338127c4b..0f469e5ceb9 100644 --- a/source4/lib/socket/socket.h +++ b/source4/lib/socket/socket.h @@ -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, |