[SCM] Samba Shared Repository - branch master updated
Martin Schwenke
martins at samba.org
Tue Sep 19 15:32:02 UTC 2017
The branch, master has been updated
via 24996c6 ctdb-tools: Fix a typo for a talloc context
via c715da3 ctdb-tools: Add debug to ctdb_killtcp
via 8fb6c1a ctdb-tools: Move special case of 0 connections into computation
via fd54d47 ctdb-tools: Rework killtcp logic into a tevent_req-based computation
via 44cdda4 ctdb-tools: New function ctdb_kill_tcp_init()
via 3f78ddd ctdb-tools: Improve error handling
via 7a2db54 ctdb-tools: Drop global variable prog
via 6ac5cb4 ctdb-tools: Use db_hash in ctdb_killtcp
via c355fd9 ctdb-tools: Use ctdb_connection and ctdb_connection_list structs
via 6d9fef4 ctdb-protocol: Add ctdb_connection_list utilities
via e50cb8c ctdb-protocol: Add marshalling for ctdb_connection_list
via d6f9cd1 ctdb-protocol: Add new data structure ctdb_connection_list
via ef676d5 ctdb-protocol: Add ctdb_connection utilities
via 2850203 ctdb-protocol: Factor out static function ctdb_sock_addr_cmp_family()
via 6f1b1a0 ctdb-protocol: Add ctdb_sock_addr_from_string()
via 93668f5 ctdb-protocol: Optionally print port for address printing functions
via de9f05e ctdb-protocol: Add utility function ctdb_sock_addr_to_buf()
via 22de111 ctdb-protocol: Add ctdb_sock_addr_port() and sock_addr_set_port()
via eb32b8d ctdb-protocol: Add server and client aliases in ctdb_connection
via 3816270 ctdb-common: Initialise socket addresses before reading into them
via 3783b66 ctdb-build: Split protocol-util as a separate subsystem
via 2550a88 ctdb-build: Fix dependency for ctdbd
from 2c745cf s4-torture: move lease break handler outside the lease testsuite.
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 24996c60aafd36d10317876c702b7d4f759e405c
Author: Martin Schwenke <martin at meltin.net>
Date: Wed Sep 6 18:11:41 2017 +1000
ctdb-tools: Fix a typo for a talloc context
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
Autobuild-User(master): Martin Schwenke <martins at samba.org>
Autobuild-Date(master): Tue Sep 19 17:31:18 CEST 2017 on sn-devel-144
commit c715da3bdbf89ac77338876b47535b918d711f38
Author: Martin Schwenke <martin at meltin.net>
Date: Tue Jul 4 12:11:20 2017 +1000
ctdb-tools: Add debug to ctdb_killtcp
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 8fb6c1adb03e33159059cb1343a27c588c4cb6d5
Author: Martin Schwenke <martin at meltin.net>
Date: Tue Jul 4 14:02:14 2017 +1000
ctdb-tools: Move special case of 0 connections into computation
This avoids other potential users from unnecessarily setting up file
descriptors and such.
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit fd54d47875be20477cae45d173ba1eebd748fbbb
Author: Martin Schwenke <martin at meltin.net>
Date: Fri Jun 30 19:50:43 2017 +1000
ctdb-tools: Rework killtcp logic into a tevent_req-based computation
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 44cdda4ee0494d1b40b92569429c9380b948e08a
Author: Martin Schwenke <martin at meltin.net>
Date: Thu Jun 29 16:35:06 2017 +1000
ctdb-tools: New function ctdb_kill_tcp_init()
This replaces ctdb_killtcp(), which did the initialisation inside a
loop. The new logic is inverted, making it more natural.
The variable containing all the state is called "state" in
anticipation of the next commit that will convert this to a tevent_req
computation. This will mean less churn.
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 3f78dddea95fb90ac01d52229d9449c6b094de64
Author: Martin Schwenke <martin at meltin.net>
Date: Thu Sep 14 15:19:43 2017 +1000
ctdb-tools: Improve error handling
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 7a2db5410f745f0c745399a0190a9064fa173696
Author: Martin Schwenke <martin at meltin.net>
Date: Fri Jun 30 17:12:48 2017 +1000
ctdb-tools: Drop global variable prog
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 6ac5cb4eafb475cad258e83e60c73420ea5efbdf
Author: Martin Schwenke <martin at meltin.net>
Date: Thu Jun 29 15:57:19 2017 +1000
ctdb-tools: Use db_hash in ctdb_killtcp
One less use of trbt_tree_t. The code is easier to read and is
significantly smaller.
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit c355fd979a16adaa550e21ddf3e79e5f63950f4e
Author: Martin Schwenke <martin at meltin.net>
Date: Thu Jun 29 14:46:31 2017 +1000
ctdb-tools: Use ctdb_connection and ctdb_connection_list structs
Also use new connection and sock addr utilities.
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 6d9fef467cf91e543c2b0084d8a41e213f40c365
Author: Martin Schwenke <martin at meltin.net>
Date: Mon Sep 4 17:01:05 2017 +1000
ctdb-protocol: Add ctdb_connection_list utilities
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit e50cb8cb5213cf1f876a70638f37b2f8b3d36baa
Author: Martin Schwenke <martin at meltin.net>
Date: Tue Sep 5 10:52:58 2017 +1000
ctdb-protocol: Add marshalling for ctdb_connection_list
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit d6f9cd19fdc815f898865ab5fbfd814577ad72dd
Author: Martin Schwenke <martin at meltin.net>
Date: Mon Sep 4 16:48:40 2017 +1000
ctdb-protocol: Add new data structure ctdb_connection_list
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit ef676d5acf8042c02a2b50e18f4ae07a4f96f7c4
Author: Martin Schwenke <martin at meltin.net>
Date: Mon Sep 4 16:41:30 2017 +1000
ctdb-protocol: Add ctdb_connection utilities
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 285020360a4142fb982ad94bb21a0e87275cfed7
Author: Martin Schwenke <martin at meltin.net>
Date: Wed Sep 13 16:18:29 2017 +1000
ctdb-protocol: Factor out static function ctdb_sock_addr_cmp_family()
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 6f1b1a05fb821d49c44195c6ff91fbe21b1b10ef
Author: Martin Schwenke <martin at meltin.net>
Date: Mon Sep 11 16:39:38 2017 +1000
ctdb-protocol: Add ctdb_sock_addr_from_string()
This and the supporting functions duplicate functionality (parse_ip()
and parse_ip_port()) from common/system_util.c. The old functions
will be removed at a later time.
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 93668f50266ce43e591f0708bc0dcd557719e2dc
Author: Martin Schwenke <martin at meltin.net>
Date: Mon Sep 11 15:00:10 2017 +1000
ctdb-protocol: Optionally print port for address printing functions
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit de9f05e8fe9330eb94cc0d4259dcf37431a08578
Author: Martin Schwenke <martin at meltin.net>
Date: Fri Jun 30 15:11:04 2017 +1000
ctdb-protocol: Add utility function ctdb_sock_addr_to_buf()
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 22de111ebfbbb74ae0f47e4812db967747873545
Author: Martin Schwenke <martin at meltin.net>
Date: Fri Jun 2 16:17:22 2017 +1000
ctdb-protocol: Add ctdb_sock_addr_port() and sock_addr_set_port()
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit eb32b8d3a0320413db3e01019040c12aeb3f902c
Author: Martin Schwenke <martin at meltin.net>
Date: Mon Sep 4 16:20:55 2017 +1000
ctdb-protocol: Add server and client aliases in ctdb_connection
The current code is ambiguous in its use of src and dst. This allows
new code to use server and client for clarity.
Signed-off-by: Amitay Isaacs <amitay at gmail.com>
Reviewed-by: Martin Schwenke <martin at meltin.net>
commit 3816270c76d2aab275dc92d319a1b1708c026b8b
Author: Martin Schwenke <martin at meltin.net>
Date: Tue Sep 19 14:54:26 2017 +1000
ctdb-common: Initialise socket addresses before reading into them
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 3783b66fb343b9dbbb4a135ff0573c80ef2aba17
Author: Martin Schwenke <martin at meltin.net>
Date: Mon Sep 4 16:00:48 2017 +1000
ctdb-build: Split protocol-util as a separate subsystem
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 2550a88e2f04e45b6519c981a40de1fa5f729bd1
Author: Martin Schwenke <martin at meltin.net>
Date: Mon Sep 4 16:00:27 2017 +1000
ctdb-build: Fix dependency for ctdbd
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
-----------------------------------------------------------------------
Summary of changes:
ctdb/common/system_aix.c | 3 +
ctdb/common/system_freebsd.c | 3 +
ctdb/common/system_gnu.c | 3 +
ctdb/common/system_kfreebsd.c | 3 +
ctdb/common/system_linux.c | 3 +
ctdb/protocol/protocol.h | 15 +-
ctdb/protocol/protocol_api.h | 18 --
ctdb/protocol/protocol_private.h | 6 +
ctdb/protocol/protocol_types.c | 78 +++++
ctdb/protocol/protocol_util.c | 473 ++++++++++++++++++++++++++++--
ctdb/protocol/protocol_util.h | 72 +++++
ctdb/server/ctdb_eventd.c | 1 +
ctdb/server/ctdb_takeover_helper.c | 7 +-
ctdb/server/ipalloc.c | 2 +-
ctdb/server/ipalloc_common.c | 13 +-
ctdb/server/ipalloc_lcp2.c | 16 +-
ctdb/server/ipalloc_nondeterministic.c | 4 +-
ctdb/tests/src/ctdb_takeover_tests.c | 4 +-
ctdb/tests/src/fake_ctdbd.c | 22 +-
ctdb/tests/src/protocol_common.c | 28 ++
ctdb/tests/src/protocol_common.h | 5 +
ctdb/tests/src/protocol_types_test.c | 2 +
ctdb/tests/src/protocol_util_test.c | 315 ++++++++++++++++++--
ctdb/tools/ctdb.c | 47 +--
ctdb/tools/ctdb_event.c | 2 +-
ctdb/tools/ctdb_killtcp.c | 519 ++++++++++++++++-----------------
ctdb/wscript | 28 +-
27 files changed, 1294 insertions(+), 398 deletions(-)
create mode 100644 ctdb/protocol/protocol_util.h
Changeset truncated at 500 lines:
diff --git a/ctdb/common/system_aix.c b/ctdb/common/system_aix.c
index e44d1d6..f0a0a62 100644
--- a/ctdb/common/system_aix.c
+++ b/ctdb/common/system_aix.c
@@ -291,6 +291,9 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
return -1;
}
+ ZERO_STRUCTP(src);
+ ZERO_STRUCTP(dst);
+
/* Ethernet */
eth = (struct ether_header *)buffer;
diff --git a/ctdb/common/system_freebsd.c b/ctdb/common/system_freebsd.c
index e72fbbd..b709a5c 100644
--- a/ctdb/common/system_freebsd.c
+++ b/ctdb/common/system_freebsd.c
@@ -298,6 +298,9 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
return -1;
}
+ ZERO_STRUCTP(src);
+ ZERO_STRUCTP(dst);
+
/* Ethernet */
eth = (struct ether_header *)pkt;
diff --git a/ctdb/common/system_gnu.c b/ctdb/common/system_gnu.c
index 603345d..38ccd13 100644
--- a/ctdb/common/system_gnu.c
+++ b/ctdb/common/system_gnu.c
@@ -293,6 +293,9 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
return -1;
}
+ ZERO_STRUCTP(src);
+ ZERO_STRUCTP(dst);
+
/* Ethernet */
eth = (struct ether_header *)pkt;
diff --git a/ctdb/common/system_kfreebsd.c b/ctdb/common/system_kfreebsd.c
index 7e33990..d02f286 100644
--- a/ctdb/common/system_kfreebsd.c
+++ b/ctdb/common/system_kfreebsd.c
@@ -293,6 +293,9 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
return -1;
}
+ ZERO_STRUCTP(src);
+ ZERO_STRUCTP(dst);
+
/* Ethernet */
eth = (struct ether_header *)pkt;
diff --git a/ctdb/common/system_linux.c b/ctdb/common/system_linux.c
index 3647de9..fa77a45 100644
--- a/ctdb/common/system_linux.c
+++ b/ctdb/common/system_linux.c
@@ -518,6 +518,9 @@ int ctdb_sys_read_tcp_packet(int s, void *private_data,
return -1;
}
+ ZERO_STRUCTP(src);
+ ZERO_STRUCTP(dst);
+
/* Ethernet */
eth = (struct ether_header *)pkt;
diff --git a/ctdb/protocol/protocol.h b/ctdb/protocol/protocol.h
index 266fc4b..3c57e20 100644
--- a/ctdb/protocol/protocol.h
+++ b/ctdb/protocol/protocol.h
@@ -555,8 +555,19 @@ typedef union {
} ctdb_sock_addr;
struct ctdb_connection {
- ctdb_sock_addr src;
- ctdb_sock_addr dst;
+ union {
+ ctdb_sock_addr src;
+ ctdb_sock_addr server;
+ };
+ union {
+ ctdb_sock_addr dst;
+ ctdb_sock_addr client;
+ };
+};
+
+struct ctdb_connection_list {
+ uint32_t num;
+ struct ctdb_connection *conn;
};
struct ctdb_tunable {
diff --git a/ctdb/protocol/protocol_api.h b/ctdb/protocol/protocol_api.h
index d165ba2..67f32a0b 100644
--- a/ctdb/protocol/protocol_api.h
+++ b/ctdb/protocol/protocol_api.h
@@ -678,22 +678,4 @@ void sock_packet_header_set_reqid(struct sock_packet_header *h,
void sock_packet_header_set_length(struct sock_packet_header *h,
uint32_t length);
-/* From protocol/protocol_util.c */
-
-const char *ctdb_runstate_to_string(enum ctdb_runstate runstate);
-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);
-
-const char *ctdb_sock_addr_to_string(TALLOC_CTX *mem_ctx, ctdb_sock_addr *addr);
-int ctdb_sock_addr_cmp_ip(const ctdb_sock_addr *addr1,
- const ctdb_sock_addr *addr2);
-int ctdb_sock_addr_cmp(const ctdb_sock_addr *addr1,
- const ctdb_sock_addr *addr2);
-bool ctdb_sock_addr_same_ip(const ctdb_sock_addr *addr1,
- const ctdb_sock_addr *addr2);
-bool ctdb_sock_addr_same(const ctdb_sock_addr *addr1,
- const ctdb_sock_addr *addr2);
-
#endif /* __CTDB_PROTOCOL_API_H__ */
diff --git a/ctdb/protocol/protocol_private.h b/ctdb/protocol/protocol_private.h
index a609930..9e3ae8d 100644
--- a/ctdb/protocol/protocol_private.h
+++ b/ctdb/protocol/protocol_private.h
@@ -187,6 +187,12 @@ void ctdb_connection_push(struct ctdb_connection *in, uint8_t *buf,
int ctdb_connection_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
struct ctdb_connection **out, size_t *npull);
+size_t ctdb_connection_list_len(struct ctdb_connection_list *in);
+void ctdb_connection_list_push(struct ctdb_connection_list *in, uint8_t *buf,
+ size_t *npush);
+int ctdb_connection_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
+ struct ctdb_connection_list **out, size_t *npull);
+
size_t ctdb_tunable_len(struct ctdb_tunable *in);
void ctdb_tunable_push(struct ctdb_tunable *in, uint8_t *buf, size_t *npush);
int ctdb_tunable_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
diff --git a/ctdb/protocol/protocol_types.c b/ctdb/protocol/protocol_types.c
index ae6f7ed..57ad07a 100644
--- a/ctdb/protocol/protocol_types.c
+++ b/ctdb/protocol/protocol_types.c
@@ -2171,6 +2171,84 @@ int ctdb_connection_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
return ret;
}
+size_t ctdb_connection_list_len(struct ctdb_connection_list *in)
+{
+ size_t len;
+
+ len = ctdb_uint32_len(&in->num);
+ if (in->num > 0) {
+ len += in->num * ctdb_connection_len(&in->conn[0]);
+ }
+
+ return len;
+}
+
+void ctdb_connection_list_push(struct ctdb_connection_list *in, uint8_t *buf,
+ size_t *npush)
+{
+ size_t offset = 0, np;
+ uint32_t i;
+
+ ctdb_uint32_push(&in->num, buf+offset, &np);
+ offset += np;
+
+ for (i=0; i<in->num; i++) {
+ ctdb_connection_push(&in->conn[i], buf+offset, &np);
+ offset += np;
+ }
+
+ *npush = offset;
+}
+
+int ctdb_connection_list_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
+ struct ctdb_connection_list **out, size_t *npull)
+{
+ struct ctdb_connection_list *val;
+ size_t offset = 0, np;
+ uint32_t i;
+ int ret;
+
+ val = talloc(mem_ctx, struct ctdb_connection_list);
+ if (val == NULL) {
+ return ENOMEM;
+ }
+
+ ret = ctdb_uint32_pull(buf+offset, buflen-offset, &val->num, &np);
+ if (ret != 0) {
+ goto fail;
+ }
+ offset += np;
+
+ if (val->num == 0) {
+ val->conn = NULL;
+ goto done;
+ }
+
+ val->conn = talloc_array(val, struct ctdb_connection, val->num);
+ if (val->conn == NULL) {
+ ret = ENOMEM;
+ goto fail;
+ }
+
+ for (i=0; i<val->num; i++) {
+ ret = ctdb_connection_pull_elems(buf+offset, buflen-offset,
+ val, &val->conn[i], &np);
+ if (ret != 0) {
+ goto fail;
+ }
+ offset += np;
+ }
+
+done:
+ *out = val;
+ *npull = offset;
+ return 0;
+
+fail:
+ talloc_free(val);
+ return ret;
+}
+
size_t ctdb_tunable_len(struct ctdb_tunable *in)
{
return ctdb_uint32_len(&in->value) +
diff --git a/ctdb/protocol/protocol_util.c b/ctdb/protocol/protocol_util.c
index 0e1bf28..68a470f 100644
--- a/ctdb/protocol/protocol_util.c
+++ b/ctdb/protocol/protocol_util.c
@@ -21,11 +21,9 @@
#include "system/network.h"
#include <talloc.h>
-#include <tdb.h>
#include "protocol.h"
-#include "protocol_private.h"
-#include "protocol_api.h"
+#include "protocol_util.h"
static struct {
enum ctdb_runstate runstate;
@@ -113,39 +111,226 @@ 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, bool with_port)
{
- 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;
}
+ if (with_port) {
+ size_t len = strlen(buf);
+ int ret;
+
+ ret = snprintf(buf+len, buflen-len,
+ ":%u", ctdb_sock_addr_port(addr));
+ if (ret >= buflen-len) {
+ return ENOSPC;
+ }
+ }
+
+ return 0;
+}
+
+const char *ctdb_sock_addr_to_string(TALLOC_CTX *mem_ctx,
+ ctdb_sock_addr *addr, bool with_port)
+{
+ 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, with_port);
+ if (ret != 0) {
+ talloc_free(cip);
+ return NULL;
+ }
+
return cip;
}
-int ctdb_sock_addr_cmp_ip(const ctdb_sock_addr *addr1,
- const ctdb_sock_addr *addr2)
+static int ipv4_from_string(const char *str, struct sockaddr_in *ip)
{
- int ret = 0;
+ int ret;
+
+ *ip = (struct sockaddr_in) {
+ .sin_family = AF_INET,
+ };
+
+ ret = inet_pton(AF_INET, str, &ip->sin_addr);
+ if (ret != 1) {
+ return EINVAL;
+ }
+
+#ifdef HAVE_SOCK_SIN_LEN
+ ip->sin_len = sizeof(*ip);
+#endif
+ return 0;
+}
+
+static int ipv6_from_string(const char *str, struct sockaddr_in6 *ip6)
+{
+ int ret;
+
+ *ip6 = (struct sockaddr_in6) {
+ .sin6_family = AF_INET6,
+ };
+
+ ret = inet_pton(AF_INET6, str, &ip6->sin6_addr);
+ if (ret != 1) {
+ return EINVAL;
+ }
+
+#ifdef HAVE_SOCK_SIN_LEN
+ ip6->sin6_len = sizeof(*ip6);
+#endif
+ return 0;
+}
+
+static int ip_from_string(const char *str, ctdb_sock_addr *addr)
+{
+ char *p;
+ int ret;
+
+ if (addr == NULL) {
+ return EINVAL;
+ }
+
+ ZERO_STRUCTP(addr); /* valgrind :-) */
+
+ /* IPv4 or IPv6 address?
+ *
+ * Use rindex() because we need the right-most ':' below for
+ * IPv4-mapped IPv6 addresses anyway...
+ */
+ p = rindex(str, ':');
+ if (p == NULL) {
+ ret = ipv4_from_string(str, &addr->ip);
+ } else {
+ uint8_t ipv4_mapped_prefix[12] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff
+ };
+
+ ret = ipv6_from_string(str, &addr->ip6);
+ if (ret != 0) {
+ return ret;
+ }
+
+ /*
+ * Check for IPv4-mapped IPv6 address
+ * (e.g. ::ffff:192.0.2.128) - reparse as IPv4 if
+ * necessary
+ */
+ if (memcmp(&addr->ip6.sin6_addr.s6_addr[0],
+ ipv4_mapped_prefix,
+ sizeof(ipv4_mapped_prefix)) == 0) {
+ /* Reparse as IPv4 */
+ ret = ipv4_from_string(p+1, &addr->ip);
+ }
+ }
+
+ return ret;
+}
+int ctdb_sock_addr_from_string(const char *str,
+ ctdb_sock_addr *addr, bool with_port)
+{
+ char *p;
+ char s[64]; /* Much longer than INET6_ADDRSTRLEN */
+ unsigned port;
+ char *endp = NULL;
+ size_t len;
+ bool ret;
+
+ if (! with_port) {
+ ret = ip_from_string(str, addr);
+ return ret;
+ }
+
+ /* Parse out port number and then IP address */
+
+ len = strlen(str);
+ if (len >= sizeof(s)) {
+ return EINVAL;
+ }
+
+ strncpy(s, str, len+1);
+
+ p = rindex(s, ':');
+ if (p == NULL) {
+ return EINVAL;
+ }
+
+ port = 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);
+
+ ctdb_sock_addr_set_port(addr, port);
+
+ return ret;
+}
+
+unsigned int ctdb_sock_addr_port(ctdb_sock_addr *addr)
+{
+ switch (addr->sa.sa_family) {
+ case AF_INET:
+ return ntohs(addr->ip.sin_port);
+ break;
+ case AF_INET6:
+ return ntohs(addr->ip6.sin6_port);
+ break;
+ default:
+ return 0;
+ }
+}
+
+void ctdb_sock_addr_set_port(ctdb_sock_addr *addr, unsigned int port)
+{
+ switch (addr->sa.sa_family) {
+ case AF_INET:
+ addr->ip.sin_port = htons(port);
+ break;
+ case AF_INET6:
+ addr->ip6.sin6_port = htons(port);
+ break;
+ default:
+ break;
+ }
+}
+
+static int ctdb_sock_addr_cmp_family(const ctdb_sock_addr *addr1,
+ const ctdb_sock_addr *addr2)
+{
/* This is somewhat arbitrary. However, when used for sorting
* it just needs to be consistent.
*/
@@ -156,6 +341,19 @@ int ctdb_sock_addr_cmp_ip(const ctdb_sock_addr *addr1,
return 1;
}
+ return 0;
+}
+
+int ctdb_sock_addr_cmp_ip(const ctdb_sock_addr *addr1,
+ const ctdb_sock_addr *addr2)
+{
+ int ret;
+
--
Samba Shared Repository
More information about the samba-cvs
mailing list