--- vl.c.nocdrom Fri Apr 14 15:12:35 2006 +++ vl.c Fri Apr 14 15:21:08 2006 @@ -4730,6 +4730,10 @@ QEMU_OPTION_hdc, QEMU_OPTION_hdd, QEMU_OPTION_cdrom, + QEMU_OPTION_cdrom_a, + QEMU_OPTION_cdrom_b, + QEMU_OPTION_cdrom_c, + QEMU_OPTION_cdrom_d, QEMU_OPTION_boot, QEMU_OPTION_snapshot, QEMU_OPTION_m, @@ -4795,6 +4799,10 @@ { "hdc", HAS_ARG, QEMU_OPTION_hdc }, { "hdd", HAS_ARG, QEMU_OPTION_hdd }, { "cdrom", HAS_ARG, QEMU_OPTION_cdrom }, + { "cdrom-a", HAS_ARG, QEMU_OPTION_cdrom_a }, + { "cdrom-b", HAS_ARG, QEMU_OPTION_cdrom_b }, + { "cdrom-c", HAS_ARG, QEMU_OPTION_cdrom_c }, + { "cdrom-d", HAS_ARG, QEMU_OPTION_cdrom_d }, { "boot", HAS_ARG, QEMU_OPTION_boot }, { "snapshot", 0, QEMU_OPTION_snapshot }, { "m", HAS_ARG, QEMU_OPTION_m }, @@ -5042,6 +5050,7 @@ int snapshot, linux_boot; const char *initrd_filename; const char *hd_filename[MAX_DISKS], *fd_filename[MAX_FD]; + int hd_is_cdrom[MAX_DISKS]; const char *kernel_filename, *kernel_cmdline; DisplayState *ds = &display_state; int cyls, heads, secs, translation; @@ -5079,7 +5088,10 @@ for(i = 0; i < MAX_FD; i++) fd_filename[i] = NULL; for(i = 0; i < MAX_DISKS; i++) + { hd_filename[i] = NULL; + hd_is_cdrom[i] = 0; + } ram_size = DEFAULT_RAM_SIZE * 1024 * 1024; vga_ram_size = VGA_RAM_SIZE; bios_size = BIOS_SIZE; @@ -5091,11 +5103,7 @@ nographic = 0; kernel_filename = NULL; kernel_cmdline = ""; -#ifdef TARGET_PPC - cdrom_index = 1; -#else - cdrom_index = 2; -#endif + cdrom_index = -1; //disable by default cyls = heads = secs = 0; translation = BIOS_ATA_TRANSLATION_AUTO; #ifdef _WIN32 @@ -5127,7 +5135,7 @@ break; r = argv[optind]; if (r[0] != '-') { - hd_filename[0] = argv[optind++]; + //hd_filename[0] = argv[optind++]; } else { const QEMUOption *popt; @@ -5178,9 +5186,12 @@ { int hd_index; hd_index = popt->index - QEMU_OPTION_hda; + if (hd_filename[hd_index] != NULL) { + fprintf(stderr, "qemu: can't share multiple disks\n"); + exit(1); + } hd_filename[hd_index] = optarg; - if (hd_index == cdrom_index) - cdrom_index = -1; + hd_is_cdrom[hd_index] = 0; } break; case QEMU_OPTION_snapshot: @@ -5235,9 +5246,26 @@ kernel_cmdline = optarg; break; case QEMU_OPTION_cdrom: - if (cdrom_index >= 0) { - hd_filename[cdrom_index] = optarg; + case QEMU_OPTION_cdrom_a: + case QEMU_OPTION_cdrom_b: + case QEMU_OPTION_cdrom_c: + case QEMU_OPTION_cdrom_d: + if (popt->index == QEMU_OPTION_cdrom) +/* use a sensible default */ +#ifdef TARGET_PPC + cdrom_index = 1; +#else + cdrom_index = 2; +#endif + else + cdrom_index = popt->index - QEMU_OPTION_cdrom_a; + + if (hd_filename[cdrom_index] != NULL) { + fprintf(stderr, "qemu: can't share multiple disks\n"); + exit(1); } + hd_filename[cdrom_index] = optarg; + hd_is_cdrom[cdrom_index] = 1; break; case QEMU_OPTION_boot: boot_device = optarg[0]; @@ -5555,9 +5583,21 @@ /* we always create the cdrom drive, even if no disk is there */ bdrv_init(); + int ci = 0; + char cdrom_name[7]; + strcpy(cdrom_name, "cdrom"); + cdrom_name[6] = '\0'; if (cdrom_index >= 0) { - bs_table[cdrom_index] = bdrv_new("cdrom"); - bdrv_set_type_hint(bs_table[cdrom_index], BDRV_TYPE_CDROM); + for (i = 0; i < MAX_DISKS; i++) + { + if (hd_is_cdrom[i]) + { + bs_table[i] = bdrv_new(cdrom_name); + ci++; + cdrom_name[5] = '0' + (char)ci; + bdrv_set_type_hint(bs_table[i], BDRV_TYPE_CDROM); + } + } } /* open the virtual block devices */