Vladislav,
I really like your patch, but I have problem with '-' character.
Actually key name beginning with '-' is valid. So my proposed solution
is to:
- escape '-' character
- or (preferred) use some other character which is NOT valid key name.
Function which checks key name validity:
static int icmap_is_valid_name_char(char c)
{
return ((c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') ||
(c >= '0' && c <= '9') ||
c == '.' || c == '_' || c == '-' || c == '/' || c == ':');
}
So basically ^[a-zA-Z0-9._-/:].
Regards,
Honza
Vladislav Bogdanov napsal(a):
Signed-off-by: Vladislav Bogdanov <bubble@xxxxxxxxxxxxx>
---
man/corosync-cmapctl.8 | 10 +++++++++-
tools/corosync-cmapctl.c | 29 ++++++++++++++++++++++++-----
2 files changed, 33 insertions(+), 6 deletions(-)
diff --git a/man/corosync-cmapctl.8 b/man/corosync-cmapctl.8
index 02fbdc4..aeb0115 100644
--- a/man/corosync-cmapctl.8
+++ b/man/corosync-cmapctl.8
@@ -49,7 +49,15 @@ for bin, value is file name (or \- for stdin)
corosync\-cmapctl \fB\-p\fR filename
.IP
the format of the file is:
-<key_name> <type> <value>
+[-[-]]<key_name>[ <type> <value>]
+.IP
+Keys prefixed with single dash ('-') are deleted (see \fB\-d\fR).
+.IP
+Keys (actually prefixes) prefixed with double dash ('--') are deleted by prefix (see \fB\-D\fR).
+.IP
+<type> and <value> are optional (not checked) in above cases.
+.IP
+Other keys are set (see \fB\-s\fR) so both <type> and <value> are required.
.SS "Delete key:"
.IP
corosync\-cmapctl \fB\-d\fR key_name...
diff --git a/tools/corosync-cmapctl.c b/tools/corosync-cmapctl.c
index 7e23ab0..3fa4985 100644
--- a/tools/corosync-cmapctl.c
+++ b/tools/corosync-cmapctl.c
@@ -110,7 +110,11 @@ static int print_help(void)
printf(" corosync-cmapctl -p filename\n");
printf("\n");
printf(" the format of the file is:\n");
- printf(" <key_name> <type> <value>\n");
+ printf(" [-[-]]<key_name>[ <type> <value>]\n");
+ printf(" Keys prefixed with single dash ('-') are deleted (see -d).\n");
+ printf(" Keys (actually prefixes) prefixed with double dash ('--') are deleted by prefix (see -D).\n");
+ printf(" <type> and <value> are optional (not checked) in above cases.\n");
+ printf(" Other keys are set (see -s) so both <type> and <value> are required.\n");
printf("\n");
printf("Delete key:\n");
printf(" corosync-cmapctl -d key_name...\n");
@@ -705,12 +709,27 @@ static void read_in_config_file(cmap_handle_t handle, char * filename)
/*
* should be:
- * <key> <type> <value>
+ * [-[-]]<key>[ <type> <value>]
*/
key_name = strtok(line, " \n");
- key_type_s = strtok(NULL, " \n");
- key_value_s = strtok(NULL, " \n");
- set_key(handle, key_name, key_type_s, key_value_s);
+ if (key_name && *key_name == '-') {
+ key_name++;
+ if (*key_name == '-') {
+ key_name++;
+ delete_with_prefix(handle, key_name);
+ } else {
+ cs_error_t err;
+
+ err = cmap_delete(handle, key_name);
+ if (err != CS_OK) {
+ fprintf(stderr, "Can't delete key %s. Error %s\n", key_name, cs_strerror(err));
+ }
+ }
+ } else {
+ key_type_s = strtok(NULL, " \n");
+ key_value_s = strtok(NULL, " \n");
+ set_key(handle, key_name, key_type_s, key_value_s);
+ }
}
fclose (fh);
_______________________________________________
discuss mailing list
discuss@xxxxxxxxxxxx
http://lists.corosync.org/mailman/listinfo/discuss