[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