[Openais] [PATCH corosync-trunk] add "-p" option to corosync-objctl

Angus Salkeld angus.salkeld at gmail.com
Fri Jun 26 21:39:04 PDT 2009


committed as revision 2308.

-Angus

On Sat, Jun 27, 2009 at 3:05 AM, Steven Dake<sdake at redhat.com> wrote:
> 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