summaryrefslogtreecommitdiffstats
path: root/agents/kdump/options.h
diff options
context:
space:
mode:
Diffstat (limited to 'agents/kdump/options.h')
-rw-r--r--agents/kdump/options.h260
1 files changed, 260 insertions, 0 deletions
diff --git a/agents/kdump/options.h b/agents/kdump/options.h
new file mode 100644
index 0000000..3cf7b43
--- /dev/null
+++ b/agents/kdump/options.h
@@ -0,0 +1,260 @@
+/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*-
+ *
+ * Copyright (c) Ryan O'Hara (rohara@redhat.com)
+ * Copyright (c) Red Hat, Inc.
+ *
+ * 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 2 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef _FENCE_KDUMP_OPTIONS_H
+#define _FENCE_KDUMP_OPTIONS_H
+
+#include "list.h"
+
+#define FENCE_KDUMP_NAME_LEN 256
+#define FENCE_KDUMP_ADDR_LEN 46
+#define FENCE_KDUMP_PORT_LEN 6
+
+enum {
+ FENCE_KDUMP_ACTION_OFF = 0,
+ FENCE_KDUMP_ACTION_ON = 1,
+ FENCE_KDUMP_ACTION_REBOOT = 2,
+ FENCE_KDUMP_ACTION_STATUS = 3,
+ FENCE_KDUMP_ACTION_LIST = 4,
+ FENCE_KDUMP_ACTION_MONITOR = 5,
+ FENCE_KDUMP_ACTION_METADATA = 6,
+ FENCE_KDUMP_ACTION_VALIDATE = 7,
+};
+
+enum {
+ FENCE_KDUMP_FAMILY_AUTO = AF_UNSPEC,
+ FENCE_KDUMP_FAMILY_IPV6 = AF_INET6,
+ FENCE_KDUMP_FAMILY_IPV4 = AF_INET,
+};
+
+#define FENCE_KDUMP_DEFAULT_IPPORT 7410
+#define FENCE_KDUMP_DEFAULT_FAMILY 0
+#define FENCE_KDUMP_DEFAULT_ACTION 0
+#define FENCE_KDUMP_DEFAULT_COUNT 0
+#define FENCE_KDUMP_DEFAULT_INTERVAL 10
+#define FENCE_KDUMP_DEFAULT_TIMEOUT 60
+#define FENCE_KDUMP_DEFAULT_VERBOSE 0
+
+typedef struct fence_kdump_opts {
+ char *nodename;
+ int ipport;
+ int family;
+ int action;
+ int count;
+ int interval;
+ int timeout;
+ int verbose;
+ struct list_head nodes;
+} fence_kdump_opts_t;
+
+typedef struct fence_kdump_node {
+ char name[FENCE_KDUMP_NAME_LEN];
+ char addr[FENCE_KDUMP_ADDR_LEN];
+ char port[FENCE_KDUMP_PORT_LEN];
+ int socket;
+ struct addrinfo *info;
+ struct list_head list;
+} fence_kdump_node_t;
+
+static inline void
+init_node (fence_kdump_node_t *node)
+{
+ node->info = NULL;
+}
+
+static inline void
+free_node (fence_kdump_node_t *node)
+{
+ freeaddrinfo (node->info);
+ free (node);
+}
+
+static inline void
+print_node (const fence_kdump_node_t *node)
+{
+ fprintf (stdout, "[debug]: node { \n");
+ fprintf (stdout, "[debug]: name = %s\n", node->name);
+ fprintf (stdout, "[debug]: addr = %s\n", node->addr);
+ fprintf (stdout, "[debug]: port = %s\n", node->port);
+ fprintf (stdout, "[debug]: info = %p\n", node->info);
+ fprintf (stdout, "[debug]: } \n");
+}
+
+static inline void
+init_options (fence_kdump_opts_t *opts)
+{
+ opts->nodename = NULL;
+ opts->ipport = FENCE_KDUMP_DEFAULT_IPPORT;
+ opts->family = FENCE_KDUMP_DEFAULT_FAMILY;
+ opts->action = FENCE_KDUMP_DEFAULT_ACTION;
+ opts->count = FENCE_KDUMP_DEFAULT_COUNT;
+ opts->interval = FENCE_KDUMP_DEFAULT_INTERVAL;
+ opts->timeout = FENCE_KDUMP_DEFAULT_TIMEOUT;
+ opts->verbose = FENCE_KDUMP_DEFAULT_VERBOSE;
+
+ INIT_LIST_HEAD (&opts->nodes);
+}
+
+static inline void
+free_options (fence_kdump_opts_t *opts)
+{
+ fence_kdump_node_t *node;
+ fence_kdump_node_t *safe;
+
+ list_for_each_entry_safe (node, safe, &opts->nodes, list) {
+ list_del (&node->list);
+ free_node (node);
+ }
+
+ free (opts->nodename);
+}
+
+static inline void
+print_options (fence_kdump_opts_t *opts)
+{
+ fence_kdump_node_t *node;
+
+ fprintf (stdout, "[debug]: options { \n");
+ fprintf (stdout, "[debug]: nodename = %s\n", opts->nodename);
+ fprintf (stdout, "[debug]: ipport = %d\n", opts->ipport);
+ fprintf (stdout, "[debug]: family = %d\n", opts->family);
+ fprintf (stdout, "[debug]: count = %d\n", opts->count);
+ fprintf (stdout, "[debug]: interval = %d\n", opts->interval);
+ fprintf (stdout, "[debug]: timeout = %d\n", opts->timeout);
+ fprintf (stdout, "[debug]: verbose = %d\n", opts->verbose);
+ fprintf (stdout, "[debug]: } \n");
+
+ list_for_each_entry (node, &opts->nodes, list) {
+ print_node (node);
+ }
+}
+
+static inline void
+set_option_nodename (fence_kdump_opts_t *opts, const char *arg)
+{
+ if (opts->nodename != NULL) {
+ free (opts->nodename);
+ }
+
+ opts->nodename = strdup (arg);
+}
+
+static inline void
+set_option_ipport (fence_kdump_opts_t *opts, const char *arg)
+{
+ opts->ipport = atoi (arg);
+
+ if ((opts->ipport < 1) || (opts->ipport > 65535)) {
+ fprintf (stderr, "[error]: invalid ipport '%s'\n", arg);
+ exit (1);
+ }
+}
+
+static inline void
+set_option_family (fence_kdump_opts_t *opts, const char *arg)
+{
+ if (!strcasecmp (arg, "auto")) {
+ opts->family = FENCE_KDUMP_FAMILY_AUTO;
+ } else if (!strcasecmp (arg, "ipv6")) {
+ opts->family = FENCE_KDUMP_FAMILY_IPV6;
+ } else if (!strcasecmp (arg, "ipv4")) {
+ opts->family = FENCE_KDUMP_FAMILY_IPV4;
+ } else {
+ fprintf (stderr, "[error]: unsupported family '%s'\n", arg);
+ exit (1);
+ }
+}
+
+static inline void
+set_option_action (fence_kdump_opts_t *opts, const char *arg)
+{
+ if (!strcasecmp (arg, "off")) {
+ opts->action = FENCE_KDUMP_ACTION_OFF;
+ } else if (!strcasecmp (arg, "metadata")) {
+ opts->action = FENCE_KDUMP_ACTION_METADATA;
+ } else if (!strcasecmp (arg, "monitor")) {
+ opts->action = FENCE_KDUMP_ACTION_MONITOR;
+ } else if (!strcasecmp (arg, "validate-all")) {
+ opts->action = FENCE_KDUMP_ACTION_VALIDATE;
+ } else {
+ fprintf (stderr, "[error]: unsupported action '%s'\n", arg);
+ exit (1);
+ }
+}
+
+static inline void
+set_option_count (fence_kdump_opts_t *opts, const char *arg)
+{
+ opts->count = atoi (arg);
+
+ if (opts->count < 0) {
+ fprintf (stderr, "[error]: invalid count '%s'\n", arg);
+ exit (1);
+ }
+}
+
+static inline void
+set_option_interval (fence_kdump_opts_t *opts, const char *arg)
+{
+ opts->interval = atoi (arg);
+
+ if (opts->interval < 1) {
+ fprintf (stderr, "[error]: invalid interval '%s'\n", arg);
+ exit (1);
+ }
+}
+
+static inline void
+set_option_timeout (fence_kdump_opts_t *opts, const char *arg)
+{
+ opts->timeout = atoi (arg);
+
+ if (opts->timeout < 1) {
+ fprintf (stderr, "[error]: invalid timeout '%s'\n", arg);
+ exit (1);
+ }
+}
+
+static inline void
+set_option_verbose (fence_kdump_opts_t *opts, const char *arg)
+{
+ int i;
+
+ if (arg != NULL) {
+ if (isdigit(arg[0])) {
+ opts->verbose += atoi (arg);
+ } else {
+ opts->verbose += 1; /* initial -v */
+ for (i = 0; i < strlen(arg); i++) {
+ if (arg[i] == 'v') {
+ opts->verbose += 1;
+ } else {
+ fprintf (stderr, "[error]: invalid value '%c' for verbose\n", arg[i]);
+ return;
+ }
+ }
+ }
+ } else {
+ opts->verbose += 1;
+ }
+}
+
+#endif /* _FENCE_KDUMP_OPTIONS_H */