Remove tag length restriction and allow / = ! : # & characters.
authorAlasdair Kergon <agk@redhat.com>
Wed, 17 Nov 2010 10:19:29 +0000 (10:19 +0000)
committerAlasdair Kergon <agk@redhat.com>
Wed, 17 Nov 2010 10:19:29 +0000 (10:19 +0000)
WHATS_NEW
lib/misc/lvm-string.c
lib/misc/lvm-string.h
man/lvm.8.in
tools/lvmcmdline.c
tools/toollib.c

index 5223e550a9496057fa9f90e4b53d38d9be6f11ce..72e621040d4b684445ffd1db87e9ac479bebd327 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.77 -
 ===================================
+  Remove tag length restriction and allow / = ! : # & characters.
   Support repetition of --addtag and --deltag arguments.
   Add infrastructure for specific cmdline arguments to be repeated in groups.
   Split the_args cmdline arguments and values into arg_props and arg_values.
index 675fb8229eb16faea218188c5035b26292b89a3e..8fd2c041e3ee53df2e64800716dbba8cfcde2650 100644 (file)
@@ -285,6 +285,25 @@ void unescape_colons_and_at_signs(char *src,
                *substr_first_unquoted_at_sign = arr_substr_first_unquoted[1];
 }
 
+/*
+ * A-Za-z0-9._-+/=!:&#
+ */
+int validate_tag(const char *n)
+{
+       register char c;
+       register int len = 0;
+
+       if (!n || !*n)
+               return 0;
+
+       while ((len++, c = *n++))
+               if (!isalnum(c) && c != '.' && c != '_' && c != '-' && c != '+' && c != '/'
+                   && c != '=' && c != '!' && c != ':' && c != '&' && c != '#')
+                       return 0;
+
+       return 1;
+}
+
 /*
  * Device layer names are all of the form <vg>-<lv>-<layer>, any
  * other hyphens that appear in these names are quoted with yet
index a41717874ff4b2c9dc899cea2cf9fa4834080b10..20f45c939b05f27d2743172905e60a077cc7520e 100644 (file)
@@ -33,6 +33,7 @@ char *build_dm_uuid(struct dm_pool *mem, const char *lvid,
                    const char *layer);
 
 int validate_name(const char *n);
+int validate_tag(const char *n);
 
 int apply_lvname_restrictions(const char *name);
 int is_reserved_lvname(const char *name);
index e38ce4f4698a0fe544fe8286aa097db547821e25..37ebdab9b0288a891c8435c7a9baaed786afee48 100644 (file)
@@ -205,6 +205,7 @@ is mounted read-only when the script runs.
 .TP
 \fB--addtag tag\fP
 Add the tag \fBtag\fP to a PV, VG or LV.  
+Supply this argument multiple times to add more than one tag at once.
 A tag is a word that can be used to group LVM2 objects of the same type 
 together. 
 Tags can be given on the command line in place of PV, VG or LV 
@@ -221,10 +222,13 @@ Only the new LVM2 metadata format supports tagging: objects using the
 LVM1 metadata format cannot be tagged because the on-disk format does not
 support it.
 Snapshots cannot be tagged.
-Characters allowed in tags are: A-Z a-z 0-9 _ + . -
+Characters allowed in tags are: A-Z a-z 0-9 _ + . - and 
+as of version 2.02.78 the following characters are also
+accepted: / = ! : # &
 .TP
 \fB--deltag tag\fP
 Delete the tag \fBtag\fP from a PV, VG or LV, if it's present.
+Supply this argument multiple times to remove more than one tag at once.
 .TP
 \fB--alloc AllocationPolicy\fP
 The allocation policy to use: \fBcontiguous\fP, \fBcling\fP, \fBnormal\fP, \fBanywhere\fP or \fBinherit\fP.
index d305b84a157026f91f60891aebb161ec7ee1d98e..8171174b1aeafbe6e1ab7ae54b44844c04859762 100644 (file)
@@ -418,7 +418,7 @@ int tag_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *
        if (*pos == '@')
                pos++;
 
-       if (!validate_name(pos))
+       if (!validate_tag(pos))
                return 0;
 
        av->value = pos;
index 1e993526761ffcbb7fdb1f456386914ffdf4d738..6971ebae0fb4fa897418ff4c65db3f2620b358db 100644 (file)
@@ -222,7 +222,7 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
                        vgname = lv_name;
 
                        if (*vgname == '@') {
-                               if (!validate_name(vgname + 1)) {
+                               if (!validate_tag(vgname + 1)) {
                                        log_error("Skipping invalid tag %s",
                                                  vgname);
                                        continue;
@@ -528,7 +528,7 @@ int process_each_vg(struct cmd_context *cmd, int argc, char **argv,
                for (; opt < argc; opt++) {
                        vg_name = argv[opt];
                        if (*vg_name == '@') {
-                               if (!validate_name(vg_name + 1)) {
+                               if (!validate_tag(vg_name + 1)) {
                                        log_error("Skipping invalid tag %s",
                                                  vg_name);
                                        if (ret_max < EINVALID_CMD_LINE)
@@ -698,7 +698,7 @@ int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
                        if (at_sign && (at_sign == argv[opt])) {
                                tagname = at_sign + 1;
 
-                               if (!validate_name(tagname)) {
+                               if (!validate_tag(tagname)) {
                                        log_error("Skipping invalid tag %s",
                                                  tagname);
                                        if (ret_max < EINVALID_CMD_LINE)
@@ -1113,7 +1113,7 @@ struct dm_list *create_pv_list(struct dm_pool *mem, struct volume_group *vg, int
 
                if (at_sign && (at_sign == argv[i])) {
                        tagname = at_sign + 1;
-                       if (!validate_name(tagname)) {
+                       if (!validate_tag(tagname)) {
                                log_error("Skipping invalid tag %s", tagname);
                                continue;
                        }
This page took 0.053497 seconds and 5 git commands to generate.