ctdb-protocol: Add utility function ctdb_sock_addr_to_buf()
authorMartin Schwenke <martin@meltin.net>
Fri, 30 Jun 2017 05:11:04 +0000 (15:11 +1000)
committerMartin Schwenke <martins@samba.org>
Tue, 19 Sep 2017 11:30:26 +0000 (13:30 +0200)
Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/protocol/protocol_util.c
ctdb/protocol/protocol_util.h

index 91e8cfc7349f74e7e3efa01076e620c49398dd18..d8ee62da4247480c53a820827441b8ed4438b701 100644 (file)
@@ -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;
 }
 
index c139891e50e1945dd19214d91998eef50abfbbd1..94717cab472c90efa504001d509f15fb19b38132 100644 (file)
@@ -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);