[lvm-devel] master - lvcreate: reuse validation of names
Zdenek Kabelac
zkabelac at fedoraproject.org
Mon Oct 6 13:33:04 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=20803f2275d9eb08344c4882e62381cf23454eba
Commit: 20803f2275d9eb08344c4882e62381cf23454eba
Parent: 0662391ff60c5fbdf4b941bad92de31558ecd89b
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Fri Oct 3 19:04:45 2014 +0200
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Oct 6 15:18:06 2014 +0200
lvcreate: reuse validation of names
Use validate_lvname_param() for name validation.
---
tools/lvcreate.c | 111 ++++++++++++++++++++----------------------------------
1 files changed, 41 insertions(+), 70 deletions(-)
diff --git a/tools/lvcreate.c b/tools/lvcreate.c
index a3f07f3..3db2c85 100644
--- a/tools/lvcreate.c
+++ b/tools/lvcreate.c
@@ -50,28 +50,14 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
char **argv = *pargv, *ptr;
const char *vg_name;
- lp->pool = arg_str_value(cmd, thinpool_ARG, NULL);
-
- /* If --thinpool contains VG name, extract it. */
- if (lp->pool && strchr(lp->pool, '/')) {
- if (!(lp->vg_name = extract_vgname(cmd, lp->pool)))
- return 0;
- /* Strip VG from pool */
- if ((ptr = strrchr(lp->pool, (int) '/')))
- lp->pool = ptr + 1;
- }
-
lp->lv_name = arg_str_value(cmd, name_ARG, NULL);
+ if (!validate_lvname_param(cmd, &lp->vg_name, &lp->lv_name))
+ return_0;
- /* If --name contains VG name, extract it. */
- if (lp->lv_name && strchr(lp->lv_name, '/')) {
- if (!_set_vg_name(lp, extract_vgname(cmd, lp->lv_name)))
- return_0;
-
- /* Strip VG from lv_name */
- if ((ptr = strrchr(lp->lv_name, (int) '/')))
- lp->lv_name = ptr + 1;
- }
+ lp->pool = arg_str_value(cmd, thinpool_ARG, NULL)
+ ? : arg_str_value(cmd, cachepool_ARG, NULL);
+ if (!validate_lvname_param(cmd, &lp->vg_name, &lp->pool))
+ return_0;
if (seg_is_cache(lp)) {
/*
@@ -112,22 +98,16 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
lp->cache = 1;
(*pargv)++, (*pargc)--;
} else if (lp->snapshot && !arg_count(cmd, virtualsize_ARG)) {
- /* argv[0] might be origin or vg/origin */
+ /* argv[0] might be [vg/]origin */
if (!argc) {
log_error("Please specify a logical volume to act as "
"the snapshot origin.");
return 0;
}
- lp->origin = skip_dev_dir(cmd, argv[0], NULL);
- if (strrchr(lp->origin, '/')) {
- if (!_set_vg_name(lp, extract_vgname(cmd, lp->origin)))
- return_0;
-
- /* Strip the volume group from the origin */
- if ((ptr = strrchr(lp->origin, (int) '/')))
- lp->origin = ptr + 1;
- }
+ lp->origin = argv[0];
+ if (!validate_lvname_param(cmd, &lp->vg_name, &lp->origin))
+ return_0;
if (!lp->vg_name &&
!_set_vg_name(lp, extract_vgname(cmd, NULL)))
@@ -140,33 +120,35 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
}
(*pargv)++, (*pargc)--;
- } else if (seg_is_thin(lp) && !lp->pool && argc) {
- /* argv[0] might be vg or vg/Pool */
+ } else if ((seg_is_thin(lp) || seg_is_pool(lp)) && argc) {
+ /* argv[0] might be [/dev.../]vg or [/dev../]vg/pool */
vg_name = skip_dev_dir(cmd, argv[0], NULL);
- if (!strrchr(vg_name, '/')) {
+ if (!strchr(vg_name, '/')) {
if (!_set_vg_name(lp, vg_name))
return_0;
} else {
- lp->pool = vg_name;
- if (!_set_vg_name(lp, extract_vgname(cmd, lp->pool)))
+ if (!validate_lvname_param(cmd, &lp->vg_name, &vg_name))
return_0;
+ if (lp->pool &&
+ (strcmp(vg_name, lp->pool) != 0)) {
+ log_error("Ambiguous %s name specified, %s and %s.",
+ lp->segtype->name, vg_name, lp->pool);
+ return 0;
+ }
+ lp->pool = vg_name;
+
if (!lp->vg_name &&
!_set_vg_name(lp, extract_vgname(cmd, NULL)))
return_0;
if (!lp->vg_name) {
- log_error("The pool name should include the "
- "volume group.");
+ log_error("The %s name should include the "
+ "volume group.", lp->segtype->name);
return 0;
}
-
- /* Strip the volume group */
- if ((ptr = strrchr(lp->pool, (int) '/')))
- lp->pool = ptr + 1;
}
-
(*pargv)++, (*pargc)--;
} else {
/*
@@ -179,7 +161,7 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
}
} else {
vg_name = skip_dev_dir(cmd, argv[0], NULL);
- if (strrchr(vg_name, '/')) {
+ if (strchr(vg_name, '/')) {
log_error("Volume group name expected "
"(no slash)");
return 0;
@@ -192,38 +174,27 @@ static int _lvcreate_name_params(struct lvcreate_params *lp,
}
}
- if (!validate_name(lp->vg_name)) {
- log_error("Volume group name %s has invalid characters",
- lp->vg_name);
- return 0;
- }
-
- if (lp->lv_name) {
- if (!apply_lvname_restrictions(lp->lv_name))
- return_0;
-
- if (!validate_name(lp->lv_name)) {
- log_error("Logical volume name \"%s\" is invalid",
- lp->lv_name);
+ /* support --name & --type {thin|cache}-pool */
+ if (seg_is_pool(lp) && lp->lv_name) {
+ if (lp->pool && (strcmp(lp->lv_name, lp->pool) != 0)) {
+ log_error("Ambiguous %s name specified, %s and %s.",
+ lp->segtype->name, lp->lv_name, lp->pool);
return 0;
}
+ lp->pool = lp->lv_name;
+ lp->lv_name = NULL;
}
- if (lp->pool) {
- if (!apply_lvname_restrictions(lp->pool))
- return_0;
-
- if (!validate_name(lp->pool)) {
- log_error("Logical volume name \"%s\" is invalid",
- lp->pool);
- return 0;
- }
+ if (lp->pool && lp->lv_name && !strcmp(lp->pool, lp->lv_name)) {
+ log_error("Logical volume name %s and pool name must be different.",
+ lp->lv_name);
+ return 0;
+ }
- if (lp->lv_name && !strcmp(lp->lv_name, lp->pool)) {
- log_error("Logical volume name %s and pool name %s must be different.",
- lp->lv_name, lp->pool);
- return 0;
- }
+ if (!validate_name(lp->vg_name)) {
+ log_error("Volume group name %s has invalid characters",
+ lp->vg_name);
+ return 0;
}
return 1;
More information about the lvm-devel
mailing list