[lvm-devel] [RFC][PATCH 1/5] support command string with space
Petr Rockai
prockai at redhat.com
Wed Sep 30 20:24:36 UTC 2009
Takahiro Yasui <tyasui at redhat.com> writes:
> Support escaped space by backslash in the command line string passed
> through lvm2 command interface, lvm2_run(). This is used to handle
> "--config" option which contains multiple parameters.
>
> e.g. lvconvert --repair --use-policies --config \
> devices{ignore_suspended_devices=1\ filter=[...]} vg/lv
>
>
> Signed-off-by: Takahiro Yasui <tyasui at redhat.com>
> ---
> tools/lvmcmdline.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> Index: LVM2.02.54-20090928/tools/lvmcmdline.c
> ===================================================================
> --- LVM2.02.54-20090928.orig/tools/lvmcmdline.c
> +++ LVM2.02.54-20090928/tools/lvmcmdline.c
> @@ -1070,8 +1070,15 @@ int lvm_split(char *str, int *argc, char
> break;
>
> e = b;
> - while (*e && !isspace(*e))
> + while (*e && !isspace(*e)) {
> + /*
> + * 'backslash' is treated as a escape character
> + * and the string isn't split at 'backslash + space.'
> + */
> + if (*e == '\\' && isspace(*(e+1)))
> + *e++ = ' ';
> e++;
> + }
>
> argv[(*argc)++] = b;
> if (!*e)
IIUIC, the code will replace "\ " with " " (double space) -- which may or may
not be correct, depending on where the space appears. It also breaks any code
that may have previously expected "\ " to have no special meaning, even though I
doubt any exists.
Anyway, a more correct solution would entail a lvm2_runv (or similarly named)
function, that would take char **argv -- no escaping issues to care
about. Since this just adds to the library, it should be backwards compatible
just fine.
Yours,
Petr.
More information about the lvm-devel
mailing list