[libvirt] [PATCH] Add a virStrSplitQuoted for splitting quoted strings

Eric Blake eblake at redhat.com
Wed Mar 14 17:10:24 UTC 2012


On 03/14/2012 10:50 AM, Daniel P. Berrange wrote:
>> This looks like it is repeating some of the code in
>> virsh.c:vshCommandStringGetArg; any chance we can combine them?  In
>> particular, the ability to mimic shell handling of \ escapes, as well as
>> the difference in behavior of \ inside "" vs. '', seems like it will
>> come in handy.
> 
> Ah I had forgotten about that code. Can you clarify the difference
> in \ handling.  I guess you mean that inside '', \ can only be used
> for  \\ and \', while inside "", it can do all the standard shell
> escapes like \t, \n, etc ?

Inside '', \ has no special meaning. (There's no way to escape ' inside
of ').

Inside "", \ escapes the next byte (important for " and \, but works on
any byte.

Outside quotes, \ escapes the next byte.

And most importantly: concatenating two forms of quoted materials is
permitted.  Thus:

foo"b'ar\" "\'' blah\'

on input becomes this on output:

foob'ar" ' blah\

>>
>> What you have here does neither; although I didn't spot any flaw in the
>> code, I don't know if it's the algorithm we want to be using.
> 
> I should have sent this paired with my other patch for <cmdline>
> handling in LXC. That is the intended use case for this function.
> 
> I'm not sure that anyone has ever clearly defined what escaping
> syntax is used for /proc/cmdline (which is what <cmdline> is
> representing.

Hmm, good point.  If it is /bin/sh doing the parsing, then we know the
rules (and virsh matches them); but it if is a custom parser in the
kernel, the we have to match that custom parser.

>> A point in your favor, for at least testing what you parse!  If we
>> change our mind to mimic shell or C parsing, then we'd have to update
>> these tests.
> 
> Yes, escaping rules blow my mind unless I can test them :-)

You're not the only one - I added loads of tests when I added shell
parsing to virsh.

>> Overall, I like the idea of the new function, but I'm worried that
>> introducing yet another parser could hurt us (users will be asking "now
>> which escape style is in effect here, and how does it differ from
>> standardized escape styles that I'm used to?").
> 
> I think that perhaps we should have  virStrSplitQuoted just return
> the split pieces, with *no* unescaping. And then have separate
> functions to escape/unescape individual string pieces after the
> fact.

Except that you then have to know what quoting styles were in use to
know whether \ was a literal or an escape.

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120314/5d61d84b/attachment-0001.sig>


More information about the libvir-list mailing list