From: Laurent Vivier <Laurent.Vivier@bull.net>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] Fix double backslash problem in Windows
Date: Thu, 10 Jan 2008 19:13:39 +0100 [thread overview]
Message-ID: <1199988819.5145.2.camel@frecb07144> (raw)
In-Reply-To: <1199977347.4773.81.camel@frecb07144>
[-- Attachment #1.1: Type: text/plain, Size: 868 bytes --]
Le jeudi 10 janvier 2008 à 16:02 +0100, Laurent Vivier a écrit :
> Le jeudi 10 janvier 2008 à 15:18 +0100, Jernej Simončič a écrit :
> > On Thursday, January 10, 2008, 14:58:28, Laurent Vivier wrote:
> >
> > > Do you like '^' ?
> >
> > Bad idea - this is the escape character in Windows shell :)
>
> Perhaps this should work:
>
> - option name must end with '='
> - option value must end with ',' or '\0' (allows '=' in filename)
> - if option name must have ',', we double it (allows ',' in filename)
> - ' ', '\' and '"' are not separators at this level and are managed at
> shell level
Here is the patch.
All comments are welcome.
Laurent
--
----------------- Laurent.Vivier@bull.net ------------------
"La perfection est atteinte non quand il ne reste rien à
ajouter mais quand il ne reste rien à enlever." Saint Exupéry
[-- Attachment #1.2: filename_spec_char.patch --]
[-- Type: text/x-vhdl, Size: 4939 bytes --]
---
qemu-doc.texi | 3 ++-
vl.c | 53 +++++++++++++++++++++++++++++++----------------------
2 files changed, 33 insertions(+), 23 deletions(-)
Index: qemu/vl.c
===================================================================
--- qemu.orig/vl.c 2008-01-10 17:48:08.000000000 +0100
+++ qemu/vl.c 2008-01-10 19:06:40.000000000 +0100
@@ -4581,24 +4581,33 @@ static int net_socket_mcast_init(VLANSta
}
-static const char *get_word(char *buf, int buf_size, const char *p)
+static const char *get_opt_name(char *buf, int buf_size, const char *p)
+{
+ char *q;
+
+ q = buf;
+ while (*p != '\0' && *p != '=') {
+ if (q && (q - buf) < buf_size - 1)
+ *q++ = *p;
+ p++;
+ }
+ if (q)
+ *q = '\0';
+
+ return p;
+}
+
+static const char *get_opt_value(char *buf, int buf_size, const char *p)
{
char *q;
- int substring;
- substring = 0;
q = buf;
while (*p != '\0') {
- if (*p == '\\') {
- p++;
- if (*p == '\0')
+ if (*p == ',') {
+ if (*(p + 1) != ',')
break;
- } else if (*p == '\"') {
- substring = !substring;
p++;
- continue;
- } else if (!substring && (*p == ',' || *p == '='))
- break;
+ }
if (q && (q - buf) < buf_size - 1)
*q++ = *p;
p++;
@@ -4617,15 +4626,15 @@ static int get_param_value(char *buf, in
p = str;
for(;;) {
- p = get_word(option, sizeof(option), p);
+ p = get_opt_name(option, sizeof(option), p);
if (*p != '=')
break;
p++;
if (!strcmp(tag, option)) {
- (void)get_word(buf, buf_size, p);
+ (void)get_opt_value(buf, buf_size, p);
return strlen(buf);
} else {
- p = get_word(NULL, 0, p);
+ p = get_opt_value(NULL, 0, p);
}
if (*p != ',')
break;
@@ -4642,7 +4651,7 @@ static int check_params(char *buf, int b
p = str;
for(;;) {
- p = get_word(buf, buf_size, p);
+ p = get_opt_name(buf, buf_size, p);
if (*p != '=')
return -1;
p++;
@@ -4651,7 +4660,7 @@ static int check_params(char *buf, int b
break;
if (params[i] == NULL)
return -1;
- p = get_word(NULL, 0, p);
+ p = get_opt_value(NULL, 0, p);
if (*p != ',')
break;
p++;
@@ -4810,15 +4819,15 @@ void do_info_network(void)
}
}
-#define HD_ALIAS "file=\"%s\",index=%d,media=disk"
+#define HD_ALIAS "file=%s,index=%d,media=disk"
#ifdef TARGET_PPC
#define CDROM_ALIAS "index=1,media=cdrom"
#else
#define CDROM_ALIAS "index=2,media=cdrom"
#endif
#define FD_ALIAS "index=%d,if=floppy"
-#define PFLASH_ALIAS "file=\"%s\",if=pflash"
-#define MTD_ALIAS "file=\"%s\",if=mtd"
+#define PFLASH_ALIAS "file=%s,if=pflash"
+#define MTD_ALIAS "file=%s,if=mtd"
#define SD_ALIAS "index=0,if=sd"
static int drive_add(const char *fmt, ...)
@@ -8246,7 +8255,7 @@ int main(int argc, char **argv)
drive_add(MTD_ALIAS, optarg);
break;
case QEMU_OPTION_sd:
- drive_add("file=\"%s\"," SD_ALIAS, optarg);
+ drive_add("file=%s," SD_ALIAS, optarg);
break;
case QEMU_OPTION_pflash:
drive_add(PFLASH_ALIAS, optarg);
@@ -8317,7 +8326,7 @@ int main(int argc, char **argv)
kernel_cmdline = optarg;
break;
case QEMU_OPTION_cdrom:
- drive_add("file=\"%s\"," CDROM_ALIAS, optarg);
+ drive_add("file=%s," CDROM_ALIAS, optarg);
break;
case QEMU_OPTION_boot:
boot_devices = optarg;
@@ -8352,7 +8361,7 @@ int main(int argc, char **argv)
break;
case QEMU_OPTION_fda:
case QEMU_OPTION_fdb:
- drive_add("file=\"%s\"," FD_ALIAS, optarg,
+ drive_add("file=%s," FD_ALIAS, optarg,
popt->index - QEMU_OPTION_fda);
break;
#ifdef TARGET_I386
Index: qemu/qemu-doc.texi
===================================================================
--- qemu.orig/qemu-doc.texi 2008-01-10 17:48:08.000000000 +0100
+++ qemu/qemu-doc.texi 2008-01-10 17:48:10.000000000 +0100
@@ -234,7 +234,8 @@ Define a new drive. Valid options are:
@table @code
@item file=@var{file}
This option defines which disk image (@pxref{disk_images}) to use with
-this drive.
+this drive. If the filename contains comma, you must double it
+(for instance, "file=my,,file" to use file "my,file").
@item if=@var{interface}
This option defines on which type on interface the drive is connected.
Available types are: ide, scsi, sd, mtd, floppy, pflash.
[-- Attachment #2: Ceci est une partie de message numériquement signée --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
next prev parent reply other threads:[~2008-01-10 18:13 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-08 16:17 [Qemu-devel] [PATCH] Fix double backslash problem in Windows Hervé Poussineau
2008-01-09 9:31 ` Laurent Vivier
2008-01-09 9:51 ` andrzej zaborowski
2008-01-09 10:04 ` Laurent Vivier
2008-01-09 10:40 ` andrzej zaborowski
2008-01-09 12:08 ` Laurent Vivier
2008-01-09 12:27 ` Johannes Schindelin
2008-01-09 12:51 ` Laurent Vivier
2008-01-09 13:27 ` Johannes Schindelin
2008-01-09 13:46 ` Laurent Vivier
2008-01-09 13:56 ` andrzej zaborowski
2008-01-09 14:45 ` Laurent Vivier
2008-01-09 13:59 ` Johannes Schindelin
2008-01-09 14:42 ` Laurent Vivier
2008-01-10 9:35 ` Laurent Vivier
2008-01-10 11:53 ` Johannes Schindelin
2008-01-10 12:12 ` Laurent Vivier
2008-01-10 12:15 ` Johannes Schindelin
2008-01-10 12:33 ` Laurent Vivier
2008-01-10 13:30 ` Avi Kivity
2008-01-10 13:58 ` Laurent Vivier
2008-01-10 14:18 ` [Qemu-devel] " Jernej Simončič
2008-01-10 15:02 ` Laurent Vivier
2008-01-10 18:13 ` Laurent Vivier [this message]
2008-01-11 9:01 ` Laurent Vivier
2008-01-10 18:59 ` [Qemu-devel] Re: [PATCH] " consul
2008-01-10 19:21 ` Laurent Vivier
2008-01-09 12:27 ` [Qemu-devel] " Andreas Färber
2008-01-09 13:24 ` Laurent Vivier
2008-01-09 12:44 ` andrzej zaborowski
2008-01-09 17:53 ` Anthony Liguori
2008-01-09 18:23 ` Johannes Schindelin
2008-01-09 19:11 ` Laurent Vivier
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=1199988819.5145.2.camel@frecb07144 \
--to=laurent.vivier@bull.net \
--cc=qemu-devel@nongnu.org \
/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.