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;
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