[Ocfs2-tools-commits] jlbec commits r509 - trunk/clusterbo
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Wed Dec 22 20:43:08 CST 2004
Author: jlbec
Date: 2004-12-22 20:43:06 -0600 (Wed, 22 Dec 2004)
New Revision: 509
Modified:
trunk/clusterbo/o2cb_config.c
trunk/clusterbo/o2cb_config.h
trunk/clusterbo/o2cb_ctl.c
Log:
parse a bunch of options, and stuff
Modified: trunk/clusterbo/o2cb_config.c
===================================================================
--- trunk/clusterbo/o2cb_config.c 2004-12-23 01:45:54 UTC (rev 508)
+++ trunk/clusterbo/o2cb_config.c 2004-12-23 02:43:06 UTC (rev 509)
@@ -21,6 +21,8 @@
* Boston, MA 021110-1307, USA.
*/
+#include <string.h>
+#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
@@ -37,6 +39,7 @@
gchar *c_name;
guint c_num_nodes;
GList *c_nodes;
+ gboolean c_valid;
};
struct _O2CBNode {
@@ -61,17 +64,246 @@
config->c_name = NULL;
config->c_num_nodes = 0;
config->c_nodes = NULL;
+ config->c_valid = FALSE;
return config;
} /* o2cb_config_initialize() */
+static gint o2cb_config_fill_node(O2CBConfig *config,
+ JConfigStanza *cfs)
+{
+ O2CBNode *node;
+ gchar *num_s, *name, *addr, *port_s;
+ gchar *ptr;
+ gulong val;
+ gint rc;
+
+ /* NB: _add_node() gives us a node number, but we're going to
+ * override it, because we know better. */
+ node = o2cb_config_add_node(config);
+ if (!node)
+ return -ENOMEM;
+
+ rc = -EINVAL;
+ num_s = j_config_get_attribute(cfs, "number");
+ if (!num_s || !*num_s)
+ goto out_error;
+ val = strtoul(num_s, &ptr, 10);
+ if (!ptr || *ptr)
+ goto out_error;
+ rc = -ERANGE;
+ if ((val == ULONG_MAX) || (val > UINT_MAX))
+ goto out_error;
+ node->n_number = val;
+
+ rc = -EINVAL;
+ name = j_config_get_attribute(cfs, "name");
+ if (!name || !*name)
+ goto out_error;
+ rc = o2cb_node_set_name(node, name);
+ if (rc)
+ goto out_error;
+
+ rc = -EINVAL;
+ addr = j_config_get_attribute(cfs, "ip_address");
+ if (!addr || !*addr)
+ goto out_error;
+ rc = o2cb_node_set_ip_string(node, name);
+ if (rc)
+ goto out_error;
+
+ rc = -EINVAL;
+ port_s = j_config_get_attribute(cfs, "ip_port");
+ if (!port_s || !*port_s)
+ goto out_error;
+ val = strtoul(port_s, &ptr, 10);
+ rc = -ERANGE;
+ if ((val == ULONG_MAX) || (val > UINT_MAX))
+ goto out_error;
+ o2cb_node_set_port(node, val);
+
+ rc = 0;
+
+out_error:
+ g_free(num_s);
+ g_free(name);
+ g_free(addr);
+ g_free(port_s);
+
+ return rc;
+} /* o2cb_config_fill_node() */
+
+static gint o2cb_config_fill(O2CBConfig *config, JConfig *cf)
+{
+ gint rc;
+ gulong val;
+ gchar *count, *ptr;
+ JIterator *iter;
+ JConfigStanza *cfs;
+ JConfigMatch match = {J_CONFIG_MATCH_VALUE, "cluster", NULL};
+
+ cfs = j_config_get_stanza_nth(cf, "cluster", 0);
+ if (!cfs)
+ return -ENOENT;
+
+ rc = -ENOENT;
+ match.value = j_config_get_attribute(cfs, "name");
+ if (!match.value && !*match.value)
+ goto out_error;
+
+ rc = o2cb_config_set_cluster_name(config, match.value);
+ if (rc)
+ goto out_error;
+
+ rc = -ENOMEM;
+ iter = j_config_get_stanzas(cf, "node", &match, 1);
+ if (!iter)
+ goto out_error;
+
+ while (j_iterator_has_more(iter))
+ {
+ cfs = (JConfigStanza *)j_iterator_get_next(iter);
+ rc = o2cb_config_fill_node(config, cfs);
+ if (rc)
+ break;
+ }
+ j_iterator_free(iter);
+
+ if (rc)
+ goto out_error;
+
+ rc = -EINVAL;
+ count = j_config_get_attribute(cfs, "node_count");
+ if (!count || !*count)
+ goto out_error;
+ val = strtoul(count, &ptr, 10);
+ if (!ptr || *ptr)
+ goto out_error;
+ rc = -ERANGE;
+ if ((val == ULONG_MAX) || (val > UINT_MAX))
+ goto out_error;
+ config->c_num_nodes = val;
+
+ rc = 0;
+
+out_error:
+ g_free(match.value);
+
+ return rc;
+} /* o2cb_config_fill() */
+
O2CBConfig *o2cb_config_load(const char *filename)
{
+ gint rc;
+ JConfigCtxt *ctxt;
+ JConfig *cf;
O2CBConfig *config;
+ ctxt = j_config_new_context();
+ if (!ctxt)
+ return NULL;
+ j_config_context_set_verbose(ctxt, FALSE);
+
+ cf = j_config_parse_file_with_context(ctxt, filename);
+ if (j_config_context_get_error(ctxt))
+ {
+ if (cf)
+ {
+ j_config_free(cf);
+ cf = NULL;
+ }
+ }
+ j_config_context_free(ctxt);
+
+ if (!cf)
+ return NULL;
+
+ config = o2cb_config_initialize();
+ if (config)
+ {
+ rc = o2cb_config_fill(config, cf);
+ if (rc)
+ {
+ o2cb_config_free(config);
+ config = NULL;
+ }
+ else
+ config->c_valid = TRUE;
+ }
+
+ j_config_free(cf);
+
return config;
} /* o2cb_config_load() */
+static gint o2cb_node_store(JConfig *cf, O2CBNode *node)
+{
+ gchar *val;
+ JConfigStanza *cfs;
+
+ cfs = j_config_add_stanza(cf, "node");
+ if (!cfs)
+ return -ENOMEM;
+
+ j_config_set_attribute(cfs, "name", node->n_name);
+ j_config_set_attribute(cfs, "ip_address", node->n_addr);
+
+ val = g_strdup_printf("%u", node->n_port);
+ if (!val)
+ return -ENOMEM;
+ j_config_set_attribute(cfs, "ip_port", val);
+ g_free(val);
+
+ val = g_strdup_printf("%u", node->n_number);
+ if (!val)
+ return -ENOMEM;
+ j_config_set_attribute(cfs, "number", val);
+ g_free(val);
+
+ return 0;
+} /* o2cb_node_store() */
+
+gint o2cb_config_store(O2CBConfig *config, const gchar *filename)
+{
+ int rc;
+ JConfig *cf;
+ JConfigStanza *cfs;
+ O2CBNode *node;
+ gchar *count;
+ GList *list;
+
+ cf = j_config_parse_memory("", strlen(""));
+ if (!cf)
+ return -ENOMEM;
+
+ cfs = j_config_add_stanza(cf, "cluster");
+
+ j_config_set_attribute(cfs, "name", config->c_name);
+
+ count = g_strdup_printf("%u", config->c_num_nodes);
+ j_config_set_attribute(cfs, "node_count", count);
+ g_free(count);
+
+ list = config->c_nodes;
+ while (list)
+ {
+ node = (O2CBNode *)list->data;
+ rc = o2cb_node_store(cf, node);
+ if (rc)
+ break;
+
+ list = list->next;
+ }
+
+ if (!rc)
+ {
+ if (!j_config_dump_file(cf, filename))
+ rc = -EIO;
+ }
+
+ return rc;
+} /* o2cb_config_store() */
+
static void o2cb_node_free(O2CBNode *node)
{
if (node->n_name)
@@ -111,8 +343,20 @@
return g_strdup(config->c_name);
} /* o2cb_config_get_cluster_name() */
-void o2cb_config_set_cluster_name(O2CBConfig *config)
+gint o2cb_config_set_cluster_name(O2CBConfig *config, const gchar *name)
{
+ gchar *new_name;
+
+ new_name = g_strdup(name);
+ if (!new_name)
+ return -ENOMEM;
+
+ g_free(config->c_name);
+ config->c_name = new_name;
+
+ config->c_valid = TRUE;
+
+ return 0;
} /* o2cb_config_set_cluster_name() */
JIterator *o2cb_config_get_nodes(O2CBConfig *config)
@@ -224,7 +468,16 @@
gint o2cb_node_set_ip_string(O2CBNode *node, const gchar *addr)
{
+ gint rc;
gchar *new_addr;
+ struct in_addr ip;
+
+ /* Let's validate the address, shall we? */
+ rc = inet_pton(AF_INET, addr, &ip);
+ if (rc < 0)
+ return -errno;
+ if (!rc)
+ return -EINVAL;
new_addr = g_strdup(addr);
if (!new_addr)
Modified: trunk/clusterbo/o2cb_config.h
===================================================================
--- trunk/clusterbo/o2cb_config.h 2004-12-23 01:45:54 UTC (rev 508)
+++ trunk/clusterbo/o2cb_config.h 2004-12-23 02:43:06 UTC (rev 509)
@@ -29,11 +29,13 @@
typedef struct _O2CBNode O2CBNode;
O2CBConfig *o2cb_config_initialize(void);
-O2CBConfig *o2cb_config_load(const char *filename);
+O2CBConfig *o2cb_config_load(const gchar *filename);
+gint o2cb_config_store(O2CBConfig *config, const gchar *filename);
void o2cb_config_free(O2CBConfig *config);
gchar *o2cb_config_get_cluster_name(O2CBConfig *config);
-void o2cb_config_set_cluster_name(O2CBConfig *config);
+gint o2cb_config_set_cluster_name(O2CBConfig *config,
+ const gchar *name);
JIterator *o2cb_config_get_nodes(O2CBConfig *config);
O2CBNode *o2cb_config_get_node(O2CBConfig *config, guint n);
Modified: trunk/clusterbo/o2cb_ctl.c
===================================================================
--- trunk/clusterbo/o2cb_ctl.c 2004-12-23 01:45:54 UTC (rev 508)
+++ trunk/clusterbo/o2cb_ctl.c 2004-12-23 02:43:06 UTC (rev 509)
@@ -21,18 +21,222 @@
* Boston, MA 021110-1307, USA.
*/
-#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
+#include <unistd.h>
+#include <errno.h>
+#include <getopt.h>
#include <glib.h>
#include "jiterator.h"
#include "o2cb_config.h"
+#define PROGNAME "o2cb_ctl"
+typedef enum {
+ O2CB_OP_NONE,
+ O2CB_OP_INFO,
+ O2CB_OP_CREATE,
+ O2CB_OP_DELETE,
+ O2CB_OP_CHANGE,
+} O2CBOperation;
+
+typedef enum {
+ O2CB_TYPE_CLUSTER,
+ O2CB_TYPE_NODE,
+} O2CBType;
+
+typedef struct _OptionAttr OptionAttr;
+
+struct _OptionAttr
+{
+ int oa_set;
+ gchar *oa_name;
+ gchar *oa_value;
+};
+
+static void print_version()
+{
+ fprintf(stdout, PROGNAME " version %s\n", VERSION);
+ exit(0);
+} /* print_version() */
+
+static void print_usage(gint rc)
+{
+ FILE *output = rc ? stderr : stdout;
+
+ fprintf(output,
+ "Usage: " PROGNAME " -C -l <manager> -n <object> [-a <attribute> ] ...\n"
+ );
+
+ exit(rc);
+} /* print_usage() */
+
+static gint append_attr(const gchar *attr_string, GList **list)
+{
+ char **p;
+ OptionAttr *attr;
+
+ p = g_strsplit(attr_string, "=", 2);
+ if (!p)
+ return -ENOMEM;
+
+ if (!p[0] || !*p[0])
+ return -EINVAL;
+
+ attr = g_new(OptionAttr, 1);
+ attr->oa_name = g_strdup(p[0]);
+ attr->oa_value = g_strdup(p[1] ? p[1] : "");
+ attr->oa_set = 1;
+
+ g_strfreev(p);
+
+ *list = g_list_append(*list, attr);
+ return 0;
+} /* append_attr() */
+
+extern char *optarg;
+extern int optopt;
+extern int opterr;
+static gint parse_options(gint argc, gchar *argv[], O2CBOperation *op,
+ gchar **manager, gchar **object,
+ gchar **stype, GList **prog_attrs)
+{
+ int c, rc, doubledash;
+ OptionAttr *attr;
+
+ doubledash = 0;
+ opterr = 0;
+ while ((c = getopt(argc, argv, ":hVCDIHl:n:t:a:-:")) != EOF)
+ {
+ switch (c)
+ {
+ case 'h':
+ print_usage(0);
+ break;
+
+ case 'V':
+ print_version();
+ break;
+
+ case '-':
+ if (!optarg || !*optarg)
+ {
+ doubledash = 1;
+ break;
+ }
+
+ if (!strcmp(optarg, "version"))
+ print_version();
+ else if (!strcmp(optarg, "help"))
+ print_usage(0);
+ else
+ {
+ fprintf(stderr, PROGNAME ": Invalid option: \'--%s\'\n",
+ optarg);
+ return -EINVAL;
+ }
+ break;
+
+ case 'C':
+ if (*op != O2CB_OP_NONE)
+ return -EINVAL;
+ *op = O2CB_OP_CREATE;
+ break;
+
+ case 'D':
+ if (*op != O2CB_OP_NONE)
+ return -EINVAL;
+ *op = O2CB_OP_DELETE;
+ break;
+
+ case 'I':
+ if (*op != O2CB_OP_NONE)
+ return -EINVAL;
+ *op = O2CB_OP_INFO;
+ break;
+
+ case 'H':
+ if (*op != O2CB_OP_NONE)
+ return -EINVAL;
+ *op = O2CB_OP_CHANGE;
+ break;
+
+ case 'l':
+ if (!optarg || !*optarg)
+ {
+ fprintf(stderr, PROGNAME ": Argument to \'-l\' cannot be \"\"\n");
+ return -EINVAL;
+ }
+ *manager = optarg;
+ break;
+
+ case 'n':
+ if (!optarg || !*optarg)
+ {
+ fprintf(stderr, PROGNAME ": Argument to \'-n\' cannot be \"\"\n");
+ return -EINVAL;
+ }
+ *object = optarg;
+ break;
+
+ case 't':
+ if (!optarg || !*optarg)
+ {
+ fprintf(stderr, PROGNAME ": Argument to \'-t\' cannot be \"\"\n");
+ return -EINVAL;
+ }
+ *stype = optarg;
+ break;
+
+ case 'a':
+ if (!optarg || !*optarg)
+ {
+ fprintf(stderr, PROGNAME ": Argument to \'-a\' cannot be \"\"\n");
+ return -EINVAL;
+ }
+ rc = append_attr(optarg, prog_attrs);
+ if (rc)
+ return rc;
+
+ case '?':
+ fprintf(stderr, PROGNAME ": Invalid option: \'-%c\'\n",
+ optopt);
+ return -EINVAL;
+ break;
+
+ case ':':
+ fprintf(stderr,
+ PROGNAME ": Option \'-%c\' requires an argument\n",
+ optopt);
+ return -EINVAL;
+ break;
+
+ default:
+ return -EINVAL;
+ break;
+ }
+
+ if (doubledash)
+ break;
+ }
+} /* parse_options() */
+
+
gint main(gint argc, gchar *argv[])
{
+ int rc;
+ gchar *manager, *target, *stype;
+ O2CBOperation op;
+ GList *prog_attrs = NULL;
+
+ rc = parse_options(argc, argv, &op,
+ &manager, &target, &stype,
+ &prog_attrs);
return 0;
-}
+} /* main() */
More information about the Ocfs2-tools-commits
mailing list