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;
}
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);