[Openais] [PATCH corosync-trunk] add "-p" option to corosync-objctl
Steven Dake
sdake at redhat.com
Fri Jun 26 08:05:35 PDT 2009
good for merge. Please hurry we are nearing branch/freeze of the
codebase.
regards
-steve
On Fri, 2009-06-26 at 22:03 +1200, Angus Salkeld wrote:
> Hi
>
> This just adds a "-p" option to corosync-objctl.
>
> So you can do the following (like sysctl).
>
> corosync-objctl -p /path/to/object.conf
>
> Regards
> Angus
>
> Index: tools/corosync-objctl.c
> ===================================================================
> --- tools/corosync-objctl.c (revision 2301)
> +++ tools/corosync-objctl.c (working copy)
> @@ -89,12 +89,17 @@
> const void *name_pt,
> size_t name_len);
>
> +static void create_object(confdb_handle_t handle, char * name_pt);
> +static void write_key(confdb_handle_t handle, char * path_pt);
> +static void get_parent_name(const char * name_pt, char * parent_name);
> +
> static confdb_callbacks_t callbacks = {
> .confdb_key_change_notify_fn = tail_key_changed,
> .confdb_object_create_change_notify_fn = tail_object_created,
> .confdb_object_delete_change_notify_fn = tail_object_deleted,
> };
>
> +static int debug = 0;
> static int action;
>
> /* Recursively dump the object tree */
> @@ -162,6 +167,82 @@
> }
> }
>
> +static int read_in_config_file (char * filename)
> +{
> + confdb_handle_t handle;
> + int result;
> + int ignore;
> + int c;
> + FILE* fh;
> + char buf[1024];
> + char * line;
> + char * end;
> + char parent_name[OBJ_NAME_SIZE];
> +
> + if (access (filename, R_OK) != 0) {
> + perror ("Couldn't access file.");
> + return -1;
> + }
> +
> + fh = fopen(filename, "r");
> + if (fh == NULL) {
> + perror ("Couldn't open file.");
> + return -1;
> + }
> + result = confdb_initialize (&handle, &callbacks);
> + if (result != CONFDB_OK) {
> + fprintf (stderr, "Could not initialize objdb library. Error %d\n", result);
> + fclose (fh);
> + return -1;
> + }
> +
> + while (fgets (buf, 1024, fh) != NULL) {
> + /* find the first real character, if it is
> + * a '#' then ignore this line.
> + * else process.
> + * if no real characters then also ignore.
> + */
> + ignore = 1;
> + for (c = 0; c < 1024; c++) {
> + if (isblank (buf[c]))
> + continue;
> +
> + if (buf[c] == '#' || buf[c] == '\n') {
> + ignore = 1;
> + break;
> + }
> + ignore = 0;
> + line = &buf[c];
> + break;
> + }
> + if (ignore == 1)
> + continue;
> +
> + /* kill the \n */
> + end = strchr (line, '\n');
> + if (end != NULL)
> + *end = '\0';
> +
> + if (debug == 2)
> + printf ("%d: %s\n", __LINE__, line);
> +
> + /* find the parent object */
> + get_parent_name(line, parent_name);
> +
> + if (debug == 2)
> + printf ("%d: %s\n", __LINE__, parent_name);
> +
> + /* create the object */
> + create_object (handle, parent_name);
> + /* write the attribute */
> + write_key (handle, line);
> + }
> +
> + confdb_finalize (handle);
> + fclose (fh);
> + return 0;
> +}
> +
> static int print_all(void)
> {
> confdb_handle_t handle;
> @@ -190,6 +271,7 @@
> printf (" corosync-objctl -w object%cchild_obj.key=value ...
> Create a key\n", SEPERATOR);
> printf (" corosync-objctl -t object%cchild_obj ...
> Track changes\n", SEPERATOR);
> printf (" corosync-objctl -a
> Print all objects\n");
> + printf (" corosync-objctl -p <filename> Load in config from
> the specified file.\n");
> printf("\n");
> return 0;
> }
> @@ -210,7 +292,14 @@
>
> /* first remove the value (it could be a file path */
> tmp = strchr(parent_name, '=');
> - if (tmp != NULL) *tmp = '\0';
> + if (tmp != NULL) {
> + *tmp = '\0';
> + tmp--;
> + while (isblank (*tmp)) {
> + *tmp = '\0';
> + tmp--;
> + }
> + }
>
> /* then truncate the child name */
> tmp = strrchr(parent_name, SEPERATOR);
> @@ -219,10 +308,29 @@
>
> static void get_key(const char * name_pt, char * key_name, char * key_value)
> {
> - char * tmp;
> + char * tmp = (char*)name_pt;
> char str_copy[OBJ_NAME_SIZE];
> + char * copy_tmp = str_copy;
> + int equals_seen = 0;
> + int in_quotes = 0;
>
> - strcpy(str_copy, name_pt);
> + /* strip out spaces when not in quotes */
> + while (*tmp != '\0') {
> + if (*tmp == '=')
> + equals_seen = 1;
> + if (equals_seen && *tmp == '"') {
> + if (in_quotes)
> + in_quotes = 0;
> + else
> + in_quotes = 1;
> + }
> + if (*tmp != ' ' || in_quotes) {
> + *copy_tmp = *tmp;
> + copy_tmp++;
> + }
> + tmp++;
> + }
> + *copy_tmp = '\0';
>
> /* first remove the value (it could have a SEPERATOR in it */
> tmp = strchr(str_copy, '=');
> @@ -301,6 +409,10 @@
> get_parent_name(path_pt, parent_name);
> get_key(path_pt, key_name, key_value);
>
> + if (debug == 1)
> + printf ("%d: key:\"%s\", value:\"%s\"\n",
> + __LINE__, key_name, key_value);
> +
> if (validate_name(key_name) != CS_OK) {
> fprintf(stderr, "Incorrect key name, can not have \"=\" or
> \"%c\"\n", SEPERATOR);
> exit(EXIT_FAILURE);
> @@ -375,6 +487,9 @@
> obj_name_pt);
> exit(EXIT_FAILURE);
> }
> +
> + if (debug)
> + printf ("%s:%d: %s\n", __func__,__LINE__, obj_name_pt);
> res = confdb_object_create (handle,
> parent_object_handle,
> obj_name_pt,
> @@ -564,11 +679,14 @@
> action = ACTION_READ;
>
> for (;;){
> - c = getopt (argc,argv,"hawcdtp:");
> + c = getopt (argc,argv,"hawcvdtp:");
> if (c==-1) {
> break;
> }
> switch (c) {
> + case 'v':
> + debug++;
> + break;
> case 'h':
> return print_help();
> break;
> @@ -576,9 +694,7 @@
> action = ACTION_PRINT_ALL;
> break;
> case 'p':
> - printf("%s:%d NOT Implemented yet.\n", __FUNCTION__, __LINE__);
> - return -1;
> - //return read_in_config_file();
> + return read_in_config_file (optarg);
> break;
> case 'c':
> action = ACTION_CREATE;
> _______________________________________________
> Openais mailing list
> Openais at lists.linux-foundation.org
> https://lists.linux-foundation.org/mailman/listinfo/openais
More information about the Openais
mailing list