242 lines
6.5 KiB
Diff
242 lines
6.5 KiB
Diff
|
From a95e28cc35e1d59cedb406914ba437e21bc3e1ea Mon Sep 17 00:00:00 2001
|
||
|
From: Jan Friesse <jfriesse@redhat.com>
|
||
|
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 <jfriesse@redhat.com>
|
||
|
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
|
||
|
(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
|
||
|
|