Commit 609497ab3cf9ca65595ea78dbce253309bd11da3
1 parent
5697ff6b
Change -drive parsing so that paths don't have to be double-escaped (Laurent Viv…
…ier, Johannes Schindelin) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3909 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
64 additions
and
47 deletions
qemu-doc.texi
@@ -234,7 +234,8 @@ Define a new drive. Valid options are: | @@ -234,7 +234,8 @@ Define a new drive. Valid options are: | ||
234 | @table @code | 234 | @table @code |
235 | @item file=@var{file} | 235 | @item file=@var{file} |
236 | This option defines which disk image (@pxref{disk_images}) to use with | 236 | This option defines which disk image (@pxref{disk_images}) to use with |
237 | -this drive. | 237 | +this drive. If the filename contains comma, you must double it |
238 | +(for instance, "file=my,,file" to use file "my,file"). | ||
238 | @item if=@var{interface} | 239 | @item if=@var{interface} |
239 | This option defines on which type on interface the drive is connected. | 240 | This option defines on which type on interface the drive is connected. |
240 | Available types are: ide, scsi, sd, mtd, floppy, pflash. | 241 | Available types are: ide, scsi, sd, mtd, floppy, pflash. |
vl.c
@@ -231,7 +231,10 @@ unsigned int nb_prom_envs = 0; | @@ -231,7 +231,10 @@ unsigned int nb_prom_envs = 0; | ||
231 | const char *prom_envs[MAX_PROM_ENVS]; | 231 | const char *prom_envs[MAX_PROM_ENVS]; |
232 | #endif | 232 | #endif |
233 | int nb_drives_opt; | 233 | int nb_drives_opt; |
234 | -char drives_opt[MAX_DRIVES][1024]; | 234 | +struct drive_opt { |
235 | + const char *file; | ||
236 | + char opt[1024]; | ||
237 | +} drives_opt[MAX_DRIVES]; | ||
235 | 238 | ||
236 | static CPUState *cur_cpu; | 239 | static CPUState *cur_cpu; |
237 | static CPUState *next_cpu; | 240 | static CPUState *next_cpu; |
@@ -4581,24 +4584,33 @@ static int net_socket_mcast_init(VLANState *vlan, const char *host_str) | @@ -4581,24 +4584,33 @@ static int net_socket_mcast_init(VLANState *vlan, const char *host_str) | ||
4581 | 4584 | ||
4582 | } | 4585 | } |
4583 | 4586 | ||
4584 | -static const char *get_word(char *buf, int buf_size, const char *p) | 4587 | +static const char *get_opt_name(char *buf, int buf_size, const char *p) |
4588 | +{ | ||
4589 | + char *q; | ||
4590 | + | ||
4591 | + q = buf; | ||
4592 | + while (*p != '\0' && *p != '=') { | ||
4593 | + if (q && (q - buf) < buf_size - 1) | ||
4594 | + *q++ = *p; | ||
4595 | + p++; | ||
4596 | + } | ||
4597 | + if (q) | ||
4598 | + *q = '\0'; | ||
4599 | + | ||
4600 | + return p; | ||
4601 | +} | ||
4602 | + | ||
4603 | +static const char *get_opt_value(char *buf, int buf_size, const char *p) | ||
4585 | { | 4604 | { |
4586 | char *q; | 4605 | char *q; |
4587 | - int substring; | ||
4588 | 4606 | ||
4589 | - substring = 0; | ||
4590 | q = buf; | 4607 | q = buf; |
4591 | while (*p != '\0') { | 4608 | while (*p != '\0') { |
4592 | - if (*p == '\\') { | ||
4593 | - p++; | ||
4594 | - if (*p == '\0') | 4609 | + if (*p == ',') { |
4610 | + if (*(p + 1) != ',') | ||
4595 | break; | 4611 | break; |
4596 | - } else if (*p == '\"') { | ||
4597 | - substring = !substring; | ||
4598 | p++; | 4612 | p++; |
4599 | - continue; | ||
4600 | - } else if (!substring && (*p == ',' || *p == '=')) | ||
4601 | - break; | 4613 | + } |
4602 | if (q && (q - buf) < buf_size - 1) | 4614 | if (q && (q - buf) < buf_size - 1) |
4603 | *q++ = *p; | 4615 | *q++ = *p; |
4604 | p++; | 4616 | p++; |
@@ -4617,15 +4629,15 @@ static int get_param_value(char *buf, int buf_size, | @@ -4617,15 +4629,15 @@ static int get_param_value(char *buf, int buf_size, | ||
4617 | 4629 | ||
4618 | p = str; | 4630 | p = str; |
4619 | for(;;) { | 4631 | for(;;) { |
4620 | - p = get_word(option, sizeof(option), p); | 4632 | + p = get_opt_name(option, sizeof(option), p); |
4621 | if (*p != '=') | 4633 | if (*p != '=') |
4622 | break; | 4634 | break; |
4623 | p++; | 4635 | p++; |
4624 | if (!strcmp(tag, option)) { | 4636 | if (!strcmp(tag, option)) { |
4625 | - (void)get_word(buf, buf_size, p); | 4637 | + (void)get_opt_value(buf, buf_size, p); |
4626 | return strlen(buf); | 4638 | return strlen(buf); |
4627 | } else { | 4639 | } else { |
4628 | - p = get_word(NULL, 0, p); | 4640 | + p = get_opt_value(NULL, 0, p); |
4629 | } | 4641 | } |
4630 | if (*p != ',') | 4642 | if (*p != ',') |
4631 | break; | 4643 | break; |
@@ -4642,7 +4654,7 @@ static int check_params(char *buf, int buf_size, | @@ -4642,7 +4654,7 @@ static int check_params(char *buf, int buf_size, | ||
4642 | 4654 | ||
4643 | p = str; | 4655 | p = str; |
4644 | for(;;) { | 4656 | for(;;) { |
4645 | - p = get_word(buf, buf_size, p); | 4657 | + p = get_opt_name(buf, buf_size, p); |
4646 | if (*p != '=') | 4658 | if (*p != '=') |
4647 | return -1; | 4659 | return -1; |
4648 | p++; | 4660 | p++; |
@@ -4651,7 +4663,7 @@ static int check_params(char *buf, int buf_size, | @@ -4651,7 +4663,7 @@ static int check_params(char *buf, int buf_size, | ||
4651 | break; | 4663 | break; |
4652 | if (params[i] == NULL) | 4664 | if (params[i] == NULL) |
4653 | return -1; | 4665 | return -1; |
4654 | - p = get_word(NULL, 0, p); | 4666 | + p = get_opt_value(NULL, 0, p); |
4655 | if (*p != ',') | 4667 | if (*p != ',') |
4656 | break; | 4668 | break; |
4657 | p++; | 4669 | p++; |
@@ -4810,18 +4822,18 @@ void do_info_network(void) | @@ -4810,18 +4822,18 @@ void do_info_network(void) | ||
4810 | } | 4822 | } |
4811 | } | 4823 | } |
4812 | 4824 | ||
4813 | -#define HD_ALIAS "file=\"%s\",index=%d,media=disk" | 4825 | +#define HD_ALIAS "index=%d,media=disk" |
4814 | #ifdef TARGET_PPC | 4826 | #ifdef TARGET_PPC |
4815 | #define CDROM_ALIAS "index=1,media=cdrom" | 4827 | #define CDROM_ALIAS "index=1,media=cdrom" |
4816 | #else | 4828 | #else |
4817 | #define CDROM_ALIAS "index=2,media=cdrom" | 4829 | #define CDROM_ALIAS "index=2,media=cdrom" |
4818 | #endif | 4830 | #endif |
4819 | #define FD_ALIAS "index=%d,if=floppy" | 4831 | #define FD_ALIAS "index=%d,if=floppy" |
4820 | -#define PFLASH_ALIAS "file=\"%s\",if=pflash" | ||
4821 | -#define MTD_ALIAS "file=\"%s\",if=mtd" | 4832 | +#define PFLASH_ALIAS "if=pflash" |
4833 | +#define MTD_ALIAS "if=mtd" | ||
4822 | #define SD_ALIAS "index=0,if=sd" | 4834 | #define SD_ALIAS "index=0,if=sd" |
4823 | 4835 | ||
4824 | -static int drive_add(const char *fmt, ...) | 4836 | +static int drive_add(const char *file, const char *fmt, ...) |
4825 | { | 4837 | { |
4826 | va_list ap; | 4838 | va_list ap; |
4827 | 4839 | ||
@@ -4830,8 +4842,10 @@ static int drive_add(const char *fmt, ...) | @@ -4830,8 +4842,10 @@ static int drive_add(const char *fmt, ...) | ||
4830 | exit(1); | 4842 | exit(1); |
4831 | } | 4843 | } |
4832 | 4844 | ||
4845 | + drives_opt[nb_drives_opt].file = file; | ||
4833 | va_start(ap, fmt); | 4846 | va_start(ap, fmt); |
4834 | - vsnprintf(drives_opt[nb_drives_opt], sizeof(drives_opt[0]), fmt, ap); | 4847 | + vsnprintf(drives_opt[nb_drives_opt].opt, |
4848 | + sizeof(drives_opt[0].opt), fmt, ap); | ||
4835 | va_end(ap); | 4849 | va_end(ap); |
4836 | 4850 | ||
4837 | return nb_drives_opt++; | 4851 | return nb_drives_opt++; |
@@ -4866,7 +4880,8 @@ int drive_get_max_bus(BlockInterfaceType type) | @@ -4866,7 +4880,8 @@ int drive_get_max_bus(BlockInterfaceType type) | ||
4866 | return max_bus; | 4880 | return max_bus; |
4867 | } | 4881 | } |
4868 | 4882 | ||
4869 | -static int drive_init(const char *str, int snapshot, QEMUMachine *machine) | 4883 | +static int drive_init(struct drive_opt *arg, int snapshot, |
4884 | + QEMUMachine *machine) | ||
4870 | { | 4885 | { |
4871 | char buf[128]; | 4886 | char buf[128]; |
4872 | char file[1024]; | 4887 | char file[1024]; |
@@ -4881,6 +4896,7 @@ static int drive_init(const char *str, int snapshot, QEMUMachine *machine) | @@ -4881,6 +4896,7 @@ static int drive_init(const char *str, int snapshot, QEMUMachine *machine) | ||
4881 | int index; | 4896 | int index; |
4882 | int cache; | 4897 | int cache; |
4883 | int bdrv_flags; | 4898 | int bdrv_flags; |
4899 | + char *str = arg->opt; | ||
4884 | char *params[] = { "bus", "unit", "if", "index", "cyls", "heads", | 4900 | char *params[] = { "bus", "unit", "if", "index", "cyls", "heads", |
4885 | "secs", "trans", "media", "snapshot", "file", | 4901 | "secs", "trans", "media", "snapshot", "file", |
4886 | "cache", NULL }; | 4902 | "cache", NULL }; |
@@ -5051,7 +5067,10 @@ static int drive_init(const char *str, int snapshot, QEMUMachine *machine) | @@ -5051,7 +5067,10 @@ static int drive_init(const char *str, int snapshot, QEMUMachine *machine) | ||
5051 | } | 5067 | } |
5052 | } | 5068 | } |
5053 | 5069 | ||
5054 | - get_param_value(file, sizeof(file), "file", str); | 5070 | + if (arg->file == NULL) |
5071 | + get_param_value(file, sizeof(file), "file", str); | ||
5072 | + else | ||
5073 | + pstrcpy(file, sizeof(file), arg->file); | ||
5055 | 5074 | ||
5056 | /* compute bus and unit according index */ | 5075 | /* compute bus and unit according index */ |
5057 | 5076 | ||
@@ -8163,7 +8182,7 @@ int main(int argc, char **argv) | @@ -8163,7 +8182,7 @@ int main(int argc, char **argv) | ||
8163 | break; | 8182 | break; |
8164 | r = argv[optind]; | 8183 | r = argv[optind]; |
8165 | if (r[0] != '-') { | 8184 | if (r[0] != '-') { |
8166 | - hda_index = drive_add(HD_ALIAS, argv[optind++], 0); | 8185 | + hda_index = drive_add(argv[optind++], HD_ALIAS, 0); |
8167 | } else { | 8186 | } else { |
8168 | const QEMUOption *popt; | 8187 | const QEMUOption *popt; |
8169 | 8188 | ||
@@ -8224,11 +8243,11 @@ int main(int argc, char **argv) | @@ -8224,11 +8243,11 @@ int main(int argc, char **argv) | ||
8224 | break; | 8243 | break; |
8225 | case QEMU_OPTION_hda: | 8244 | case QEMU_OPTION_hda: |
8226 | if (cyls == 0) | 8245 | if (cyls == 0) |
8227 | - hda_index = drive_add(HD_ALIAS, optarg, 0); | 8246 | + hda_index = drive_add(optarg, HD_ALIAS, 0); |
8228 | else | 8247 | else |
8229 | - hda_index = drive_add(HD_ALIAS | 8248 | + hda_index = drive_add(optarg, HD_ALIAS |
8230 | ",cyls=%d,heads=%d,secs=%d%s", | 8249 | ",cyls=%d,heads=%d,secs=%d%s", |
8231 | - optarg, 0, cyls, heads, secs, | 8250 | + 0, cyls, heads, secs, |
8232 | translation == BIOS_ATA_TRANSLATION_LBA ? | 8251 | translation == BIOS_ATA_TRANSLATION_LBA ? |
8233 | ",trans=lba" : | 8252 | ",trans=lba" : |
8234 | translation == BIOS_ATA_TRANSLATION_NONE ? | 8253 | translation == BIOS_ATA_TRANSLATION_NONE ? |
@@ -8237,19 +8256,19 @@ int main(int argc, char **argv) | @@ -8237,19 +8256,19 @@ int main(int argc, char **argv) | ||
8237 | case QEMU_OPTION_hdb: | 8256 | case QEMU_OPTION_hdb: |
8238 | case QEMU_OPTION_hdc: | 8257 | case QEMU_OPTION_hdc: |
8239 | case QEMU_OPTION_hdd: | 8258 | case QEMU_OPTION_hdd: |
8240 | - drive_add(HD_ALIAS, optarg, popt->index - QEMU_OPTION_hda); | 8259 | + drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda); |
8241 | break; | 8260 | break; |
8242 | case QEMU_OPTION_drive: | 8261 | case QEMU_OPTION_drive: |
8243 | - drive_add("%s", optarg); | 8262 | + drive_add(NULL, "%s", optarg); |
8244 | break; | 8263 | break; |
8245 | case QEMU_OPTION_mtdblock: | 8264 | case QEMU_OPTION_mtdblock: |
8246 | - drive_add(MTD_ALIAS, optarg); | 8265 | + drive_add(optarg, MTD_ALIAS); |
8247 | break; | 8266 | break; |
8248 | case QEMU_OPTION_sd: | 8267 | case QEMU_OPTION_sd: |
8249 | - drive_add("file=\"%s\"," SD_ALIAS, optarg); | 8268 | + drive_add(optarg, SD_ALIAS); |
8250 | break; | 8269 | break; |
8251 | case QEMU_OPTION_pflash: | 8270 | case QEMU_OPTION_pflash: |
8252 | - drive_add(PFLASH_ALIAS, optarg); | 8271 | + drive_add(optarg, PFLASH_ALIAS); |
8253 | break; | 8272 | break; |
8254 | case QEMU_OPTION_snapshot: | 8273 | case QEMU_OPTION_snapshot: |
8255 | snapshot = 1; | 8274 | snapshot = 1; |
@@ -8289,12 +8308,10 @@ int main(int argc, char **argv) | @@ -8289,12 +8308,10 @@ int main(int argc, char **argv) | ||
8289 | exit(1); | 8308 | exit(1); |
8290 | } | 8309 | } |
8291 | if (hda_index != -1) | 8310 | if (hda_index != -1) |
8292 | - snprintf(drives_opt[hda_index] + | ||
8293 | - strlen(drives_opt[hda_index]), | ||
8294 | - sizeof(drives_opt[0]) - | ||
8295 | - strlen(drives_opt[hda_index]), | ||
8296 | - ",cyls=%d,heads=%d,secs=%d%s", | ||
8297 | - cyls, heads, secs, | 8311 | + snprintf(drives_opt[hda_index].opt, |
8312 | + sizeof(drives_opt[hda_index].opt), | ||
8313 | + HD_ALIAS ",cyls=%d,heads=%d,secs=%d%s", | ||
8314 | + 0, cyls, heads, secs, | ||
8298 | translation == BIOS_ATA_TRANSLATION_LBA ? | 8315 | translation == BIOS_ATA_TRANSLATION_LBA ? |
8299 | ",trans=lba" : | 8316 | ",trans=lba" : |
8300 | translation == BIOS_ATA_TRANSLATION_NONE ? | 8317 | translation == BIOS_ATA_TRANSLATION_NONE ? |
@@ -8317,7 +8334,7 @@ int main(int argc, char **argv) | @@ -8317,7 +8334,7 @@ int main(int argc, char **argv) | ||
8317 | kernel_cmdline = optarg; | 8334 | kernel_cmdline = optarg; |
8318 | break; | 8335 | break; |
8319 | case QEMU_OPTION_cdrom: | 8336 | case QEMU_OPTION_cdrom: |
8320 | - drive_add("file=\"%s\"," CDROM_ALIAS, optarg); | 8337 | + drive_add(optarg, CDROM_ALIAS); |
8321 | break; | 8338 | break; |
8322 | case QEMU_OPTION_boot: | 8339 | case QEMU_OPTION_boot: |
8323 | boot_devices = optarg; | 8340 | boot_devices = optarg; |
@@ -8352,8 +8369,7 @@ int main(int argc, char **argv) | @@ -8352,8 +8369,7 @@ int main(int argc, char **argv) | ||
8352 | break; | 8369 | break; |
8353 | case QEMU_OPTION_fda: | 8370 | case QEMU_OPTION_fda: |
8354 | case QEMU_OPTION_fdb: | 8371 | case QEMU_OPTION_fdb: |
8355 | - drive_add("file=\"%s\"," FD_ALIAS, optarg, | ||
8356 | - popt->index - QEMU_OPTION_fda); | 8372 | + drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda); |
8357 | break; | 8373 | break; |
8358 | #ifdef TARGET_I386 | 8374 | #ifdef TARGET_I386 |
8359 | case QEMU_OPTION_no_fd_bootchk: | 8375 | case QEMU_OPTION_no_fd_bootchk: |
@@ -8822,22 +8838,22 @@ int main(int argc, char **argv) | @@ -8822,22 +8838,22 @@ int main(int argc, char **argv) | ||
8822 | /* we always create the cdrom drive, even if no disk is there */ | 8838 | /* we always create the cdrom drive, even if no disk is there */ |
8823 | 8839 | ||
8824 | if (nb_drives_opt < MAX_DRIVES) | 8840 | if (nb_drives_opt < MAX_DRIVES) |
8825 | - drive_add(CDROM_ALIAS); | 8841 | + drive_add(NULL, CDROM_ALIAS); |
8826 | 8842 | ||
8827 | /* we always create at least one floppy */ | 8843 | /* we always create at least one floppy */ |
8828 | 8844 | ||
8829 | if (nb_drives_opt < MAX_DRIVES) | 8845 | if (nb_drives_opt < MAX_DRIVES) |
8830 | - drive_add(FD_ALIAS, 0); | 8846 | + drive_add(NULL, FD_ALIAS, 0); |
8831 | 8847 | ||
8832 | /* we always create one sd slot, even if no card is in it */ | 8848 | /* we always create one sd slot, even if no card is in it */ |
8833 | 8849 | ||
8834 | if (nb_drives_opt < MAX_DRIVES) | 8850 | if (nb_drives_opt < MAX_DRIVES) |
8835 | - drive_add(SD_ALIAS); | 8851 | + drive_add(NULL, SD_ALIAS); |
8836 | 8852 | ||
8837 | /* open the virtual block devices */ | 8853 | /* open the virtual block devices */ |
8838 | 8854 | ||
8839 | for(i = 0; i < nb_drives_opt; i++) | 8855 | for(i = 0; i < nb_drives_opt; i++) |
8840 | - if (drive_init(drives_opt[i], snapshot, machine) == -1) | 8856 | + if (drive_init(&drives_opt[i], snapshot, machine) == -1) |
8841 | exit(1); | 8857 | exit(1); |
8842 | 8858 | ||
8843 | register_savevm("timer", 0, 2, timer_save, timer_load, NULL); | 8859 | register_savevm("timer", 0, 2, timer_save, timer_load, NULL); |