[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows
From: |
Johannes Schindelin |
Subject: |
Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows |
Date: |
Wed, 9 Jan 2008 13:27:22 +0000 (GMT) |
User-agent: |
Alpine 1.00 (LSU 882 2007-12-20) |
Hi,
On Wed, 9 Jan 2008, Laurent Vivier wrote:
> Le mercredi 09 janvier 2008 à 12:27 +0000, Johannes Schindelin a écrit :
>
> > On Wed, 9 Jan 2008, Laurent Vivier wrote:
> >
> > > but "-hda" is an alias for "-drive file="%s",index=%d,media=disk".
> >
> > It appears to me as if "-hda" is implemented suboptimally, then. In
> > particular, drive_add() should be able to get a separate "file"
> > parameter, which can be overridden by the "fmt" parameter. Of course,
> > this would mean that the global drives_opt[] array should not have
> > element type "char", but a struct.
>
> This introduces complexity and special cases I don't want to manage...
The problem is that you introduced a regression, as you can see by the
size of this thread.
> > It is a pity that there is DWIMery going on in drive_init(), needing the
> > other options to be parsed already, otherwise drive_add() could have been
> > replaced by calls to drive_init().
>
> I just mimic here already existing behavior of qemu.
> drive_init() already parse parameter to extract options.
> You can't make drive_init() before having parsed all parameters because
> of parameters like "-hda f -hdachs x,y,z"
But it feels wrong to parse one option, unparse it into another option,
and then reparse it again (with all problems introduced by the then-needed
escaping).
Besides, it would not be _that_ complicated:
-- snipsnap --
[PATCH] make special escaping for -hda parameters unnecessary
Signed-off-by: Johannes Schindelin <address@hidden>
---
vl.c | 64 ++++++++++++++++++++++++++++++++++++----------------------------
1 files changed, 36 insertions(+), 28 deletions(-)
diff --git a/vl.c b/vl.c
index 8e346fe..c9966d1 100644
--- a/vl.c
+++ b/vl.c
@@ -231,7 +231,10 @@ unsigned int nb_prom_envs = 0;
const char *prom_envs[MAX_PROM_ENVS];
#endif
int nb_drives_opt;
-char drives_opt[MAX_DRIVES][1024];
+struct drive_opt {
+ const char *file;
+ char opt[1024];
+} drives_opt[MAX_DRIVES];
static CPUState *cur_cpu;
static CPUState *next_cpu;
@@ -4859,18 +4862,18 @@ void do_info_network(void)
}
}
-#define HD_ALIAS "file=\"%s\",index=%d,media=disk"
+#define HD_ALIAS "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 "if=pflash"
+#define MTD_ALIAS "if=mtd"
#define SD_ALIAS "index=0,if=sd"
-static int drive_add(const char *fmt, ...)
+static int drive_add(const char *file, const char *fmt, ...)
{
va_list ap;
@@ -4879,8 +4882,9 @@ static int drive_add(const char *fmt, ...)
exit(1);
}
+ drives_opt[nb_drives_opt].file = file;
va_start(ap, fmt);
- vsnprintf(drives_opt[nb_drives_opt], sizeof(drives_opt[0]), fmt, ap);
+ vsnprintf(drives_opt[nb_drives_opt].opt, sizeof(drives_opt[0]), fmt, ap);
va_end(ap);
return nb_drives_opt++;
@@ -4915,12 +4919,13 @@ int drive_get_max_bus(BlockInterfaceType type)
return max_bus;
}
-static int drive_init(const char *str, int snapshot, QEMUMachine *machine)
+static int drive_init(struct drive_opt *o, int snapshot, QEMUMachine *machine)
{
char buf[128];
char file[1024];
char devname[128];
const char *mediastr = "";
+ const char *str = o->opt;
BlockInterfaceType type;
enum { MEDIA_DISK, MEDIA_CDROM } media;
int bus_id, unit_id;
@@ -4940,7 +4945,11 @@ static int drive_init(const char *str, int snapshot,
QEMUMachine *machine)
return -1;
}
- file[0] = 0;
+ if (o->file) {
+ strncpy(file, o->file, sizeof(file) - 1);
+ file[sizeof(file) - 1] = 0;
+ } else
+ file[0] = 0;
cyls = heads = secs = 0;
bus_id = 0;
unit_id = -1;
@@ -8212,7 +8221,7 @@ int main(int argc, char **argv)
break;
r = argv[optind];
if (r[0] != '-') {
- hda_index = drive_add(HD_ALIAS, argv[optind++], 0);
+ hda_index = drive_add(argv[optind++], HD_ALIAS, 0);
} else {
const QEMUOption *popt;
@@ -8273,11 +8282,11 @@ int main(int argc, char **argv)
break;
case QEMU_OPTION_hda:
if (cyls == 0)
- hda_index = drive_add(HD_ALIAS, optarg, 0);
+ hda_index = drive_add(optarg, HD_ALIAS, 0);
else
- hda_index = drive_add(HD_ALIAS
+ hda_index = drive_add(optarg, HD_ALIAS
",cyls=%d,heads=%d,secs=%d%s",
- optarg, 0, cyls, heads, secs,
+ 0, cyls, heads, secs,
translation == BIOS_ATA_TRANSLATION_LBA ?
",trans=lba" :
translation == BIOS_ATA_TRANSLATION_NONE ?
@@ -8286,19 +8295,19 @@ int main(int argc, char **argv)
case QEMU_OPTION_hdb:
case QEMU_OPTION_hdc:
case QEMU_OPTION_hdd:
- drive_add(HD_ALIAS, optarg, popt->index - QEMU_OPTION_hda);
+ drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda);
break;
case QEMU_OPTION_drive:
- drive_add("%s", optarg);
+ drive_add(optarg, "");
break;
case QEMU_OPTION_mtdblock:
- drive_add(MTD_ALIAS, optarg);
+ drive_add(optarg, MTD_ALIAS);
break;
case QEMU_OPTION_sd:
- drive_add("file=\"%s\"," SD_ALIAS, optarg);
+ drive_add(optarg, SD_ALIAS);
break;
case QEMU_OPTION_pflash:
- drive_add(PFLASH_ALIAS, optarg);
+ drive_add(optarg, PFLASH_ALIAS);
break;
case QEMU_OPTION_snapshot:
snapshot = 1;
@@ -8338,10 +8347,10 @@ int main(int argc, char **argv)
exit(1);
}
if (hda_index != -1)
- snprintf(drives_opt[hda_index] +
- strlen(drives_opt[hda_index]),
- sizeof(drives_opt[0]) -
- strlen(drives_opt[hda_index]),
+ snprintf(drives_opt[hda_index].opt +
+ strlen(drives_opt[hda_index].opt),
+ sizeof(drives_opt[0].opt) -
+ strlen(drives_opt[hda_index].opt),
",cyls=%d,heads=%d,secs=%d%s",
cyls, heads, secs,
translation == BIOS_ATA_TRANSLATION_LBA ?
@@ -8366,7 +8375,7 @@ int main(int argc, char **argv)
kernel_cmdline = optarg;
break;
case QEMU_OPTION_cdrom:
- drive_add("file=\"%s\"," CDROM_ALIAS, optarg);
+ drive_add(optarg, CDROM_ALIAS);
break;
case QEMU_OPTION_boot:
boot_devices = optarg;
@@ -8401,8 +8410,7 @@ int main(int argc, char **argv)
break;
case QEMU_OPTION_fda:
case QEMU_OPTION_fdb:
- drive_add("file=\"%s\"," FD_ALIAS, optarg,
- popt->index - QEMU_OPTION_fda);
+ drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda);
break;
#ifdef TARGET_I386
case QEMU_OPTION_no_fd_bootchk:
@@ -8871,22 +8879,22 @@ int main(int argc, char **argv)
/* we always create the cdrom drive, even if no disk is there */
if (nb_drives_opt < MAX_DRIVES)
- drive_add(CDROM_ALIAS);
+ drive_add(NULL, CDROM_ALIAS);
/* we always create at least one floppy */
if (nb_drives_opt < MAX_DRIVES)
- drive_add(FD_ALIAS, 0);
+ drive_add(NULL, FD_ALIAS, 0);
/* we always create one sd slot, even if no card is in it */
if (nb_drives_opt < MAX_DRIVES)
- drive_add(SD_ALIAS);
+ drive_add(NULL, SD_ALIAS);
/* open the virtual block devices */
for(i = 0; i < nb_drives_opt; i++)
- if (drive_init(drives_opt[i], snapshot, machine) == -1)
+ if (drive_init(&drives_opt[i], snapshot, machine) == -1)
exit(1);
register_savevm("timer", 0, 2, timer_save, timer_load, NULL);
- [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Hervé Poussineau, 2008/01/08
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Laurent Vivier, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, andrzej zaborowski, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Laurent Vivier, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, andrzej zaborowski, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Laurent Vivier, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Johannes Schindelin, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Laurent Vivier, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows,
Johannes Schindelin <=
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Laurent Vivier, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, andrzej zaborowski, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Laurent Vivier, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Johannes Schindelin, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Laurent Vivier, 2008/01/09
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Laurent Vivier, 2008/01/10
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Johannes Schindelin, 2008/01/10
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Laurent Vivier, 2008/01/10
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Johannes Schindelin, 2008/01/10
- Re: [Qemu-devel] [PATCH] Fix double backslash problem in Windows, Laurent Vivier, 2008/01/10