Revision 2292ddae
b/blockdev.c | ||
---|---|---|
75 | 75 |
} |
76 | 76 |
} |
77 | 77 |
|
78 |
QemuOpts *drive_add(const char *file, const char *fmt, ...) |
|
78 |
QemuOpts *drive_def(const char *optstr) |
|
79 |
{ |
|
80 |
return qemu_opts_parse(qemu_find_opts("drive"), optstr, 0); |
|
81 |
} |
|
82 |
|
|
83 |
QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file, |
|
84 |
const char *fmt, ...) |
|
79 | 85 |
{ |
80 | 86 |
va_list ap; |
81 | 87 |
char optstr[1024]; |
82 | 88 |
QemuOpts *opts; |
89 |
char buf[32]; |
|
83 | 90 |
|
84 | 91 |
va_start(ap, fmt); |
85 | 92 |
vsnprintf(optstr, sizeof(optstr), fmt, ap); |
86 | 93 |
va_end(ap); |
87 | 94 |
|
88 |
opts = qemu_opts_parse(qemu_find_opts("drive"), optstr, 0);
|
|
95 |
opts = drive_def(optstr);
|
|
89 | 96 |
if (!opts) { |
90 | 97 |
return NULL; |
91 | 98 |
} |
99 |
if (type != IF_DEFAULT) { |
|
100 |
qemu_opt_set(opts, "if", if_name[type]); |
|
101 |
} |
|
102 |
if (index >= 0) { |
|
103 |
snprintf(buf, sizeof(buf), "%d", index); |
|
104 |
qemu_opt_set(opts, "index", buf); |
|
105 |
} |
|
92 | 106 |
if (file) |
93 | 107 |
qemu_opt_set(opts, "file", file); |
94 | 108 |
return opts; |
... | ... | |
473 | 487 |
if (devaddr) |
474 | 488 |
qemu_opt_set(opts, "addr", devaddr); |
475 | 489 |
break; |
476 |
case IF_COUNT:
|
|
490 |
default:
|
|
477 | 491 |
abort(); |
478 | 492 |
} |
479 | 493 |
if (!file || !*file) { |
b/blockdev.h | ||
---|---|---|
19 | 19 |
#define BLOCK_SERIAL_STRLEN 20 |
20 | 20 |
|
21 | 21 |
typedef enum { |
22 |
IF_DEFAULT = -1, /* for use with drive_add() only */ |
|
22 | 23 |
IF_NONE, |
23 | 24 |
IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN, |
24 | 25 |
IF_COUNT |
... | ... | |
43 | 44 |
void drive_uninit(DriveInfo *dinfo); |
44 | 45 |
DriveInfo *drive_get_by_blockdev(BlockDriverState *bs); |
45 | 46 |
|
46 |
QemuOpts *drive_add(const char *file, const char *fmt, ...) GCC_FMT_ATTR(2, 3); |
|
47 |
QemuOpts *drive_def(const char *optstr); |
|
48 |
QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file, |
|
49 |
const char *fmt, ...) /*GCC_FMT_ATTR(4, 5)*/; |
|
50 |
/* GCC_FMT_ATTR() commented out to avoid the (pretty useless) |
|
51 |
* "zero-length gnu_printf format string" warning we insist to |
|
52 |
* enable */ |
|
47 | 53 |
DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi, int *fatal_error); |
48 | 54 |
|
49 | 55 |
/* device-hotplug */ |
b/hw/device-hotplug.c | ||
---|---|---|
33 | 33 |
DriveInfo *dinfo; |
34 | 34 |
QemuOpts *opts; |
35 | 35 |
|
36 |
opts = drive_add(NULL, "%s", optstr);
|
|
36 |
opts = drive_def(optstr);
|
|
37 | 37 |
if (!opts) |
38 | 38 |
return NULL; |
39 | 39 |
|
b/vl.c | ||
---|---|---|
621 | 621 |
/***********************************************************/ |
622 | 622 |
/* QEMU Block devices */ |
623 | 623 |
|
624 |
#define HD_ALIAS "index=%d,media=disk" |
|
625 |
#define CDROM_ALIAS "index=2,media=cdrom" |
|
626 |
#define FD_ALIAS "index=%d,if=floppy" |
|
627 |
#define PFLASH_ALIAS "if=pflash" |
|
628 |
#define MTD_ALIAS "if=mtd" |
|
629 |
#define SD_ALIAS "index=0,if=sd" |
|
624 |
/* Any % in the following strings must be escaped as %% */ |
|
625 |
#define HD_OPTS "media=disk" |
|
626 |
#define CDROM_OPTS "media=cdrom" |
|
627 |
#define FD_OPTS "" |
|
628 |
#define PFLASH_OPTS "" |
|
629 |
#define MTD_OPTS "" |
|
630 |
#define SD_OPTS "" |
|
630 | 631 |
|
631 | 632 |
static int drive_init_func(QemuOpts *opts, void *opaque) |
632 | 633 |
{ |
... | ... | |
1987 | 1988 |
if (optind >= argc) |
1988 | 1989 |
break; |
1989 | 1990 |
if (argv[optind][0] != '-') { |
1990 |
hda_opts = drive_add(argv[optind++], HD_ALIAS, 0);
|
|
1991 |
hda_opts = drive_add(IF_DEFAULT, 0, argv[optind++], HD_OPTS);
|
|
1991 | 1992 |
} else { |
1992 | 1993 |
const QEMUOption *popt; |
1993 | 1994 |
|
... | ... | |
2027 | 2028 |
break; |
2028 | 2029 |
case QEMU_OPTION_hda: |
2029 | 2030 |
if (cyls == 0) |
2030 |
hda_opts = drive_add(optarg, HD_ALIAS, 0);
|
|
2031 |
hda_opts = drive_add(IF_DEFAULT, 0, optarg, HD_OPTS);
|
|
2031 | 2032 |
else |
2032 |
hda_opts = drive_add(optarg, HD_ALIAS
|
|
2033 |
hda_opts = drive_add(IF_DEFAULT, 0, optarg, HD_OPTS
|
|
2033 | 2034 |
",cyls=%d,heads=%d,secs=%d%s", |
2034 |
0, cyls, heads, secs,
|
|
2035 |
cyls, heads, secs, |
|
2035 | 2036 |
translation == BIOS_ATA_TRANSLATION_LBA ? |
2036 | 2037 |
",trans=lba" : |
2037 | 2038 |
translation == BIOS_ATA_TRANSLATION_NONE ? |
... | ... | |
2040 | 2041 |
case QEMU_OPTION_hdb: |
2041 | 2042 |
case QEMU_OPTION_hdc: |
2042 | 2043 |
case QEMU_OPTION_hdd: |
2043 |
drive_add(optarg, HD_ALIAS, popt->index - QEMU_OPTION_hda); |
|
2044 |
drive_add(IF_DEFAULT, popt->index - QEMU_OPTION_hda, optarg, |
|
2045 |
HD_OPTS); |
|
2044 | 2046 |
break; |
2045 | 2047 |
case QEMU_OPTION_drive: |
2046 |
drive_add(NULL, "%s", optarg);
|
|
2048 |
drive_def(optarg);
|
|
2047 | 2049 |
break; |
2048 | 2050 |
case QEMU_OPTION_set: |
2049 | 2051 |
if (qemu_set_option(optarg) != 0) |
... | ... | |
2054 | 2056 |
exit(1); |
2055 | 2057 |
break; |
2056 | 2058 |
case QEMU_OPTION_mtdblock: |
2057 |
drive_add(optarg, MTD_ALIAS);
|
|
2059 |
drive_add(IF_MTD, -1, optarg, MTD_OPTS);
|
|
2058 | 2060 |
break; |
2059 | 2061 |
case QEMU_OPTION_sd: |
2060 |
drive_add(optarg, SD_ALIAS);
|
|
2062 |
drive_add(IF_SD, 0, optarg, SD_OPTS);
|
|
2061 | 2063 |
break; |
2062 | 2064 |
case QEMU_OPTION_pflash: |
2063 |
drive_add(optarg, PFLASH_ALIAS);
|
|
2065 |
drive_add(IF_PFLASH, -1, optarg, PFLASH_OPTS);
|
|
2064 | 2066 |
break; |
2065 | 2067 |
case QEMU_OPTION_snapshot: |
2066 | 2068 |
snapshot = 1; |
... | ... | |
2139 | 2141 |
kernel_cmdline = optarg; |
2140 | 2142 |
break; |
2141 | 2143 |
case QEMU_OPTION_cdrom: |
2142 |
drive_add(optarg, CDROM_ALIAS);
|
|
2144 |
drive_add(IF_DEFAULT, 2, optarg, CDROM_OPTS);
|
|
2143 | 2145 |
break; |
2144 | 2146 |
case QEMU_OPTION_boot: |
2145 | 2147 |
{ |
... | ... | |
2192 | 2194 |
break; |
2193 | 2195 |
case QEMU_OPTION_fda: |
2194 | 2196 |
case QEMU_OPTION_fdb: |
2195 |
drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda); |
|
2197 |
drive_add(IF_FLOPPY, popt->index - QEMU_OPTION_fda, |
|
2198 |
optarg, FD_OPTS); |
|
2196 | 2199 |
break; |
2197 | 2200 |
case QEMU_OPTION_no_fd_bootchk: |
2198 | 2201 |
fd_bootchk = 0; |
... | ... | |
2892 | 2895 |
|
2893 | 2896 |
if (default_cdrom) { |
2894 | 2897 |
/* we always create the cdrom drive, even if no disk is there */ |
2895 |
drive_add(NULL, CDROM_ALIAS);
|
|
2898 |
drive_add(IF_DEFAULT, 2, NULL, CDROM_OPTS);
|
|
2896 | 2899 |
} |
2897 | 2900 |
|
2898 | 2901 |
if (default_floppy) { |
2899 | 2902 |
/* we always create at least one floppy */ |
2900 |
drive_add(NULL, FD_ALIAS, 0);
|
|
2903 |
drive_add(IF_FLOPPY, 0, NULL, FD_OPTS);
|
|
2901 | 2904 |
} |
2902 | 2905 |
|
2903 | 2906 |
if (default_sdcard) { |
2904 | 2907 |
/* we always create one sd slot, even if no card is in it */ |
2905 |
drive_add(NULL, SD_ALIAS);
|
|
2908 |
drive_add(IF_SD, 0, NULL, SD_OPTS);
|
|
2906 | 2909 |
} |
2907 | 2910 |
|
2908 | 2911 |
/* open the virtual block devices */ |
Also available in: Unified diff