diff options
author | Martin Schwenke <martin@meltin.net> | 2017-06-30 15:11:04 +1000 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2017-09-19 13:30:26 +0200 |
commit | de9f05e8fe9330eb94cc0d4259dcf37431a08578 (patch) | |
tree | db02af44304621c592021871302717ff38a528fb /ctdb/protocol | |
parent | 22de111ebfbbb74ae0f47e4812db967747873545 (diff) | |
download | samba-de9f05e8fe9330eb94cc0d4259dcf37431a08578.tar.gz |
ctdb-protocol: Add utility function ctdb_sock_addr_to_buf()
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
Diffstat (limited to 'ctdb/protocol')
-rw-r--r-- | ctdb/protocol/protocol_util.c | 46 | ||||
-rw-r--r-- | ctdb/protocol/protocol_util.h | 6 |
2 files changed, 40 insertions, 12 deletions
diff --git a/ctdb/protocol/protocol_util.c b/ctdb/protocol/protocol_util.c index 91e8cfc7349..d8ee62da424 100644 --- a/ctdb/protocol/protocol_util.c +++ b/ctdb/protocol/protocol_util.c @@ -111,31 +111,53 @@ enum ctdb_event ctdb_event_from_string(const char *event_str) return CTDB_EVENT_MAX; } -const char *ctdb_sock_addr_to_string(TALLOC_CTX *mem_ctx, ctdb_sock_addr *addr) +int ctdb_sock_addr_to_buf(char *buf, socklen_t buflen, ctdb_sock_addr *addr) { - char *cip; - - cip = talloc_size(mem_ctx, 128); - if (cip == NULL) { - return "Memory Error"; - } + const char *t; switch (addr->sa.sa_family) { case AF_INET: - inet_ntop(addr->ip.sin_family, &addr->ip.sin_addr, - cip, 128); + t = inet_ntop(addr->ip.sin_family, &addr->ip.sin_addr, + buf, buflen); + if (t == NULL) { + return errno; + } break; case AF_INET6: - inet_ntop(addr->ip6.sin6_family, &addr->ip6.sin6_addr, - cip, 128); + t = inet_ntop(addr->ip6.sin6_family, &addr->ip6.sin6_addr, + buf, buflen); + if (t == NULL) { + return errno; + } break; default: - sprintf(cip, "Unknown family %u", addr->sa.sa_family); + return EAFNOSUPPORT; break; } + return 0; +} + +const char *ctdb_sock_addr_to_string(TALLOC_CTX *mem_ctx, ctdb_sock_addr *addr) +{ + size_t len = 64; + char *cip; + int ret; + + cip = talloc_size(mem_ctx, len); + + if (cip == NULL) { + return NULL; + } + + ret = ctdb_sock_addr_to_buf(cip, len, addr); + if (ret != 0) { + talloc_free(cip); + return NULL; + } + return cip; } diff --git a/ctdb/protocol/protocol_util.h b/ctdb/protocol/protocol_util.h index c139891e50e..94717cab472 100644 --- a/ctdb/protocol/protocol_util.h +++ b/ctdb/protocol/protocol_util.h @@ -30,6 +30,12 @@ enum ctdb_runstate ctdb_runstate_from_string(const char *runstate_str); const char *ctdb_event_to_string(enum ctdb_event event); enum ctdb_event ctdb_event_from_string(const char *event_str); +/* + * buflen must be long enough to hold the longest possible address. + * For example, 1122:3344:5566:7788:99aa:bbcc:ddee:ff00. + * 64 is sane value for buflen. + */ +int ctdb_sock_addr_to_buf(char *buf, socklen_t buflen, ctdb_sock_addr *addr); const char *ctdb_sock_addr_to_string(TALLOC_CTX *mem_ctx, ctdb_sock_addr *addr); unsigned int ctdb_sock_addr_port(ctdb_sock_addr *addr); void ctdb_sock_addr_set_port(ctdb_sock_addr *addr, unsigned int port); |