[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