return ret;
}
+int ctdb_sock_addr_mask_from_string(const char *str,
+ ctdb_sock_addr *addr,
+ unsigned int *mask)
+{
+ char *p;
+ char s[64]; /* Much longer than INET6_ADDRSTRLEN */
+ unsigned int m;
+ char *endp = NULL;
+ ssize_t len;
+ bool ret;
+
+ if (addr == NULL || mask == NULL) {
+ return EINVAL;
+ }
+
+ len = strlcpy(s, str, sizeof(s));
+ if (len >= sizeof(s)) {
+ return EINVAL;
+ }
+
+ p = rindex(s, '/');
+ if (p == NULL) {
+ return EINVAL;
+ }
+
+ m = strtoul(p+1, &endp, 10);
+ if (endp == p+1 || *endp != '\0') {
+ /* Empty string or trailing garbage */
+ return EINVAL;
+ }
+
+ *p = '\0';
+ ret = ip_from_string(s, addr);
+
+ if (ret == 0) {
+ *mask = m;
+ }
+
+ return ret;
+}
+
unsigned int ctdb_sock_addr_port(ctdb_sock_addr *addr)
{
switch (addr->sa.sa_family) {
ctdb_sock_addr *addr, bool with_port);
int ctdb_sock_addr_from_string(const char *str,
ctdb_sock_addr *addr, bool with_port);
+int ctdb_sock_addr_mask_from_string(const char *str,
+ ctdb_sock_addr *addr,
+ unsigned int *mask);
unsigned int ctdb_sock_addr_port(ctdb_sock_addr *addr);
void ctdb_sock_addr_set_port(ctdb_sock_addr *addr, unsigned int port);
int ctdb_sock_addr_cmp_ip(const ctdb_sock_addr *addr1,
assert(ret == res);
}
+/*
+ * Test parsing of IP/mask, conversion to string
+ */
+
+static void test_sock_addr_mask_from_string(const char *ip_mask)
+{
+ ctdb_sock_addr sa;
+ unsigned mask;
+ const char *s, *t;
+ int ret;
+
+ ret = ctdb_sock_addr_mask_from_string(ip_mask, &sa, &mask);
+ assert(ret == 0);
+ s = ctdb_sock_addr_to_string(NULL, &sa, false);
+ assert(s != NULL);
+ t = talloc_asprintf(s, "%s/%u", s, mask);
+ assert(strcmp(ip_mask, t) == 0);
+ talloc_free(discard_const(s));
+}
+
+static void test_sock_addr_mask_from_string_bad(const char *ip_mask)
+{
+ ctdb_sock_addr sa;
+ unsigned mask;
+ int ret;
+
+ ret = ctdb_sock_addr_mask_from_string(ip_mask, &sa, &mask);
+ assert(ret == EINVAL);
+}
+
/*
* Test parsing of connection, conversion to string
*/
test_sock_addr_cmp("fe80::6af7:28ff:fefa:d136:123",
"fe80::6af7:28ff:fefa:d136:122" , true, 1);
+ test_sock_addr_mask_from_string("127.0.0.1/8");
+ test_sock_addr_mask_from_string("::1/128");
+ test_sock_addr_mask_from_string("fe80::6af7:28ff:fefa:d136/64");
+ test_sock_addr_mask_from_string_bad("127.0.0.1");
+
test_connection_to_string("127.0.0.1:12345 127.0.0.2:54321");
test_connection_to_string("fe80::6af7:28ff:fefa:d137:12345 "
"fe80::6af7:28ff:fefa:d138:54321");