From a95e28cc35e1d59cedb406914ba437e21bc3e1ea Mon Sep 17 00:00:00 2001 From: Jan Friesse Date: Thu, 14 Feb 2019 16:05:59 +0100 Subject: [PATCH] quorumtool: Fix exit status codes 1. Use EXIT_SUCCESS and EXIT_FAILURE when possible 2. For -s option return EXIT_SUCCESS when no problem appeared and node is quorate, EXIT_FAILURE if problem appeared and exit code 2 (EXIT_NOT_QUORATE) when no problem appeared but node is not quorate. 3. Document exit codes in the man page Signed-off-by: Jan Friesse Reviewed-by: Christine Caulfield (cherry picked from commit db38e3958c4f88d5d06e8f7c83d6d90334d9fbd2) --- man/corosync-quorumtool.8 | 17 +++++++++++- tools/corosync-quorumtool.c | 53 ++++++++++++++++++++++--------------- 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/man/corosync-quorumtool.8 b/man/corosync-quorumtool.8 index 915f35ff..2fc4e020 100644 --- a/man/corosync-quorumtool.8 +++ b/man/corosync-quorumtool.8 @@ -31,7 +31,7 @@ .\" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF .\" * THE POSSIBILITY OF SUCH DAMAGE. .\" */ -.TH COROSYNC-QUORUMTOOL 8 2012-01-12 +.TH COROSYNC-QUORUMTOOL 8 2019-02-14 .SH NAME corosync-quorumtool \- Set and display quorum settings. .SH SYNOPSIS @@ -89,6 +89,21 @@ show this help text show version and exit .PP * Starred items only work if votequorum is the quorum provider for corosync +.SH EXIT STATUS +corosync-quorumtool may return one of several error codes if it encounters problems. +.TP +0 +No problems occurred (quorate for +.B -s +operation). +.TP +1 +Generic error code. +.TP +2 +Not quorate (returned only for +.B -s +operation). .SH SEE ALSO .BR corosync_overview (8), .BR votequorum_overview (8), diff --git a/tools/corosync-quorumtool.c b/tools/corosync-quorumtool.c index e5d17b16..66ca7de5 100644 --- a/tools/corosync-quorumtool.c +++ b/tools/corosync-quorumtool.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2014 Red Hat, Inc. + * Copyright (c) 2009-2019 Red Hat, Inc. * * All rights reserved. * @@ -75,6 +75,8 @@ typedef enum { SORT_NODENAME } sorttype_t; +#define EXIT_NOT_QUORATE 2 + /* * global vars */ @@ -238,7 +240,7 @@ static int set_votes(uint32_t nodeid, int votes) votes, nodeid, cs_strerror(err)); } - return err==CS_OK?0:err; + return (err == CS_OK ? EXIT_SUCCESS : EXIT_FAILURE); } static int set_expected(int expected_votes) @@ -249,7 +251,7 @@ static int set_expected(int expected_votes) fprintf(stderr, "Unable to set expected votes: %s\n", cs_strerror(err)); } - return err==CS_OK?0:err; + return (err == CS_OK ? EXIT_SUCCESS : EXIT_FAILURE); } /* @@ -638,9 +640,9 @@ static int display_quorum_data(int is_quorate, } /* - * return 1 if quorate - * 0 if not quorate - * -1 on error + * return EXIT_SUCCESS if quorate + * EXIT_NOT_QUORATE if not quorate + * EXIT_FAILURE on error */ static int show_status(nodeid_format_t nodeid_format, name_format_t name_format, sorttype_t sort_type) { @@ -689,15 +691,15 @@ static int show_status(nodeid_format_t nodeid_format, name_format_t name_format, quorum_err: if (err != CS_OK) { - return -1; + return EXIT_FAILURE; } err = display_quorum_data(is_quorate, nodeid_format, name_format, sort_type, 0); if (err != CS_OK) { - return -1; + return EXIT_FAILURE; } - return is_quorate; + return (is_quorate ? EXIT_SUCCESS : EXIT_NOT_QUORATE); } static int monitor_status(nodeid_format_t nodeid_format, name_format_t name_format, sorttype_t sort_type) { @@ -750,7 +752,7 @@ static int monitor_status(nodeid_format_t nodeid_format, name_format_t name_form } quorum_err: - return -1; + return EXIT_FAILURE; } static int show_nodes(nodeid_format_t nodeid_format, name_format_t name_format, sorttype_t sort_type) @@ -784,23 +786,30 @@ static int unregister_qdevice(void) { int err; struct votequorum_info info; + int result; + + result = EXIT_FAILURE; err = votequorum_getinfo(v_handle, our_nodeid, &info); if (err != CS_OK) { fprintf(stderr, "Unable to get quorum device info: %s\n", cs_strerror(err)); - return -1; + goto err_exit; } if (!(info.flags & VOTEQUORUM_INFO_QDEVICE_REGISTERED)) { - return 0; + result = EXIT_SUCCESS; + goto err_exit; } err = votequorum_qdevice_unregister(v_handle, info.qdevice_name); if (err != CS_OK) { fprintf(stderr, "Unable to unregister quorum device: %s\n", cs_strerror(err)); - return -1; + goto err_exit; } - return 0; + + result = EXIT_SUCCESS; +err_exit: + return result; } /* @@ -884,7 +893,7 @@ int main (int argc, char *argv[]) { if (init_all()) { close_all(); - exit(1); + exit(EXIT_FAILURE); } while ( (opt = getopt(argc, argv, options)) != -1 ) { @@ -894,7 +903,7 @@ int main (int argc, char *argv[]) { command_opt = CMD_UNREGISTER_QDEVICE; } else { fprintf(stderr, "You cannot unregister quorum device, corosync is not using votequorum\n"); - exit(2); + exit(EXIT_FAILURE); } break; case 's': @@ -928,14 +937,14 @@ int main (int argc, char *argv[]) { } } else { fprintf(stderr, "You cannot change expected votes, corosync is not using votequorum\n"); - exit(2); + exit(EXIT_FAILURE); } break; case 'n': l = strtol(optarg, &endptr, 0); if ((l == 0 && endptr == optarg) || l < 0) { fprintf(stderr, "The nodeid was not valid, try a positive number\n"); - exit(2); + exit(EXIT_FAILURE); } nodeid = l; nodeid_set = 1; @@ -945,14 +954,14 @@ int main (int argc, char *argv[]) { votes = strtol(optarg, &endptr, 0); if ((votes == 0 && endptr == optarg) || votes < 0) { fprintf(stderr, "New votes value was not valid, try a positive number or zero\n"); - exit(2); + exit(EXIT_FAILURE); } else { command_opt = CMD_SETVOTES; } } else { fprintf(stderr, "You cannot change node votes, corosync is not using votequorum\n"); - exit(2); + exit(EXIT_FAILURE); } break; case 'o': @@ -966,7 +975,7 @@ int main (int argc, char *argv[]) { break; default: fprintf(stderr, "Invalid ordering option. valid orders are a(address), i(node ID) or n(name)\n"); - exit(2); + exit(EXIT_FAILURE); break; } break; @@ -985,7 +994,7 @@ int main (int argc, char *argv[]) { switch (command_opt) { case CMD_UNKNOWN: show_usage(argv[0]); - ret = -1; + ret = EXIT_FAILURE; break; case CMD_SHOWNODES: ret = show_nodes(nodeid_format, address_format, sort_opt); -- 2.21.1