diff options
Diffstat (limited to 'lib/misc/lvm-string.c')
-rw-r--r-- | lib/misc/lvm-string.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/lib/misc/lvm-string.c b/lib/misc/lvm-string.c index 4ed1b28dc..5b675ccdc 100644 --- a/lib/misc/lvm-string.c +++ b/lib/misc/lvm-string.c @@ -75,7 +75,7 @@ static name_error_t _validate_name(const char *n) /* Hyphen used as VG-LV separator - ambiguity if LV starts with it */ if (*n == '-') - return NAME_INVALID_HYPEN; + return NAME_INVALID_HYPHEN; if ((*n == '.') && (!n[1] || (n[1] == '.' && !n[2]))) /* ".", ".." */ return NAME_INVALID_DOTS; @@ -101,6 +101,39 @@ int validate_name(const char *n) return (_validate_name(n) == NAME_VALID) ? 1 : 0; } +/* + * Copy valid systemid characters from source to destination. + * Invalid characters are skipped. Copying is stopped + * when NAME_LEN characters have been copied. + * A terminating NUL is appended. + */ +void copy_systemid_chars(const char *src, char *dst) +{ + const char *s = src; + char *d = dst; + int len = 0; + char c; + + if (!s || !*s) + return; + + /* Skip non-alphanumeric starting characters */ + while (*s && !isalnum(*s)) + s++; + + while ((c = *s++)) { + if (!isalnum(c) && c != '.' && c != '_' && c != '-' && c != '+') + continue; + + *d++ = c; + + if (++len >= NAME_LEN) + break; + } + + *d = '\0'; +} + static const char *_lvname_has_reserved_prefix(const char *lvname) { static const char _prefixes[][12] = { @@ -127,6 +160,8 @@ static const char *_lvname_has_reserved_string(const char *lvname) "_pmspare", "_rimage", "_rmeta", + "_rdimage", + "_rdmeta", "_tdata", "_tmeta", "_vorigin" |