All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@us.ibm.com>
To: "Crístian Viana" <vianac@linux.vnet.ibm.com>
Cc: qemu-devel@nongnu.org, agl@us.ibm.com
Subject: Re: [Qemu-devel] [PATCH 1/2] QEmu: support disk filenames with comma
Date: Fri, 09 Mar 2012 13:28:23 -0600	[thread overview]
Message-ID: <4F5A59D7.2080300@us.ibm.com> (raw)
In-Reply-To: <1331308936-30042-2-git-send-email-vianac@linux.vnet.ibm.com>

On 03/09/2012 10:02 AM, Crístian Viana wrote:
> If there is a disk file with a comma in the name, QEmu expects a double
> comma instead of a single one (e.g., the file "virtual,disk.img" needs
> to be specified as "virtual,,disk.img" in QEmu's command line). This
> patch fixes libvirt to work with that feature. Fix RHBZ #801036.

I think you meant to send this to libvir-devel.

Regards,

Anthony Liguori

>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index de2d4a1..685a278 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -1628,6 +1628,48 @@ qemuSafeSerialParamValue(const char *value)
>       return 0;
>   }
>
> +static const char *
> +qemuEscapeCommas(const char *name)
> +{
> +    const char *name_ptr = name;
> +    char *escaped_name, *escaped_name_ptr;
> +    size_t escaped_name_max_size = (strlen(name) * 2) + 1;
> +
> +    /* If there is no comma in the string, return a copy of the original one. */
> +    if (!strchr(name, ',')) {
> +        if (!(escaped_name = strdup(name))) {
> +            virReportOOMError();
> +            return NULL;
> +        }
> +        return escaped_name;
> +    }
> +
> +    /* In the worst case the string will have a sequence of only commas,
> +     * which will require double the space for the escaped string. */
> +    if (VIR_ALLOC_N(escaped_name, escaped_name_max_size)<  0) {
> +        virReportOOMError();
> +        return NULL;
> +    }
> +
> +    /* Insert a comma after each comma in the string. */
> +    escaped_name_ptr = escaped_name;
> +    while (*name_ptr != '\0') {
> +        if (*name_ptr == ',') {
> +            *escaped_name_ptr++ = ',';
> +        }
> +
> +        *escaped_name_ptr++ = *name_ptr++;
> +    }
> +
> +    escaped_name_ptr = '\0';
> +
> +    /* Reduce the string memory size to its current length. */
> +    VIR_SHRINK_N(escaped_name, escaped_name_max_size,
> +            strlen(escaped_name) - strlen(name));
> +
> +    return escaped_name;
> +}
> +
>   static int
>   qemuBuildRBDString(virConnectPtr conn,
>                      virDomainDiskDefPtr disk,
> @@ -1638,7 +1680,7 @@ qemuBuildRBDString(virConnectPtr conn,
>       char *secret = NULL;
>       size_t secret_size;
>
> -    virBufferAsprintf(opt, "rbd:%s", disk->src);
> +    virBufferAsprintf(opt, "rbd:%s", qemuEscapeCommas(disk->src));
>       if (disk->auth.username) {
>           virBufferEscape(opt, ":", ":id=%s", disk->auth.username);
>           /* look up secret */
> @@ -1922,9 +1964,9 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
>                   goto error;
>               }
>               if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
> -                virBufferAsprintf(&opt, "file=fat:floppy:%s,", disk->src);
> +                virBufferAsprintf(&opt, "file=fat:floppy:%s,", qemuEscapeCommas(disk->src));
>               else
> -                virBufferAsprintf(&opt, "file=fat:%s,", disk->src);
> +                virBufferAsprintf(&opt, "file=fat:%s,", qemuEscapeCommas(disk->src));
>           } else if (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK) {
>               switch (disk->protocol) {
>               case VIR_DOMAIN_DISK_PROTOCOL_NBD:
> @@ -1944,16 +1986,16 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
>                   break;
>               case VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG:
>                   if (disk->nhosts == 0)
> -                    virBufferAsprintf(&opt, "file=sheepdog:%s,", disk->src);
> +                    virBufferAsprintf(&opt, "file=sheepdog:%s,", qemuEscapeCommas(disk->src));
>                   else
>                       /* only one host is supported now */
>                       virBufferAsprintf(&opt, "file=sheepdog:%s:%s:%s,",
>                                         disk->hosts->name, disk->hosts->port,
> -                                      disk->src);
> +                                      qemuEscapeCommas(disk->src));
>                   break;
>               }
>           } else {
> -            virBufferAsprintf(&opt, "file=%s,", disk->src);
> +            virBufferAsprintf(&opt, "file=%s,", qemuEscapeCommas(disk->src));
>           }
>       }
>       if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
> @@ -2134,7 +2176,6 @@ error:
>       return NULL;
>   }
>
> -
>   char *
>   qemuBuildDriveDevStr(virDomainDefPtr def,
>                        virDomainDiskDefPtr disk,

  reply	other threads:[~2012-03-09 19:29 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-09 16:02 [Qemu-devel] QEmu: support disk filenames with comma Crístian Viana
2012-03-09 16:02 ` [Qemu-devel] [PATCH 1/2] " Crístian Viana
2012-03-09 19:28   ` Anthony Liguori [this message]
2012-03-09 16:02 ` [Qemu-devel] [PATCH 2/2] Add myself to the AUTHORS file Crístian Viana
2012-03-09 17:27 ` [Qemu-devel] QEmu: support disk filenames with comma Eric Blake
2012-03-09 18:25   ` Crístian Viana

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F5A59D7.2080300@us.ibm.com \
    --to=aliguori@us.ibm.com \
    --cc=agl@us.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=vianac@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.