[libvirt] [PATCH 1/2]virsh: enable attatch-disk command option '--mode' accept two parameters

Peter Krempa pkrempa at redhat.com
Tue Oct 15 09:48:12 UTC 2013


On 10/15/13 11:41, Chen Hanxiao wrote:
> 
> 
>> -----Original Message-----
>> From: Peter Krempa [mailto:pkrempa at redhat.com]
>> Sent: Tuesday, October 15, 2013 4:58 PM
>> On 10/15/13 05:54, Chen Hanxiao wrote:
>>> From: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
>>>
>>> Current disk could accept both 'readonly' and 'shareable'
>>> at the same time.
>>> But '--mode' could only accept one parameter.
>>>
>>> This patch enables '--mode' accept parameters like examples below:
>>>
>>> virsh # attach-disk domain /home/1.img sdd --mode shareable,readonly
>>>
>>>      if (mode) {
>>> -        if (STRNEQ(mode, "readonly") && STRNEQ(mode, "shareable")) {
>>> +        if (!(STRPREFIX(mode, "readonly") ||
>>> +            STRPREFIX(mode, "shareable"))) {
>>
>> This won't work if you use "--mode readonly,asdf". Also indentation of
>> the second line is off.
> 
> If we use "--mode readonly,asdf", only 'readonly' will be recognized as
> valid parameter. 

'readonly' is valid, but as that condition is only checking the prefix
of the @mode string to be 'readonly' or 'shareable' then you can write
anything after that and the check won't trigger. If you are going to use
a comma separated list here, you need to tokenize the string and check
every item in the array.

> 
>>
>>>              vshError(ctl, _("No support for %s in command
>> 'attach-disk'"),
>>>                       mode);
>>>              goto cleanup;
>>> @@ -600,8 +601,23 @@ cmdAttachDisk(vshControl *ctl, const vshCmd
>> *cmd)
>>>                            (isFile) ? "file" : "dev",
>>>                            source);
>>>      virBufferAsprintf(&buf, "  <target dev='%s'/>\n", target);
>>> -    if (mode)
>>> -        virBufferAsprintf(&buf, "  <%s/>\n", mode);
>>> +    if (mode) {
>>> +        if (STRPREFIX(mode, "readonly")) {
>>> +            virBufferAddLit(&buf, "  <readonly/>\n");
>>> +        } else {
>>> +            virBufferAddLit(&buf, "  <shareable/>\n");
>>> +        }
>>> +
>>> +        char *rest;
>>> +        if ((rest = strchr(mode, ','))) {
>>> +            rest++;
>>> +            if (STRPREFIX(rest, "readonly")) {
>>> +                virBufferAddLit(&buf, "  <readonly/>\n");
>>> +            } else if (STRPREFIX(rest, "shareable")) {
>>> +                virBufferAddLit(&buf, "  <shareable/>\n");
>>> +            }
>>> +        }
>>> +    }
>>
>> Hmmm, this is a very convoluted way to do stuff. I would recommend doing
>> the sanity check right and then you can do either:
>>
>> 	if (mode &&
>> 	    strstr(mode, "readonly"))
>> 		virBufferAddLit(&buf, "  <readonly/>\n");
>>
>> 	if (mode &&
>>  	    strstr(mode, "shareable"))
>> 		virBufferAddLit...
>>
> 
> If we use strstr(), --mode XXshareableXX will take effect.
> I try to let --mode accept: 	(readonly as A, shareable as B)

If you make the argument check above bulletproof, which it isn't right
now it will not bother you.

> A
> B
> A,B[xxxx]
> B,A[xxxx]
> A,A[xxxx]
> B,B[xxxx]
> 
>> or tokenize the string properly (see vshStringToArray) and output the
>> elements in a loop
> 
> I will check this and see. Thanks for you hints.
>>
>>>
>>>      if (serial)
>>>          virBufferAsprintf(&buf, "  <serial>%s</serial>\n", serial);

Peter

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


More information about the libvir-list mailing list