ctdb-tests: Add signal code matching utility
authorAmitay Isaacs <amitay@gmail.com>
Tue, 10 Jul 2018 09:09:00 +0000 (19:09 +1000)
committerMartin Schwenke <martins@samba.org>
Sat, 28 Jul 2018 01:50:10 +0000 (03:50 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=13520

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/tests/src/sigcode.c [new file with mode: 0644]
ctdb/wscript

diff --git a/ctdb/tests/src/sigcode.c b/ctdb/tests/src/sigcode.c
new file mode 100644 (file)
index 0000000..1318d24
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+   Portability layer for signal codes
+
+   Copyright (C) Amitay Isaacs  2018
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * These signals are as listed in POSIX standard
+ * IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008)
+ */
+
+#include "replace.h"
+#include "system/wait.h"
+
+struct {
+       const char *label;
+       int code;
+} sig_codes[] = {
+       { "SIGABRT", SIGABRT },
+       { "SIGALRM", SIGALRM },
+       { "SIBGUS", SIGBUS },
+       { "SIGCHLD", SIGCHLD },
+       { "SIGCONT", SIGCONT },
+       { "SIGFPE", SIGFPE },
+       { "SIGHUP", SIGHUP },
+       { "SIGILL", SIGILL },
+       { "SIGINT", SIGINT },
+       { "SIGKILL", SIGKILL },
+       { "SIGPIPE", SIGPIPE },
+       { "SIGQUIT", SIGQUIT },
+       { "SIGSEGV", SIGSEGV },
+       { "SIGSTOP", SIGSTOP },
+       { "SIGTERM", SIGTERM },
+       { "SIGTSTP", SIGTSTP },
+       { "SIGTTIN", SIGTTIN },
+       { "SIGTTOU", SIGTTOU },
+       { "SIGUSR1", SIGUSR1 },
+       { "SIGUSR2", SIGUSR2 },
+       { "SIGTRAP", SIGTRAP },
+       { "SIGURG", SIGURG },
+       { "SIGXCPU", SIGXCPU },
+       { "SIGXFSZ", SIGXFSZ },
+
+};
+
+static void dump(void)
+{
+       int i;
+
+       for (i=0; i<ARRAY_SIZE(sig_codes); i++) {
+               printf("%s %d\n", sig_codes[i].label, sig_codes[i].code);
+       }
+}
+
+static void match_label(const char *str)
+{
+       int code = -1;
+       int i;
+
+       for (i=0; i<ARRAY_SIZE(sig_codes); i++) {
+               if (strcasecmp(sig_codes[i].label, str) == 0) {
+                       code = sig_codes[i].code;
+                       break;
+               }
+       }
+
+       printf("%d\n", code);
+}
+
+static void match_code(int code)
+{
+       const char *label = "UNKNOWN";
+       int i;
+
+       for (i=0; i<ARRAY_SIZE(sig_codes); i++) {
+               if (sig_codes[i].code == code) {
+                       label = sig_codes[i].label;
+                       break;
+               }
+       }
+
+       printf("%s\n", label);
+}
+
+int main(int argc, const char **argv)
+{
+       long int code;
+       char *endptr;
+
+       if (argc != 2) {
+               fprintf(stderr, "Usage: %s dump|<sigcode>\n", argv[0]);
+               exit(1);
+       }
+
+       if (strcmp(argv[1], "dump") == 0) {
+               dump();
+       } else {
+               code = strtol(argv[1], &endptr, 0);
+               if (*endptr == '\0') {
+                       match_code(code);
+               } else {
+                       match_label(argv[1]);
+               }
+       }
+
+       exit(0);
+}
index 08c8016dd39bc4c3b06a29d86aa5415c4ac70821..c26bd8c0d9a29838f56508d13bd5fc438fa16c5d 100644 (file)
@@ -847,6 +847,11 @@ def build(bld):
                      deps='replace',
                      install_path='${CTDB_TEST_LIBEXECDIR}')
 
+    bld.SAMBA_BINARY('sigcode',
+                     source='tests/src/sigcode.c',
+                     deps='replace',
+                     install_path='${CTDB_TEST_LIBEXECDIR}')
+
     # Unit tests
     ctdb_unit_tests = [
         'db_hash_test',