diff --git a/ctdb/protocol/protocol_util.c b/ctdb/protocol/protocol_util.c index 69bd67bf5c5..7ce19c1f79c 100644 --- a/ctdb/protocol/protocol_util.c +++ b/ctdb/protocol/protocol_util.c @@ -22,6 +22,8 @@ #include +#include "common/line.h" + #include "protocol.h" #include "protocol_util.h" @@ -642,56 +644,66 @@ const char *ctdb_connection_list_to_string( return out; } +struct ctdb_connection_list_read_state { + struct ctdb_connection_list *list; + bool client_first; +}; + +static int ctdb_connection_list_read_line(char *line, void *private_data) +{ + struct ctdb_connection_list_read_state *state = + (struct ctdb_connection_list_read_state *)private_data; + struct ctdb_connection conn; + int ret; + + /* Skip empty lines */ + if (line[0] == '\0') { + return 0; + } + + /* Comment */ + if (line[0] == '#') { + return 0; + } + + ret = ctdb_connection_from_string(line, state->client_first, &conn); + if (ret != 0) { + return ret; + } + + ret = ctdb_connection_list_add(state->list, &conn); + if (ret != 0) { + return ret; + } + + return 0; +} + int ctdb_connection_list_read(TALLOC_CTX *mem_ctx, bool client_first, struct ctdb_connection_list **conn_list) { - struct ctdb_connection_list *list; - char line[128]; /* long enough for IPv6 */ + struct ctdb_connection_list_read_state state; int ret; if (conn_list == NULL) { return EINVAL; } - list = talloc_zero(mem_ctx, struct ctdb_connection_list); - if (list == NULL) { + state.list = talloc_zero(mem_ctx, struct ctdb_connection_list); + if (state.list == NULL) { return ENOMEM; } - while (fgets(line, sizeof(line), stdin) != NULL) { - char *t; - struct ctdb_connection conn; + state.client_first = client_first; - /* Skip empty lines */ - if (line[0] == '\n') { - continue; - } + ret = line_read(0, + 128, + mem_ctx, + ctdb_connection_list_read_line, + &state, + NULL); - /* Comment */ - if (line[0] == '#') { - continue; - } + *conn_list = state.list; - t = strtok(line, "\n"); - if (t == NULL) { - goto fail; - } - - ret = ctdb_connection_from_string(t, client_first, &conn); - if (ret != 0) { - goto fail; - } - - ret = ctdb_connection_list_add(list, &conn); - if (ret != 0) { - goto fail; - } - } - - *conn_list = list; - return 0; - -fail: - talloc_free(list); - return EINVAL; + return ret; } diff --git a/ctdb/wscript b/ctdb/wscript index 6d69545b6aa..6e69e499985 100644 --- a/ctdb/wscript +++ b/ctdb/wscript @@ -434,7 +434,7 @@ def build(bld): bld.SAMBA_SUBSYSTEM('ctdb-protocol-util', source='protocol/protocol_util.c', - deps='replace talloc tdb') + deps='ctdb-util replace talloc tdb') bld.SAMBA_SUBSYSTEM('ctdb-client', source=bld.SUBDIR('client', @@ -938,7 +938,7 @@ def build(bld): bld.SAMBA_BINARY(target, source=src, deps='''ctdb-protocol-tests-common - samba-util talloc tdb''', + samba-util ctdb-util talloc tdb''', install_path='${CTDB_TEST_LIBEXECDIR}') bld.SAMBA_BINARY('event_protocol_test',