[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