The branch, master has been updated via e411873 ctdb-build: Avoid unused variable warning in output from rpcgen via 6fd3ce5 ctdb-daemon: Fix some strict-aliasing warnings via 2807b18 ctdb-util: Fix warning about ignored result from system() via c1558ad ctdb: Use sys_read() and sys_write() to ensure correct signal interaction via fcd6ee1 ctdb-common: Copy functions sys_read() and sys_write() from source3 via 72fa984 ctdb-tools: Be more helpful when CTDB CLI tool is run on unconfigured node via 26a02a6 ctdb-tools: Factor out new function find_node_xpnn() from control_xpnn() from 47e7440 replace: Remove unused item returned by FAILED()
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit e4118730d1eb84959e10f4ce4995ce75d0ba7365 Author: Martin Schwenke <mar...@meltin.net> Date: Mon Aug 4 14:52:00 2014 +1000 ctdb-build: Avoid unused variable warning in output from rpcgen default/ctdb/utils/smnotify/gen_xdr.c: In function ‘xdr_status’: default/ctdb/utils/smnotify/gen_xdr.c:11:20: warning: unused variable ‘buf’ [-Wunused-variable] register int32_t *buf; ^ When generating the code, change it to assign the variable to itself. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> Autobuild-User(master): Amitay Isaacs <ami...@samba.org> Autobuild-Date(master): Thu Aug 21 07:11:02 CEST 2014 on sn-devel-104 commit 6fd3ce53914c5c5aa79b972b42258c722b227b88 Author: Martin Schwenke <mar...@meltin.net> Date: Mon Aug 4 14:50:17 2014 +1000 ctdb-daemon: Fix some strict-aliasing warnings Seeing these with -Wall: ../server/ctdb_call.c:1117:3: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] record_flags = *(uint32_t *)&c->data[c->keylen + c->datalen]; ^ memcpy() seems to be the easiest way to get fix these. The alternative would be to use unmarshalling functions. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 2807b185f438c40544d4fd133bc386e411b12d0c Author: Martin Schwenke <mar...@meltin.net> Date: Wed Jul 30 21:10:01 2014 +1000 ctdb-util: Fix warning about ignored result from system() Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit c1558adeaa980fb4bd6177d36250ec8262e9b9fe Author: Martin Schwenke <mar...@meltin.net> Date: Wed Jul 30 21:03:53 2014 +1000 ctdb: Use sys_read() and sys_write() to ensure correct signal interaction ... and avoid compiler warnings in some cases. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit fcd6ee1eac8627e75f72019027513cc46429a3a9 Author: Martin Schwenke <mar...@meltin.net> Date: Wed Jul 30 20:50:59 2014 +1000 ctdb-common: Copy functions sys_read() and sys_write() from source3 We really should extricate these from source3 and into some common code. However, just copy them for now to help get rid of a lot of warnings. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 72fa984423b77eaddb16b63e6c3857600e054836 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Aug 21 09:26:39 2014 +1000 ctdb-tools: Be more helpful when CTDB CLI tool is run on unconfigured node Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 26a02a64cda0501d57db686dee61fda0846083ee Author: Martin Schwenke <mar...@meltin.net> Date: Fri Aug 8 10:43:44 2014 +1000 ctdb-tools: Factor out new function find_node_xpnn() from control_xpnn() Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> ----------------------------------------------------------------------- Summary of changes: ctdb/common/ctdb_io.c | 10 +++-- ctdb/common/ctdb_util.c | 10 ++++-- ctdb/common/system_util.c | 34 ++++++++++++++++++++ ctdb/include/ctdb_private.h | 3 ++ ctdb/server/ctdb_call.c | 10 +++-- ctdb/server/ctdb_event_helper.c | 2 +- ctdb/server/ctdb_lock.c | 2 +- ctdb/server/ctdb_lock_helper.c | 2 +- ctdb/server/ctdb_logging.c | 16 +++++----- ctdb/server/ctdb_recover.c | 6 ++-- ctdb/server/ctdb_recoverd.c | 4 +- ctdb/server/ctdb_takeover.c | 4 +- ctdb/server/ctdb_traverse.c | 6 ++-- ctdb/server/ctdb_update_record.c | 4 +- ctdb/server/ctdb_vacuum.c | 4 +- ctdb/server/eventscript.c | 2 +- ctdb/tests/src/ctdb_porting_tests.c | 2 +- ctdb/tools/ctdb.c | 59 +++++++++++++++++++++++------------ ctdb/wscript | 4 ++- 19 files changed, 125 insertions(+), 59 deletions(-) Changeset truncated at 500 lines: diff --git a/ctdb/common/ctdb_io.c b/ctdb/common/ctdb_io.c index b5f8a72..467ec9a 100644 --- a/ctdb/common/ctdb_io.c +++ b/ctdb/common/ctdb_io.c @@ -196,7 +196,9 @@ static void queue_io_read(struct ctdb_queue *queue) } if (num_ready > 0) { - nread = read(queue->fd, queue->buffer.data + queue->buffer.length, num_ready); + nread = sys_read(queue->fd, + queue->buffer.data + queue->buffer.length, + num_ready); if (nread <= 0) { DEBUG(DEBUG_ERR, ("read error nread=%d\n", (int)nread)); goto failed; @@ -230,9 +232,9 @@ static void queue_io_write(struct ctdb_queue *queue) struct ctdb_queue_pkt *pkt = queue->out_queue; ssize_t n; if (queue->ctdb->flags & CTDB_FLAG_TORTURE) { - n = write(queue->fd, pkt->data, 1); + n = sys_write(queue->fd, pkt->data, 1); } else { - n = write(queue->fd, pkt->data, pkt->length); + n = sys_write(queue->fd, pkt->data, pkt->length); } if (n == -1 && errno != EAGAIN && errno != EWOULDBLOCK) { @@ -308,7 +310,7 @@ int ctdb_queue_send(struct ctdb_queue *queue, uint8_t *data, uint32_t length) queue overhead. This relies on non-blocking sockets */ if (queue->out_queue == NULL && queue->fd != -1 && !(queue->ctdb->flags & CTDB_FLAG_TORTURE)) { - ssize_t n = write(queue->fd, data, length2); + ssize_t n = sys_write(queue->fd, data, length2); if (n == -1 && errno != EAGAIN && errno != EWOULDBLOCK) { talloc_free(queue->fde); queue->fde = NULL; diff --git a/ctdb/common/ctdb_util.c b/ctdb/common/ctdb_util.c index c4ac583..b9b0ad7 100644 --- a/ctdb/common/ctdb_util.c +++ b/ctdb/common/ctdb_util.c @@ -73,7 +73,7 @@ void ctdb_die(struct ctdb_context *ctdb, const char *msg) */ void ctdb_external_trace(void) { - + int ret; const char * t = getenv("CTDB_EXTERNAL_TRACE"); char * cmd; @@ -83,7 +83,11 @@ void ctdb_external_trace(void) cmd = talloc_asprintf(NULL, "%s %lu", t, (unsigned long) getpid()); DEBUG(DEBUG_WARNING,("begin external trace: %s\n", cmd)); - system(cmd); + ret = system(cmd); + if (ret == -1) { + DEBUG(DEBUG_ERR, + ("external trace command \"%s\" failed\n", cmd)); + } DEBUG(DEBUG_WARNING,("end external trace: %s\n", cmd)); talloc_free(cmd); } @@ -323,7 +327,7 @@ struct ctdb_rec_data *ctdb_marshall_loop_next(struct ctdb_marshall_buffer *m, st if (r->datalen < sizeof(*header)) { return NULL; } - *header = *(struct ctdb_ltdb_header *)&r->data[r->keylen]; + memcpy(header, &r->data[r->keylen], sizeof(*header)); } return r; diff --git a/ctdb/common/system_util.c b/ctdb/common/system_util.c index fe0f403..344e7d7 100644 --- a/ctdb/common/system_util.c +++ b/ctdb/common/system_util.c @@ -369,3 +369,37 @@ void mkdir_p_or_die(const char *dir, int mode) exit(1); } } + +/* A read wrapper that will deal with EINTR. For now, copied from + * source3/lib/system.c + */ +ssize_t sys_read(int fd, void *buf, size_t count) +{ + ssize_t ret; + + do { + ret = read(fd, buf, count); +#if defined(EWOULDBLOCK) + } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); +#else + } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); +#endif + return ret; +} + +/* A write wrapper that will deal with EINTR. For now, copied from + * source3/lib/system.c + */ +ssize_t sys_write(int fd, const void *buf, size_t count) +{ + ssize_t ret; + + do { + ret = write(fd, buf, count); +#if defined(EWOULDBLOCK) + } while (ret == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)); +#else + } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); +#endif + return ret; +} diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index 416cf56..36ebe70 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -1607,4 +1607,7 @@ struct lock_request *ctdb_lock_alldb(struct ctdb_context *ctdb, int mkdir_p(const char *dir, int mode); void mkdir_p_or_die(const char *dir, int mode); +ssize_t sys_read(int fd, void *buf, size_t count); +ssize_t sys_write(int fd, const void *buf, size_t count); + #endif diff --git a/ctdb/server/ctdb_call.c b/ctdb/server/ctdb_call.c index a4fa03d..901e585 100644 --- a/ctdb/server/ctdb_call.c +++ b/ctdb/server/ctdb_call.c @@ -437,7 +437,8 @@ void ctdb_request_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr len = offsetof(struct ctdb_req_dmaster, data) + key.dsize + data.dsize + sizeof(uint32_t); if (len <= c->hdr.length) { - record_flags = *(uint32_t *)&c->data[c->keylen + c->datalen]; + memcpy(&record_flags, &c->data[c->keylen + c->datalen], + sizeof(record_flags)); } ctdb_db = find_ctdb_db(ctdb, c->db_id); @@ -1114,7 +1115,8 @@ void ctdb_reply_dmaster(struct ctdb_context *ctdb, struct ctdb_req_header *hdr) len = offsetof(struct ctdb_reply_dmaster, data) + key.dsize + data.dsize + sizeof(uint32_t); if (len <= c->hdr.length) { - record_flags = *(uint32_t *)&c->data[c->keylen + c->datalen]; + memcpy(&record_flags, &c->data[c->keylen + c->datalen], + sizeof(record_flags)); } ret = ctdb_ltdb_lock_requeue(ctdb_db, key, hdr, @@ -1457,7 +1459,7 @@ static void revokechild_handler(struct event_context *ev, struct fd_event *fde, int ret; char c; - ret = read(rc->fd[0], &c, 1); + ret = sys_read(rc->fd[0], &c, 1); if (ret != 1) { DEBUG(DEBUG_ERR,("Failed to read status from revokechild. errno:%d\n", errno)); rc->status = -1; @@ -1675,7 +1677,7 @@ int ctdb_start_revoke_ro_record(struct ctdb_context *ctdb, struct ctdb_db_contex c = ctdb_revoke_all_delegations(ctdb, ctdb_db, tdata, key, header, data); child_finished: - write(rc->fd[1], &c, 1); + sys_write(rc->fd[1], &c, 1); /* make sure we die when our parent dies */ while (ctdb_kill(ctdb, parent, 0) == 0 || errno != ESRCH) { sleep(5); diff --git a/ctdb/server/ctdb_event_helper.c b/ctdb/server/ctdb_event_helper.c index 238103a..9ff763c 100644 --- a/ctdb/server/ctdb_event_helper.c +++ b/ctdb/server/ctdb_event_helper.c @@ -123,7 +123,7 @@ int main(int argc, char *argv[]) if (output == ENOENT || output == ENOEXEC) { output = -output; } - write(write_fd, &output, sizeof(output)); + sys_write(write_fd, &output, sizeof(output)); exit(output); } diff --git a/ctdb/server/ctdb_lock.c b/ctdb/server/ctdb_lock.c index 72352af..93137df 100644 --- a/ctdb/server/ctdb_lock.c +++ b/ctdb/server/ctdb_lock.c @@ -443,7 +443,7 @@ static void ctdb_lock_handler(struct tevent_context *ev, } /* Read the status from the child process */ - if (read(lock_ctx->fd[0], &c, 1) != 1) { + if (sys_read(lock_ctx->fd[0], &c, 1) != 1) { locked = false; } else { locked = (c == 0 ? true : false); diff --git a/ctdb/server/ctdb_lock_helper.c b/ctdb/server/ctdb_lock_helper.c index 709130c..d831a2d 100644 --- a/ctdb/server/ctdb_lock_helper.c +++ b/ctdb/server/ctdb_lock_helper.c @@ -26,7 +26,7 @@ static char *progname = NULL; static void send_result(int fd, char result) { - write(fd, &result, 1); + sys_write(fd, &result, 1); if (result == 1) { exit(1); } diff --git a/ctdb/server/ctdb_logging.c b/ctdb/server/ctdb_logging.c index f22c9f3..9f6f3b5 100644 --- a/ctdb/server/ctdb_logging.c +++ b/ctdb/server/ctdb_logging.c @@ -129,7 +129,7 @@ int start_syslog_daemon(struct ctdb_context *ctdb) set_close_on_exec(state->fd[0]); close(startup_fd[1]); - n = read(startup_fd[0], &dummy, sizeof(dummy)); + n = sys_read(startup_fd[0], &dummy, sizeof(dummy)); close(startup_fd[0]); if (n < sizeof(dummy)) { return -1; @@ -182,7 +182,7 @@ int start_syslog_daemon(struct ctdb_context *ctdb) /* Tell parent that we're up */ ret = 0; - write(startup_fd[1], &ret, sizeof(ret)); + sys_write(startup_fd[1], &ret, sizeof(ret)); close(startup_fd[1]); event_loop_wait(ctdb->ev); @@ -304,7 +304,7 @@ static void ctdb_logfile_log(const char *format, va_list ap) if (ret == -1) { const char *errstr = "vasprintf failed\n"; - write(log_state->fd, errstr, strlen(errstr)); + sys_write(log_state->fd, errstr, strlen(errstr)); return; } @@ -319,11 +319,11 @@ static void ctdb_logfile_log(const char *format, va_list ap) free(s); if (ret == -1) { const char *errstr = "asprintf failed\n"; - write(log_state->fd, errstr, strlen(errstr)); + sys_write(log_state->fd, errstr, strlen(errstr)); return; } if (s2) { - write(log_state->fd, s2, strlen(s2)); + sys_write(log_state->fd, s2, strlen(s2)); free(s2); } } @@ -337,12 +337,12 @@ static void ctdb_logfile_log_add(const char *format, va_list ap) if (ret == -1) { const char *errstr = "vasprintf failed\n"; - write(log_state->fd, errstr, strlen(errstr)); + sys_write(log_state->fd, errstr, strlen(errstr)); return; } if (s) { - write(log_state->fd, s, strlen(s)); + sys_write(log_state->fd, s, strlen(s)); free(s); } } @@ -424,7 +424,7 @@ static void ctdb_log_handler(struct event_context *ev, struct fd_event *fde, return; } - n = read(log->pfd, &log->buf[log->buf_used], + n = sys_read(log->pfd, &log->buf[log->buf_used], sizeof(log->buf) - log->buf_used); if (n > 0) { log->buf_used += n; diff --git a/ctdb/server/ctdb_recover.c b/ctdb/server/ctdb_recover.c index ecf3aba..d45b7f6 100644 --- a/ctdb/server/ctdb_recover.c +++ b/ctdb/server/ctdb_recover.c @@ -534,7 +534,7 @@ static void set_recmode_handler(struct event_context *ev, struct fd_event *fde, the file which at this time SHOULD be locked by the recovery daemon on the recmaster */ - ret = read(state->fd[0], &c, 1); + ret = sys_read(state->fd[0], &c, 1); if (ret != 1 || c != 0) { ctdb_request_control_reply(state->ctdb, state->c, NULL, -1, "managed to lock reclock file from inside daemon"); talloc_free(state); @@ -679,11 +679,11 @@ int32_t ctdb_control_set_recmode(struct ctdb_context *ctdb, cc = 1; } - write(state->fd[1], &cc, 1); + sys_write(state->fd[1], &cc, 1); /* make sure we die when our parent dies */ while (ctdb_kill(ctdb, parent, 0) == 0 || errno != ESRCH) { sleep(5); - write(state->fd[1], &cc, 1); + sys_write(state->fd[1], &cc, 1); } _exit(0); } diff --git a/ctdb/server/ctdb_recoverd.c b/ctdb/server/ctdb_recoverd.c index 50709a6..9b553b7 100644 --- a/ctdb/server/ctdb_recoverd.c +++ b/ctdb/server/ctdb_recoverd.c @@ -3383,7 +3383,7 @@ static void reclock_child_handler(struct event_context *ev, struct fd_event *fde talloc_free(state->te); state->te = NULL; - ret = read(state->fd[0], &c, 1); + ret = sys_read(state->fd[0], &c, 1); if (ret != 1 || c != RECLOCK_OK) { DEBUG(DEBUG_ERR,(__location__ " reclock child process returned error %d\n", c)); state->status = RECLOCK_FAILED; @@ -3445,7 +3445,7 @@ static int check_recovery_lock(struct ctdb_context *ctdb) cc = RECLOCK_FAILED; } - write(state->fd[1], &cc, 1); + sys_write(state->fd[1], &cc, 1); /* make sure we die when our parent dies */ while (ctdb_kill(ctdb, parent, 0) == 0 || errno != ESRCH) { sleep(5); diff --git a/ctdb/server/ctdb_takeover.c b/ctdb/server/ctdb_takeover.c index 8449288..a3b9592 100644 --- a/ctdb/server/ctdb_takeover.c +++ b/ctdb/server/ctdb_takeover.c @@ -4471,7 +4471,7 @@ static void ctdb_reloadips_child_handler(struct event_context *ev, struct fd_eve char res; int ret; - ret = read(h->fd[0], &res, 1); + ret = sys_read(h->fd[0], &res, 1); if (ret < 1 || res != 0) { DEBUG(DEBUG_ERR, (__location__ " Reloadips child process returned error\n")); res = 1; @@ -4708,7 +4708,7 @@ int32_t ctdb_control_reload_public_ips(struct ctdb_context *ctdb, struct ctdb_re } } - write(h->fd[1], &res, 1); + sys_write(h->fd[1], &res, 1); /* make sure we die when our parent dies */ while (ctdb_kill(ctdb, parent, 0) == 0 || errno != ESRCH) { sleep(5); diff --git a/ctdb/server/ctdb_traverse.c b/ctdb/server/ctdb_traverse.c index 99e7e8f..64f2530 100644 --- a/ctdb/server/ctdb_traverse.c +++ b/ctdb/server/ctdb_traverse.c @@ -62,7 +62,7 @@ static void ctdb_traverse_child_handler(struct tevent_context *ev, struct tevent ssize_t n; /* Read the number of records sent by traverse child */ - n = read(h->fd[0], &res, sizeof(res)); + n = sys_read(h->fd[0], &res, sizeof(res)); if (n < 0 || n != sizeof(res)) { /* Traverse child failed */ DEBUG(DEBUG_ERR, ("Local traverse failed db:%s reqid:%d\n", @@ -213,7 +213,7 @@ static struct ctdb_traverse_local_handle *ctdb_traverse_local(struct ctdb_db_con d = ctdb_marshall_record(h, h->reqid, tdb_null, NULL, tdb_null); if (d == NULL) { res = 0; - write(h->fd[1], &res, sizeof(int)); + sys_write(h->fd[1], &res, sizeof(int)); _exit(0); } @@ -243,7 +243,7 @@ static struct ctdb_traverse_local_handle *ctdb_traverse_local(struct ctdb_db_con } } - write(h->fd[1], &res, sizeof(res)); + sys_write(h->fd[1], &res, sizeof(res)); while (ctdb_kill(ctdb, parent, 0) == 0 || errno != ESRCH) { sleep(5); diff --git a/ctdb/server/ctdb_update_record.c b/ctdb/server/ctdb_update_record.c index 7bfa08a..81e3625 100644 --- a/ctdb/server/ctdb_update_record.c +++ b/ctdb/server/ctdb_update_record.c @@ -191,7 +191,7 @@ static void childwrite_handler(struct event_context *ev, struct fd_event *fde, talloc_set_destructor(h, NULL); - ret = read(h->fd[0], &c, 1); + ret = sys_read(h->fd[0], &c, 1); if (ret < 1) { DEBUG(DEBUG_ERR, (__location__ " Read returned %d. Childwrite failed\n", ret)); c = 1; @@ -258,7 +258,7 @@ static struct childwrite_handle *ctdb_childwrite( c = 1; } - write(result->fd[1], &c, 1); + sys_write(result->fd[1], &c, 1); /* make sure we die when our parent dies */ while (ctdb_kill(ctdb_db->ctdb, parent, 0) == 0 || errno != ESRCH) { diff --git a/ctdb/server/ctdb_vacuum.c b/ctdb/server/ctdb_vacuum.c index c3054bf..5013339 100644 --- a/ctdb/server/ctdb_vacuum.c +++ b/ctdb/server/ctdb_vacuum.c @@ -1411,7 +1411,7 @@ static void vacuum_child_handler(struct event_context *ev, struct fd_event *fde, DEBUG(DEBUG_INFO,("Vacuuming child process %d finished for db %s\n", child_ctx->child_pid, child_ctx->vacuum_handle->ctdb_db->db_name)); child_ctx->child_pid = -1; - ret = read(child_ctx->fd[0], &c, 1); + ret = sys_read(child_ctx->fd[0], &c, 1); if (ret != 1 || c != 0) { child_ctx->status = VACUUM_ERROR; DEBUG(DEBUG_ERR, ("A vacuum child process failed with an error for database %s. ret=%d c=%d\n", child_ctx->vacuum_handle->ctdb_db->db_name, ret, c)); @@ -1503,7 +1503,7 @@ ctdb_vacuum_event(struct event_context *ev, struct timed_event *te, } cc = ctdb_vacuum_and_repack_db(ctdb_db, full_vacuum_run); - write(child_ctx->fd[1], &cc, 1); + sys_write(child_ctx->fd[1], &cc, 1); _exit(0); } diff --git a/ctdb/server/eventscript.c b/ctdb/server/eventscript.c index 604b8de..447a83c 100644 --- a/ctdb/server/eventscript.c +++ b/ctdb/server/eventscript.c @@ -364,7 +364,7 @@ static void ctdb_event_script_handler(struct event_context *ev, struct fd_event return; } - r = read(state->fd[0], ¤t->status, sizeof(current->status)); + r = sys_read(state->fd[0], ¤t->status, sizeof(current->status)); if (r < 0) { current->status = -errno; } else if (r != sizeof(current->status)) { diff --git a/ctdb/tests/src/ctdb_porting_tests.c b/ctdb/tests/src/ctdb_porting_tests.c index 063c6da..6752f84 100644 --- a/ctdb/tests/src/ctdb_porting_tests.c +++ b/ctdb/tests/src/ctdb_porting_tests.c @@ -141,7 +141,7 @@ static int socket_client_connect(void) static int socket_client_write(int client) { - if (write(client, "\0", 1) == -1) { + if (sys_write(client, "\0", 1) == -1) { DEBUG(DEBUG_CRIT,("Unable to write to client socket: %s\n", strerror(errno))); return -1; } diff --git a/ctdb/tools/ctdb.c b/ctdb/tools/ctdb.c index 3b158fd..ca79363 100644 --- a/ctdb/tools/ctdb.c +++ b/ctdb/tools/ctdb.c @@ -885,14 +885,12 @@ static struct pnn_node *read_nodes_file(TALLOC_CTX *mem_ctx) discover the pnn by loading the nodes file and try to bind to all addresses one at a time until the ip address is found. */ -static int control_xpnn(struct ctdb_context *ctdb, int argc, const char **argv) +static int find_node_xpnn(void) { TALLOC_CTX *mem_ctx = talloc_new(NULL); struct pnn_node *pnn_nodes; struct pnn_node *pnn_node; - assert_single_node_only(); - pnn_nodes = read_nodes_file(mem_ctx); if (pnn_nodes == NULL) { DEBUG(DEBUG_ERR,("Failed to read nodes file\n")); @@ -902,9 +900,8 @@ static int control_xpnn(struct ctdb_context *ctdb, int argc, const char **argv) for(pnn_node=pnn_nodes;pnn_node;pnn_node=pnn_node->next) { if (ctdb_sys_have_ip(&pnn_node->addr)) { - printf("PNN:%d\n", pnn_node->pnn); talloc_free(mem_ctx); - return 0; + return pnn_node->pnn; } } @@ -913,6 +910,21 @@ static int control_xpnn(struct ctdb_context *ctdb, int argc, const char **argv) return -1; } +static int control_xpnn(struct ctdb_context *ctdb, int argc, const char **argv) +{ + uint32_t pnn; + + assert_single_node_only(); + + pnn = find_node_xpnn(); + if (pnn == -1) { + return -1; + } + + printf("PNN:%d\n", pnn); + return 0; +} + /* Helpers for ctdb status */ static bool is_partially_online(struct ctdb_context *ctdb, struct ctdb_node_and_flags *node) -- Samba Shared Repository