summaryrefslogtreecommitdiff
path: root/ctdb/protocol
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2017-06-30 15:11:04 +1000
committerMartin Schwenke <martins@samba.org>2017-09-19 13:30:26 +0200
commitde9f05e8fe9330eb94cc0d4259dcf37431a08578 (patch)
treedb02af44304621c592021871302717ff38a528fb /ctdb/protocol
parent22de111ebfbbb74ae0f47e4812db967747873545 (diff)
downloadsamba-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.c46
-rw-r--r--ctdb/protocol/protocol_util.h6
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);