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
> [email protected]
> https://lists.linux-foundation.org/mailman/listinfo/openais

_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to