Statistics
| Branch: | Revision:

root / qemu-config.c @ f57a5160

History | View | Annotate | Download (21.5 kB)

1 7282a033 Gerd Hoffmann
#include "qemu-common.h"
2 2f792016 Markus Armbruster
#include "qemu-error.h"
3 7282a033 Gerd Hoffmann
#include "qemu-option.h"
4 7282a033 Gerd Hoffmann
#include "qemu-config.h"
5 d0fef6fb Gerd Hoffmann
#include "hw/qdev.h"
6 7282a033 Gerd Hoffmann
7 3329f07b Gerd Hoffmann
static QemuOptsList qemu_drive_opts = {
8 7282a033 Gerd Hoffmann
    .name = "drive",
9 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_drive_opts.head),
10 7282a033 Gerd Hoffmann
    .desc = {
11 7282a033 Gerd Hoffmann
        {
12 7282a033 Gerd Hoffmann
            .name = "bus",
13 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
14 7282a033 Gerd Hoffmann
            .help = "bus number",
15 7282a033 Gerd Hoffmann
        },{
16 7282a033 Gerd Hoffmann
            .name = "unit",
17 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
18 7282a033 Gerd Hoffmann
            .help = "unit number (i.e. lun for scsi)",
19 7282a033 Gerd Hoffmann
        },{
20 7282a033 Gerd Hoffmann
            .name = "if",
21 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
22 7282a033 Gerd Hoffmann
            .help = "interface (ide, scsi, sd, mtd, floppy, pflash, virtio)",
23 7282a033 Gerd Hoffmann
        },{
24 7282a033 Gerd Hoffmann
            .name = "index",
25 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
26 69d7e218 Luiz Capitulino
            .help = "index number",
27 7282a033 Gerd Hoffmann
        },{
28 7282a033 Gerd Hoffmann
            .name = "cyls",
29 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
30 7282a033 Gerd Hoffmann
            .help = "number of cylinders (ide disk geometry)",
31 7282a033 Gerd Hoffmann
        },{
32 7282a033 Gerd Hoffmann
            .name = "heads",
33 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
34 7282a033 Gerd Hoffmann
            .help = "number of heads (ide disk geometry)",
35 7282a033 Gerd Hoffmann
        },{
36 7282a033 Gerd Hoffmann
            .name = "secs",
37 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
38 7282a033 Gerd Hoffmann
            .help = "number of sectors (ide disk geometry)",
39 7282a033 Gerd Hoffmann
        },{
40 7282a033 Gerd Hoffmann
            .name = "trans",
41 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
42 7282a033 Gerd Hoffmann
            .help = "chs translation (auto, lba. none)",
43 7282a033 Gerd Hoffmann
        },{
44 7282a033 Gerd Hoffmann
            .name = "media",
45 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
46 7282a033 Gerd Hoffmann
            .help = "media type (disk, cdrom)",
47 7282a033 Gerd Hoffmann
        },{
48 7282a033 Gerd Hoffmann
            .name = "snapshot",
49 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
50 69d7e218 Luiz Capitulino
            .help = "enable/disable snapshot mode",
51 7282a033 Gerd Hoffmann
        },{
52 7282a033 Gerd Hoffmann
            .name = "file",
53 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
54 7282a033 Gerd Hoffmann
            .help = "disk image",
55 7282a033 Gerd Hoffmann
        },{
56 7282a033 Gerd Hoffmann
            .name = "cache",
57 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
58 92196b2f Stefan Hajnoczi
            .help = "host cache usage (none, writeback, writethrough, "
59 92196b2f Stefan Hajnoczi
                    "directsync, unsafe)",
60 7282a033 Gerd Hoffmann
        },{
61 5c6c3a6c Christoph Hellwig
            .name = "aio",
62 5c6c3a6c Christoph Hellwig
            .type = QEMU_OPT_STRING,
63 5c6c3a6c Christoph Hellwig
            .help = "host AIO implementation (threads, native)",
64 5c6c3a6c Christoph Hellwig
        },{
65 7282a033 Gerd Hoffmann
            .name = "format",
66 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
67 7282a033 Gerd Hoffmann
            .help = "disk format (raw, qcow2, ...)",
68 7282a033 Gerd Hoffmann
        },{
69 7282a033 Gerd Hoffmann
            .name = "serial",
70 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
71 69d7e218 Luiz Capitulino
            .help = "disk serial number",
72 7282a033 Gerd Hoffmann
        },{
73 e9b2e818 Kevin Wolf
            .name = "rerror",
74 e9b2e818 Kevin Wolf
            .type = QEMU_OPT_STRING,
75 69d7e218 Luiz Capitulino
            .help = "read error action",
76 e9b2e818 Kevin Wolf
        },{
77 7282a033 Gerd Hoffmann
            .name = "werror",
78 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
79 69d7e218 Luiz Capitulino
            .help = "write error action",
80 7282a033 Gerd Hoffmann
        },{
81 7282a033 Gerd Hoffmann
            .name = "addr",
82 7282a033 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
83 7282a033 Gerd Hoffmann
            .help = "pci address (virtio only)",
84 59f2689d Naphtali Sprei
        },{
85 59f2689d Naphtali Sprei
            .name = "readonly",
86 59f2689d Naphtali Sprei
            .type = QEMU_OPT_BOOL,
87 69d7e218 Luiz Capitulino
            .help = "open drive file as read-only",
88 0563e191 Zhi Yong Wu
        },{
89 0563e191 Zhi Yong Wu
            .name = "iops",
90 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
91 0563e191 Zhi Yong Wu
            .help = "limit total I/O operations per second",
92 0563e191 Zhi Yong Wu
        },{
93 0563e191 Zhi Yong Wu
            .name = "iops_rd",
94 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
95 0563e191 Zhi Yong Wu
            .help = "limit read operations per second",
96 0563e191 Zhi Yong Wu
        },{
97 0563e191 Zhi Yong Wu
            .name = "iops_wr",
98 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
99 0563e191 Zhi Yong Wu
            .help = "limit write operations per second",
100 0563e191 Zhi Yong Wu
        },{
101 0563e191 Zhi Yong Wu
            .name = "bps",
102 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
103 0563e191 Zhi Yong Wu
            .help = "limit total bytes per second",
104 0563e191 Zhi Yong Wu
        },{
105 0563e191 Zhi Yong Wu
            .name = "bps_rd",
106 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
107 0563e191 Zhi Yong Wu
            .help = "limit read bytes per second",
108 0563e191 Zhi Yong Wu
        },{
109 0563e191 Zhi Yong Wu
            .name = "bps_wr",
110 0563e191 Zhi Yong Wu
            .type = QEMU_OPT_NUMBER,
111 0563e191 Zhi Yong Wu
            .help = "limit write bytes per second",
112 fb0490f6 Stefan Hajnoczi
        },{
113 fb0490f6 Stefan Hajnoczi
            .name = "copy-on-read",
114 fb0490f6 Stefan Hajnoczi
            .type = QEMU_OPT_BOOL,
115 fb0490f6 Stefan Hajnoczi
            .help = "copy read data from backing file into image file",
116 7282a033 Gerd Hoffmann
        },
117 26056e0c Jes Sorensen
        { /* end of list */ }
118 7282a033 Gerd Hoffmann
    },
119 7282a033 Gerd Hoffmann
};
120 7282a033 Gerd Hoffmann
121 f9dadc98 Ronnie Sahlberg
static QemuOptsList qemu_iscsi_opts = {
122 f9dadc98 Ronnie Sahlberg
    .name = "iscsi",
123 f9dadc98 Ronnie Sahlberg
    .head = QTAILQ_HEAD_INITIALIZER(qemu_iscsi_opts.head),
124 f9dadc98 Ronnie Sahlberg
    .desc = {
125 f9dadc98 Ronnie Sahlberg
        {
126 f9dadc98 Ronnie Sahlberg
            .name = "user",
127 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
128 f9dadc98 Ronnie Sahlberg
            .help = "username for CHAP authentication to target",
129 f9dadc98 Ronnie Sahlberg
        },{
130 f9dadc98 Ronnie Sahlberg
            .name = "password",
131 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
132 f9dadc98 Ronnie Sahlberg
            .help = "password for CHAP authentication to target",
133 f9dadc98 Ronnie Sahlberg
        },{
134 f9dadc98 Ronnie Sahlberg
            .name = "header-digest",
135 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
136 f9dadc98 Ronnie Sahlberg
            .help = "HeaderDigest setting. "
137 f9dadc98 Ronnie Sahlberg
                    "{CRC32C|CRC32C-NONE|NONE-CRC32C|NONE}",
138 f9dadc98 Ronnie Sahlberg
        },{
139 f9dadc98 Ronnie Sahlberg
            .name = "initiator-name",
140 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
141 f9dadc98 Ronnie Sahlberg
            .help = "Initiator iqn name to use when connecting",
142 f9dadc98 Ronnie Sahlberg
        },
143 f9dadc98 Ronnie Sahlberg
        { /* end of list */ }
144 f9dadc98 Ronnie Sahlberg
    },
145 f9dadc98 Ronnie Sahlberg
};
146 f9dadc98 Ronnie Sahlberg
147 3329f07b Gerd Hoffmann
static QemuOptsList qemu_chardev_opts = {
148 191bc01b Gerd Hoffmann
    .name = "chardev",
149 8212c64f Markus Armbruster
    .implied_opt_name = "backend",
150 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_chardev_opts.head),
151 191bc01b Gerd Hoffmann
    .desc = {
152 7d31544f Gerd Hoffmann
        {
153 7d31544f Gerd Hoffmann
            .name = "backend",
154 7d31544f Gerd Hoffmann
            .type = QEMU_OPT_STRING,
155 7d31544f Gerd Hoffmann
        },{
156 7d31544f Gerd Hoffmann
            .name = "path",
157 7d31544f Gerd Hoffmann
            .type = QEMU_OPT_STRING,
158 aeb2c47a Gerd Hoffmann
        },{
159 aeb2c47a Gerd Hoffmann
            .name = "host",
160 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_STRING,
161 aeb2c47a Gerd Hoffmann
        },{
162 aeb2c47a Gerd Hoffmann
            .name = "port",
163 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_STRING,
164 aeb2c47a Gerd Hoffmann
        },{
165 7e1b35b4 Gerd Hoffmann
            .name = "localaddr",
166 7e1b35b4 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
167 7e1b35b4 Gerd Hoffmann
        },{
168 7e1b35b4 Gerd Hoffmann
            .name = "localport",
169 7e1b35b4 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
170 7e1b35b4 Gerd Hoffmann
        },{
171 aeb2c47a Gerd Hoffmann
            .name = "to",
172 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
173 aeb2c47a Gerd Hoffmann
        },{
174 aeb2c47a Gerd Hoffmann
            .name = "ipv4",
175 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
176 aeb2c47a Gerd Hoffmann
        },{
177 aeb2c47a Gerd Hoffmann
            .name = "ipv6",
178 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
179 aeb2c47a Gerd Hoffmann
        },{
180 aeb2c47a Gerd Hoffmann
            .name = "wait",
181 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
182 aeb2c47a Gerd Hoffmann
        },{
183 aeb2c47a Gerd Hoffmann
            .name = "server",
184 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
185 aeb2c47a Gerd Hoffmann
        },{
186 aeb2c47a Gerd Hoffmann
            .name = "delay",
187 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
188 aeb2c47a Gerd Hoffmann
        },{
189 aeb2c47a Gerd Hoffmann
            .name = "telnet",
190 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
191 6ea314d9 Gerd Hoffmann
        },{
192 6ea314d9 Gerd Hoffmann
            .name = "width",
193 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
194 6ea314d9 Gerd Hoffmann
        },{
195 6ea314d9 Gerd Hoffmann
            .name = "height",
196 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
197 6ea314d9 Gerd Hoffmann
        },{
198 6ea314d9 Gerd Hoffmann
            .name = "cols",
199 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
200 6ea314d9 Gerd Hoffmann
        },{
201 6ea314d9 Gerd Hoffmann
            .name = "rows",
202 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
203 c845f401 Gerd Hoffmann
        },{
204 c845f401 Gerd Hoffmann
            .name = "mux",
205 c845f401 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
206 5989020b Kusanagi Kouichi
        },{
207 5989020b Kusanagi Kouichi
            .name = "signal",
208 5989020b Kusanagi Kouichi
            .type = QEMU_OPT_BOOL,
209 cbcc6336 Alon Levy
        },{
210 cbcc6336 Alon Levy
            .name = "name",
211 cbcc6336 Alon Levy
            .type = QEMU_OPT_STRING,
212 cbcc6336 Alon Levy
        },{
213 cbcc6336 Alon Levy
            .name = "debug",
214 cbcc6336 Alon Levy
            .type = QEMU_OPT_NUMBER,
215 7d31544f Gerd Hoffmann
        },
216 26056e0c Jes Sorensen
        { /* end of list */ }
217 191bc01b Gerd Hoffmann
    },
218 191bc01b Gerd Hoffmann
};
219 191bc01b Gerd Hoffmann
220 74db920c Gautham R Shenoy
QemuOptsList qemu_fsdev_opts = {
221 74db920c Gautham R Shenoy
    .name = "fsdev",
222 fbcbf101 Aneesh Kumar K.V
    .implied_opt_name = "fsdriver",
223 74db920c Gautham R Shenoy
    .head = QTAILQ_HEAD_INITIALIZER(qemu_fsdev_opts.head),
224 74db920c Gautham R Shenoy
    .desc = {
225 74db920c Gautham R Shenoy
        {
226 fbcbf101 Aneesh Kumar K.V
            .name = "fsdriver",
227 74db920c Gautham R Shenoy
            .type = QEMU_OPT_STRING,
228 74db920c Gautham R Shenoy
        }, {
229 74db920c Gautham R Shenoy
            .name = "path",
230 74db920c Gautham R Shenoy
            .type = QEMU_OPT_STRING,
231 9ce56db6 Venkateswararao Jujjuri (JV)
        }, {
232 9ce56db6 Venkateswararao Jujjuri (JV)
            .name = "security_model",
233 9ce56db6 Venkateswararao Jujjuri (JV)
            .type = QEMU_OPT_STRING,
234 d3ab98e6 Aneesh Kumar K.V
        }, {
235 d3ab98e6 Aneesh Kumar K.V
            .name = "writeout",
236 d3ab98e6 Aneesh Kumar K.V
            .type = QEMU_OPT_STRING,
237 2c74c2cb M. Mohan Kumar
        }, {
238 2c74c2cb M. Mohan Kumar
            .name = "readonly",
239 2c74c2cb M. Mohan Kumar
            .type = QEMU_OPT_BOOL,
240 84a87cc4 M. Mohan Kumar
241 84a87cc4 M. Mohan Kumar
        }, {
242 84a87cc4 M. Mohan Kumar
            .name = "socket",
243 84a87cc4 M. Mohan Kumar
            .type = QEMU_OPT_STRING,
244 4c793dda M. Mohan Kumar
        }, {
245 4c793dda M. Mohan Kumar
            .name = "sock_fd",
246 4c793dda M. Mohan Kumar
            .type = QEMU_OPT_NUMBER,
247 74db920c Gautham R Shenoy
        },
248 2c74c2cb M. Mohan Kumar
249 74db920c Gautham R Shenoy
        { /*End of list */ }
250 74db920c Gautham R Shenoy
    },
251 74db920c Gautham R Shenoy
};
252 74db920c Gautham R Shenoy
253 3d54abc7 Gautham R Shenoy
QemuOptsList qemu_virtfs_opts = {
254 3d54abc7 Gautham R Shenoy
    .name = "virtfs",
255 fbcbf101 Aneesh Kumar K.V
    .implied_opt_name = "fsdriver",
256 3d54abc7 Gautham R Shenoy
    .head = QTAILQ_HEAD_INITIALIZER(qemu_virtfs_opts.head),
257 3d54abc7 Gautham R Shenoy
    .desc = {
258 3d54abc7 Gautham R Shenoy
        {
259 fbcbf101 Aneesh Kumar K.V
            .name = "fsdriver",
260 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
261 3d54abc7 Gautham R Shenoy
        }, {
262 3d54abc7 Gautham R Shenoy
            .name = "path",
263 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
264 3d54abc7 Gautham R Shenoy
        }, {
265 3d54abc7 Gautham R Shenoy
            .name = "mount_tag",
266 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
267 9ce56db6 Venkateswararao Jujjuri (JV)
        }, {
268 9ce56db6 Venkateswararao Jujjuri (JV)
            .name = "security_model",
269 9ce56db6 Venkateswararao Jujjuri (JV)
            .type = QEMU_OPT_STRING,
270 d3ab98e6 Aneesh Kumar K.V
        }, {
271 d3ab98e6 Aneesh Kumar K.V
            .name = "writeout",
272 d3ab98e6 Aneesh Kumar K.V
            .type = QEMU_OPT_STRING,
273 2c74c2cb M. Mohan Kumar
        }, {
274 2c74c2cb M. Mohan Kumar
            .name = "readonly",
275 2c74c2cb M. Mohan Kumar
            .type = QEMU_OPT_BOOL,
276 4c793dda M. Mohan Kumar
        }, {
277 84a87cc4 M. Mohan Kumar
            .name = "socket",
278 84a87cc4 M. Mohan Kumar
            .type = QEMU_OPT_STRING,
279 84a87cc4 M. Mohan Kumar
        }, {
280 4c793dda M. Mohan Kumar
            .name = "sock_fd",
281 4c793dda M. Mohan Kumar
            .type = QEMU_OPT_NUMBER,
282 3d54abc7 Gautham R Shenoy
        },
283 3d54abc7 Gautham R Shenoy
284 3d54abc7 Gautham R Shenoy
        { /*End of list */ }
285 3d54abc7 Gautham R Shenoy
    },
286 3d54abc7 Gautham R Shenoy
};
287 3d54abc7 Gautham R Shenoy
288 3329f07b Gerd Hoffmann
static QemuOptsList qemu_device_opts = {
289 f31d07d1 Gerd Hoffmann
    .name = "device",
290 8212c64f Markus Armbruster
    .implied_opt_name = "driver",
291 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_device_opts.head),
292 f31d07d1 Gerd Hoffmann
    .desc = {
293 f31d07d1 Gerd Hoffmann
        /*
294 f31d07d1 Gerd Hoffmann
         * no elements => accept any
295 f31d07d1 Gerd Hoffmann
         * sanity checking will happen later
296 f31d07d1 Gerd Hoffmann
         * when setting device properties
297 f31d07d1 Gerd Hoffmann
         */
298 26056e0c Jes Sorensen
        { /* end of list */ }
299 f31d07d1 Gerd Hoffmann
    },
300 f31d07d1 Gerd Hoffmann
};
301 f31d07d1 Gerd Hoffmann
302 3329f07b Gerd Hoffmann
static QemuOptsList qemu_netdev_opts = {
303 a1ea458f Mark McLoughlin
    .name = "netdev",
304 8212c64f Markus Armbruster
    .implied_opt_name = "type",
305 a1ea458f Mark McLoughlin
    .head = QTAILQ_HEAD_INITIALIZER(qemu_netdev_opts.head),
306 a1ea458f Mark McLoughlin
    .desc = {
307 a1ea458f Mark McLoughlin
        /*
308 a1ea458f Mark McLoughlin
         * no elements => accept any params
309 a1ea458f Mark McLoughlin
         * validation will happen later
310 a1ea458f Mark McLoughlin
         */
311 a1ea458f Mark McLoughlin
        { /* end of list */ }
312 a1ea458f Mark McLoughlin
    },
313 a1ea458f Mark McLoughlin
};
314 a1ea458f Mark McLoughlin
315 3329f07b Gerd Hoffmann
static QemuOptsList qemu_net_opts = {
316 8119b33d Mark McLoughlin
    .name = "net",
317 8212c64f Markus Armbruster
    .implied_opt_name = "type",
318 8119b33d Mark McLoughlin
    .head = QTAILQ_HEAD_INITIALIZER(qemu_net_opts.head),
319 8119b33d Mark McLoughlin
    .desc = {
320 8119b33d Mark McLoughlin
        /*
321 8119b33d Mark McLoughlin
         * no elements => accept any params
322 8119b33d Mark McLoughlin
         * validation will happen later
323 8119b33d Mark McLoughlin
         */
324 8119b33d Mark McLoughlin
        { /* end of list */ }
325 8119b33d Mark McLoughlin
    },
326 8119b33d Mark McLoughlin
};
327 8119b33d Mark McLoughlin
328 3329f07b Gerd Hoffmann
static QemuOptsList qemu_rtc_opts = {
329 1ed2fc1f Jan Kiszka
    .name = "rtc",
330 1ed2fc1f Jan Kiszka
    .head = QTAILQ_HEAD_INITIALIZER(qemu_rtc_opts.head),
331 1ed2fc1f Jan Kiszka
    .desc = {
332 1ed2fc1f Jan Kiszka
        {
333 1ed2fc1f Jan Kiszka
            .name = "base",
334 1ed2fc1f Jan Kiszka
            .type = QEMU_OPT_STRING,
335 6875204c Jan Kiszka
        },{
336 6875204c Jan Kiszka
            .name = "clock",
337 6875204c Jan Kiszka
            .type = QEMU_OPT_STRING,
338 1ed2fc1f Jan Kiszka
        },{
339 1ed2fc1f Jan Kiszka
            .name = "driftfix",
340 1ed2fc1f Jan Kiszka
            .type = QEMU_OPT_STRING,
341 1ed2fc1f Jan Kiszka
        },
342 26056e0c Jes Sorensen
        { /* end of list */ }
343 1ed2fc1f Jan Kiszka
    },
344 1ed2fc1f Jan Kiszka
};
345 1ed2fc1f Jan Kiszka
346 3329f07b Gerd Hoffmann
static QemuOptsList qemu_global_opts = {
347 d0fef6fb Gerd Hoffmann
    .name = "global",
348 d0fef6fb Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_global_opts.head),
349 d0fef6fb Gerd Hoffmann
    .desc = {
350 d0fef6fb Gerd Hoffmann
        {
351 d0fef6fb Gerd Hoffmann
            .name = "driver",
352 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
353 d0fef6fb Gerd Hoffmann
        },{
354 d0fef6fb Gerd Hoffmann
            .name = "property",
355 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
356 d0fef6fb Gerd Hoffmann
        },{
357 d0fef6fb Gerd Hoffmann
            .name = "value",
358 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
359 d0fef6fb Gerd Hoffmann
        },
360 26056e0c Jes Sorensen
        { /* end of list */ }
361 d0fef6fb Gerd Hoffmann
    },
362 d0fef6fb Gerd Hoffmann
};
363 d0fef6fb Gerd Hoffmann
364 3329f07b Gerd Hoffmann
static QemuOptsList qemu_mon_opts = {
365 88589343 Gerd Hoffmann
    .name = "mon",
366 8212c64f Markus Armbruster
    .implied_opt_name = "chardev",
367 88589343 Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_mon_opts.head),
368 88589343 Gerd Hoffmann
    .desc = {
369 88589343 Gerd Hoffmann
        {
370 88589343 Gerd Hoffmann
            .name = "mode",
371 88589343 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
372 88589343 Gerd Hoffmann
        },{
373 88589343 Gerd Hoffmann
            .name = "chardev",
374 88589343 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
375 88589343 Gerd Hoffmann
        },{
376 88589343 Gerd Hoffmann
            .name = "default",
377 88589343 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
378 39eaab9a Daniel P. Berrange
        },{
379 39eaab9a Daniel P. Berrange
            .name = "pretty",
380 39eaab9a Daniel P. Berrange
            .type = QEMU_OPT_BOOL,
381 88589343 Gerd Hoffmann
        },
382 26056e0c Jes Sorensen
        { /* end of list */ }
383 88589343 Gerd Hoffmann
    },
384 88589343 Gerd Hoffmann
};
385 88589343 Gerd Hoffmann
386 ab6540d5 Prerna Saxena
static QemuOptsList qemu_trace_opts = {
387 ab6540d5 Prerna Saxena
    .name = "trace",
388 ab6540d5 Prerna Saxena
    .implied_opt_name = "trace",
389 ab6540d5 Prerna Saxena
    .head = QTAILQ_HEAD_INITIALIZER(qemu_trace_opts.head),
390 ab6540d5 Prerna Saxena
    .desc = {
391 ab6540d5 Prerna Saxena
        {
392 23d15e86 Lluรญs
            .name = "events",
393 23d15e86 Lluรญs
            .type = QEMU_OPT_STRING,
394 23d15e86 Lluรญs
        },{
395 ab6540d5 Prerna Saxena
            .name = "file",
396 ab6540d5 Prerna Saxena
            .type = QEMU_OPT_STRING,
397 ab6540d5 Prerna Saxena
        },
398 44bd6907 Gerd Hoffmann
        { /* end of list */ }
399 ab6540d5 Prerna Saxena
    },
400 ab6540d5 Prerna Saxena
};
401 ab6540d5 Prerna Saxena
402 3329f07b Gerd Hoffmann
static QemuOptsList qemu_cpudef_opts = {
403 b5ec5ce0 john cooper
    .name = "cpudef",
404 b5ec5ce0 john cooper
    .head = QTAILQ_HEAD_INITIALIZER(qemu_cpudef_opts.head),
405 b5ec5ce0 john cooper
    .desc = {
406 b5ec5ce0 john cooper
        {
407 b5ec5ce0 john cooper
            .name = "name",
408 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
409 b5ec5ce0 john cooper
        },{
410 b5ec5ce0 john cooper
            .name = "level",
411 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
412 b5ec5ce0 john cooper
        },{
413 b5ec5ce0 john cooper
            .name = "vendor",
414 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
415 b5ec5ce0 john cooper
        },{
416 b5ec5ce0 john cooper
            .name = "family",
417 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
418 b5ec5ce0 john cooper
        },{
419 b5ec5ce0 john cooper
            .name = "model",
420 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
421 b5ec5ce0 john cooper
        },{
422 b5ec5ce0 john cooper
            .name = "stepping",
423 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
424 b5ec5ce0 john cooper
        },{
425 b5ec5ce0 john cooper
            .name = "feature_edx",      /* cpuid 0000_0001.edx */
426 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
427 b5ec5ce0 john cooper
        },{
428 b5ec5ce0 john cooper
            .name = "feature_ecx",      /* cpuid 0000_0001.ecx */
429 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
430 b5ec5ce0 john cooper
        },{
431 b5ec5ce0 john cooper
            .name = "extfeature_edx",   /* cpuid 8000_0001.edx */
432 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
433 b5ec5ce0 john cooper
        },{
434 b5ec5ce0 john cooper
            .name = "extfeature_ecx",   /* cpuid 8000_0001.ecx */
435 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
436 b5ec5ce0 john cooper
        },{
437 b5ec5ce0 john cooper
            .name = "xlevel",
438 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
439 b5ec5ce0 john cooper
        },{
440 b5ec5ce0 john cooper
            .name = "model_id",
441 b5ec5ce0 john cooper
            .type = QEMU_OPT_STRING,
442 b5ec5ce0 john cooper
        },{
443 b5ec5ce0 john cooper
            .name = "vendor_override",
444 b5ec5ce0 john cooper
            .type = QEMU_OPT_NUMBER,
445 b5ec5ce0 john cooper
        },
446 b5ec5ce0 john cooper
        { /* end of list */ }
447 b5ec5ce0 john cooper
    },
448 b5ec5ce0 john cooper
};
449 b5ec5ce0 john cooper
450 29b0040b Gerd Hoffmann
QemuOptsList qemu_spice_opts = {
451 29b0040b Gerd Hoffmann
    .name = "spice",
452 29b0040b Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_spice_opts.head),
453 29b0040b Gerd Hoffmann
    .desc = {
454 29b0040b Gerd Hoffmann
        {
455 29b0040b Gerd Hoffmann
            .name = "port",
456 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
457 29b0040b Gerd Hoffmann
        },{
458 c448e855 Gerd Hoffmann
            .name = "tls-port",
459 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
460 c448e855 Gerd Hoffmann
        },{
461 333b0eeb Gerd Hoffmann
            .name = "addr",
462 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
463 333b0eeb Gerd Hoffmann
        },{
464 333b0eeb Gerd Hoffmann
            .name = "ipv4",
465 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
466 333b0eeb Gerd Hoffmann
        },{
467 333b0eeb Gerd Hoffmann
            .name = "ipv6",
468 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
469 333b0eeb Gerd Hoffmann
        },{
470 29b0040b Gerd Hoffmann
            .name = "password",
471 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_STRING,
472 29b0040b Gerd Hoffmann
        },{
473 29b0040b Gerd Hoffmann
            .name = "disable-ticketing",
474 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
475 c448e855 Gerd Hoffmann
        },{
476 d4970b07 Hans de Goede
            .name = "disable-copy-paste",
477 d4970b07 Hans de Goede
            .type = QEMU_OPT_BOOL,
478 d4970b07 Hans de Goede
        },{
479 48b3ed0a Marc-Andrรฉ Lureau
            .name = "sasl",
480 48b3ed0a Marc-Andrรฉ Lureau
            .type = QEMU_OPT_BOOL,
481 48b3ed0a Marc-Andrรฉ Lureau
        },{
482 c448e855 Gerd Hoffmann
            .name = "x509-dir",
483 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
484 c448e855 Gerd Hoffmann
        },{
485 c448e855 Gerd Hoffmann
            .name = "x509-key-file",
486 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
487 c448e855 Gerd Hoffmann
        },{
488 c448e855 Gerd Hoffmann
            .name = "x509-key-password",
489 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
490 c448e855 Gerd Hoffmann
        },{
491 c448e855 Gerd Hoffmann
            .name = "x509-cert-file",
492 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
493 c448e855 Gerd Hoffmann
        },{
494 c448e855 Gerd Hoffmann
            .name = "x509-cacert-file",
495 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
496 c448e855 Gerd Hoffmann
        },{
497 c448e855 Gerd Hoffmann
            .name = "x509-dh-key-file",
498 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
499 c448e855 Gerd Hoffmann
        },{
500 c448e855 Gerd Hoffmann
            .name = "tls-ciphers",
501 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
502 9f04e09e Yonit Halperin
        },{
503 17b6dea0 Gerd Hoffmann
            .name = "tls-channel",
504 17b6dea0 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
505 17b6dea0 Gerd Hoffmann
        },{
506 17b6dea0 Gerd Hoffmann
            .name = "plaintext-channel",
507 17b6dea0 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
508 17b6dea0 Gerd Hoffmann
        },{
509 9f04e09e Yonit Halperin
            .name = "image-compression",
510 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
511 9f04e09e Yonit Halperin
        },{
512 9f04e09e Yonit Halperin
            .name = "jpeg-wan-compression",
513 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
514 9f04e09e Yonit Halperin
        },{
515 9f04e09e Yonit Halperin
            .name = "zlib-glz-wan-compression",
516 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
517 84a23f25 Gerd Hoffmann
        },{
518 84a23f25 Gerd Hoffmann
            .name = "streaming-video",
519 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
520 84a23f25 Gerd Hoffmann
        },{
521 84a23f25 Gerd Hoffmann
            .name = "agent-mouse",
522 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
523 84a23f25 Gerd Hoffmann
        },{
524 84a23f25 Gerd Hoffmann
            .name = "playback-compression",
525 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
526 29b0040b Gerd Hoffmann
        },
527 44bd6907 Gerd Hoffmann
        { /* end of list */ }
528 29b0040b Gerd Hoffmann
    },
529 29b0040b Gerd Hoffmann
};
530 29b0040b Gerd Hoffmann
531 2e55e842 Gleb Natapov
QemuOptsList qemu_option_rom_opts = {
532 2e55e842 Gleb Natapov
    .name = "option-rom",
533 2e55e842 Gleb Natapov
    .implied_opt_name = "romfile",
534 2e55e842 Gleb Natapov
    .head = QTAILQ_HEAD_INITIALIZER(qemu_option_rom_opts.head),
535 2e55e842 Gleb Natapov
    .desc = {
536 2e55e842 Gleb Natapov
        {
537 2e55e842 Gleb Natapov
            .name = "bootindex",
538 2e55e842 Gleb Natapov
            .type = QEMU_OPT_NUMBER,
539 2e55e842 Gleb Natapov
        }, {
540 2e55e842 Gleb Natapov
            .name = "romfile",
541 2e55e842 Gleb Natapov
            .type = QEMU_OPT_STRING,
542 2e55e842 Gleb Natapov
        },
543 44bd6907 Gerd Hoffmann
        { /* end of list */ }
544 2e55e842 Gleb Natapov
    },
545 2e55e842 Gleb Natapov
};
546 2e55e842 Gleb Natapov
547 303d4e86 Anthony PERARD
static QemuOptsList qemu_machine_opts = {
548 303d4e86 Anthony PERARD
    .name = "machine",
549 9052ea6b Jan Kiszka
    .implied_opt_name = "type",
550 9de36b1a Peter Maydell
    .merge_lists = true,
551 303d4e86 Anthony PERARD
    .head = QTAILQ_HEAD_INITIALIZER(qemu_machine_opts.head),
552 303d4e86 Anthony PERARD
    .desc = {
553 303d4e86 Anthony PERARD
        {
554 9052ea6b Jan Kiszka
            .name = "type",
555 9052ea6b Jan Kiszka
            .type = QEMU_OPT_STRING,
556 9052ea6b Jan Kiszka
            .help = "emulated machine"
557 9052ea6b Jan Kiszka
        }, {
558 303d4e86 Anthony PERARD
            .name = "accel",
559 303d4e86 Anthony PERARD
            .type = QEMU_OPT_STRING,
560 303d4e86 Anthony PERARD
            .help = "accelerator list",
561 6a48ffaa Jan Kiszka
        }, {
562 6a48ffaa Jan Kiszka
            .name = "kernel_irqchip",
563 6a48ffaa Jan Kiszka
            .type = QEMU_OPT_BOOL,
564 6a48ffaa Jan Kiszka
            .help = "use KVM in-kernel irqchip",
565 39d6960a Jan Kiszka
        }, {
566 39d6960a Jan Kiszka
            .name = "kvm_shadow_mem",
567 39d6960a Jan Kiszka
            .type = QEMU_OPT_SIZE,
568 39d6960a Jan Kiszka
            .help = "KVM shadow MMU size",
569 a0abe474 Peter Maydell
        }, {
570 a0abe474 Peter Maydell
            .name = "kernel",
571 a0abe474 Peter Maydell
            .type = QEMU_OPT_STRING,
572 a0abe474 Peter Maydell
            .help = "Linux kernel image file",
573 a0abe474 Peter Maydell
        }, {
574 a0abe474 Peter Maydell
            .name = "initrd",
575 a0abe474 Peter Maydell
            .type = QEMU_OPT_STRING,
576 a0abe474 Peter Maydell
            .help = "Linux initial ramdisk file",
577 a0abe474 Peter Maydell
        }, {
578 a0abe474 Peter Maydell
            .name = "append",
579 a0abe474 Peter Maydell
            .type = QEMU_OPT_STRING,
580 a0abe474 Peter Maydell
            .help = "Linux kernel command line",
581 412beee6 Grant Likely
        }, {
582 412beee6 Grant Likely
            .name = "dtb",
583 412beee6 Grant Likely
            .type = QEMU_OPT_STRING,
584 412beee6 Grant Likely
            .help = "Linux kernel device tree file",
585 303d4e86 Anthony PERARD
        },
586 303d4e86 Anthony PERARD
        { /* End of list */ }
587 303d4e86 Anthony PERARD
    },
588 303d4e86 Anthony PERARD
};
589 303d4e86 Anthony PERARD
590 3d3b8303 wayne
QemuOptsList qemu_boot_opts = {
591 3d3b8303 wayne
    .name = "boot-opts",
592 3d3b8303 wayne
    .head = QTAILQ_HEAD_INITIALIZER(qemu_boot_opts.head),
593 3d3b8303 wayne
    .desc = {
594 3d3b8303 wayne
        /* the three names below are not used now */
595 3d3b8303 wayne
        {
596 3d3b8303 wayne
            .name = "order",
597 3d3b8303 wayne
            .type = QEMU_OPT_STRING,
598 3d3b8303 wayne
        }, {
599 3d3b8303 wayne
            .name = "once",
600 3d3b8303 wayne
            .type = QEMU_OPT_STRING,
601 3d3b8303 wayne
        }, {
602 3d3b8303 wayne
            .name = "menu",
603 3d3b8303 wayne
            .type = QEMU_OPT_STRING,
604 3d3b8303 wayne
        /* following are really used */
605 3d3b8303 wayne
        }, {
606 3d3b8303 wayne
            .name = "splash",
607 3d3b8303 wayne
            .type = QEMU_OPT_STRING,
608 3d3b8303 wayne
        }, {
609 3d3b8303 wayne
            .name = "splash-time",
610 3d3b8303 wayne
            .type = QEMU_OPT_STRING,
611 3d3b8303 wayne
        },
612 3d3b8303 wayne
        { /*End of list */ }
613 3d3b8303 wayne
    },
614 3d3b8303 wayne
};
615 3d3b8303 wayne
616 dfe795e7 Gerd Hoffmann
static QemuOptsList *vm_config_groups[32] = {
617 d058fe03 Gerd Hoffmann
    &qemu_drive_opts,
618 191bc01b Gerd Hoffmann
    &qemu_chardev_opts,
619 f31d07d1 Gerd Hoffmann
    &qemu_device_opts,
620 a1ea458f Mark McLoughlin
    &qemu_netdev_opts,
621 8119b33d Mark McLoughlin
    &qemu_net_opts,
622 5fdfbf7e Jan Kiszka
    &qemu_rtc_opts,
623 d0fef6fb Gerd Hoffmann
    &qemu_global_opts,
624 88589343 Gerd Hoffmann
    &qemu_mon_opts,
625 b5ec5ce0 john cooper
    &qemu_cpudef_opts,
626 ab6540d5 Prerna Saxena
    &qemu_trace_opts,
627 2e55e842 Gleb Natapov
    &qemu_option_rom_opts,
628 303d4e86 Anthony PERARD
    &qemu_machine_opts,
629 3d3b8303 wayne
    &qemu_boot_opts,
630 f9dadc98 Ronnie Sahlberg
    &qemu_iscsi_opts,
631 d058fe03 Gerd Hoffmann
    NULL,
632 d058fe03 Gerd Hoffmann
};
633 d058fe03 Gerd Hoffmann
634 490b648e Kevin Wolf
static QemuOptsList *find_list(QemuOptsList **lists, const char *group)
635 ddc97855 Gerd Hoffmann
{
636 ddc97855 Gerd Hoffmann
    int i;
637 ddc97855 Gerd Hoffmann
638 ddc97855 Gerd Hoffmann
    for (i = 0; lists[i] != NULL; i++) {
639 ddc97855 Gerd Hoffmann
        if (strcmp(lists[i]->name, group) == 0)
640 ddc97855 Gerd Hoffmann
            break;
641 ddc97855 Gerd Hoffmann
    }
642 ddc97855 Gerd Hoffmann
    if (lists[i] == NULL) {
643 1ecda02b Markus Armbruster
        error_report("there is no option group \"%s\"", group);
644 ddc97855 Gerd Hoffmann
    }
645 ddc97855 Gerd Hoffmann
    return lists[i];
646 ddc97855 Gerd Hoffmann
}
647 ddc97855 Gerd Hoffmann
648 490b648e Kevin Wolf
QemuOptsList *qemu_find_opts(const char *group)
649 490b648e Kevin Wolf
{
650 490b648e Kevin Wolf
    return find_list(vm_config_groups, group);
651 490b648e Kevin Wolf
}
652 490b648e Kevin Wolf
653 dfe795e7 Gerd Hoffmann
void qemu_add_opts(QemuOptsList *list)
654 dfe795e7 Gerd Hoffmann
{
655 dfe795e7 Gerd Hoffmann
    int entries, i;
656 dfe795e7 Gerd Hoffmann
657 dfe795e7 Gerd Hoffmann
    entries = ARRAY_SIZE(vm_config_groups);
658 dfe795e7 Gerd Hoffmann
    entries--; /* keep list NULL terminated */
659 dfe795e7 Gerd Hoffmann
    for (i = 0; i < entries; i++) {
660 dfe795e7 Gerd Hoffmann
        if (vm_config_groups[i] == NULL) {
661 dfe795e7 Gerd Hoffmann
            vm_config_groups[i] = list;
662 dfe795e7 Gerd Hoffmann
            return;
663 dfe795e7 Gerd Hoffmann
        }
664 dfe795e7 Gerd Hoffmann
    }
665 dfe795e7 Gerd Hoffmann
    fprintf(stderr, "ran out of space in vm_config_groups");
666 dfe795e7 Gerd Hoffmann
    abort();
667 dfe795e7 Gerd Hoffmann
}
668 dfe795e7 Gerd Hoffmann
669 d058fe03 Gerd Hoffmann
int qemu_set_option(const char *str)
670 d058fe03 Gerd Hoffmann
{
671 d058fe03 Gerd Hoffmann
    char group[64], id[64], arg[64];
672 ddc97855 Gerd Hoffmann
    QemuOptsList *list;
673 d058fe03 Gerd Hoffmann
    QemuOpts *opts;
674 ddc97855 Gerd Hoffmann
    int rc, offset;
675 d058fe03 Gerd Hoffmann
676 d058fe03 Gerd Hoffmann
    rc = sscanf(str, "%63[^.].%63[^.].%63[^=]%n", group, id, arg, &offset);
677 d058fe03 Gerd Hoffmann
    if (rc < 3 || str[offset] != '=') {
678 1ecda02b Markus Armbruster
        error_report("can't parse: \"%s\"", str);
679 d058fe03 Gerd Hoffmann
        return -1;
680 d058fe03 Gerd Hoffmann
    }
681 d058fe03 Gerd Hoffmann
682 304329ee Markus Armbruster
    list = qemu_find_opts(group);
683 ddc97855 Gerd Hoffmann
    if (list == NULL) {
684 d058fe03 Gerd Hoffmann
        return -1;
685 d058fe03 Gerd Hoffmann
    }
686 d058fe03 Gerd Hoffmann
687 ddc97855 Gerd Hoffmann
    opts = qemu_opts_find(list, id);
688 d058fe03 Gerd Hoffmann
    if (!opts) {
689 1ecda02b Markus Armbruster
        error_report("there is no %s \"%s\" defined",
690 1ecda02b Markus Armbruster
                     list->name, id);
691 d058fe03 Gerd Hoffmann
        return -1;
692 d058fe03 Gerd Hoffmann
    }
693 d058fe03 Gerd Hoffmann
694 3df04ac3 Mark McLoughlin
    if (qemu_opt_set(opts, arg, str+offset+1) == -1) {
695 d058fe03 Gerd Hoffmann
        return -1;
696 d058fe03 Gerd Hoffmann
    }
697 d058fe03 Gerd Hoffmann
    return 0;
698 d058fe03 Gerd Hoffmann
}
699 d058fe03 Gerd Hoffmann
700 d0fef6fb Gerd Hoffmann
int qemu_global_option(const char *str)
701 d0fef6fb Gerd Hoffmann
{
702 d0fef6fb Gerd Hoffmann
    char driver[64], property[64];
703 d0fef6fb Gerd Hoffmann
    QemuOpts *opts;
704 d0fef6fb Gerd Hoffmann
    int rc, offset;
705 d0fef6fb Gerd Hoffmann
706 d0fef6fb Gerd Hoffmann
    rc = sscanf(str, "%63[^.].%63[^=]%n", driver, property, &offset);
707 d0fef6fb Gerd Hoffmann
    if (rc < 2 || str[offset] != '=') {
708 1ecda02b Markus Armbruster
        error_report("can't parse: \"%s\"", str);
709 d0fef6fb Gerd Hoffmann
        return -1;
710 d0fef6fb Gerd Hoffmann
    }
711 d0fef6fb Gerd Hoffmann
712 d0fef6fb Gerd Hoffmann
    opts = qemu_opts_create(&qemu_global_opts, NULL, 0);
713 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "driver", driver);
714 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "property", property);
715 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "value", str+offset+1);
716 d0fef6fb Gerd Hoffmann
    return 0;
717 d0fef6fb Gerd Hoffmann
}
718 d0fef6fb Gerd Hoffmann
719 9d993394 Gerd Hoffmann
struct ConfigWriteData {
720 9d993394 Gerd Hoffmann
    QemuOptsList *list;
721 9d993394 Gerd Hoffmann
    FILE *fp;
722 9d993394 Gerd Hoffmann
};
723 9d993394 Gerd Hoffmann
724 9d993394 Gerd Hoffmann
static int config_write_opt(const char *name, const char *value, void *opaque)
725 9d993394 Gerd Hoffmann
{
726 9d993394 Gerd Hoffmann
    struct ConfigWriteData *data = opaque;
727 9d993394 Gerd Hoffmann
728 9d993394 Gerd Hoffmann
    fprintf(data->fp, "  %s = \"%s\"\n", name, value);
729 9d993394 Gerd Hoffmann
    return 0;
730 9d993394 Gerd Hoffmann
}
731 9d993394 Gerd Hoffmann
732 9d993394 Gerd Hoffmann
static int config_write_opts(QemuOpts *opts, void *opaque)
733 9d993394 Gerd Hoffmann
{
734 9d993394 Gerd Hoffmann
    struct ConfigWriteData *data = opaque;
735 9d993394 Gerd Hoffmann
    const char *id = qemu_opts_id(opts);
736 9d993394 Gerd Hoffmann
737 9d993394 Gerd Hoffmann
    if (id) {
738 9d993394 Gerd Hoffmann
        fprintf(data->fp, "[%s \"%s\"]\n", data->list->name, id);
739 9d993394 Gerd Hoffmann
    } else {
740 9d993394 Gerd Hoffmann
        fprintf(data->fp, "[%s]\n", data->list->name);
741 9d993394 Gerd Hoffmann
    }
742 9d993394 Gerd Hoffmann
    qemu_opt_foreach(opts, config_write_opt, data, 0);
743 9d993394 Gerd Hoffmann
    fprintf(data->fp, "\n");
744 9d993394 Gerd Hoffmann
    return 0;
745 9d993394 Gerd Hoffmann
}
746 9d993394 Gerd Hoffmann
747 9d993394 Gerd Hoffmann
void qemu_config_write(FILE *fp)
748 9d993394 Gerd Hoffmann
{
749 9d993394 Gerd Hoffmann
    struct ConfigWriteData data = { .fp = fp };
750 490b648e Kevin Wolf
    QemuOptsList **lists = vm_config_groups;
751 9d993394 Gerd Hoffmann
    int i;
752 9d993394 Gerd Hoffmann
753 9d993394 Gerd Hoffmann
    fprintf(fp, "# qemu config file\n\n");
754 9d993394 Gerd Hoffmann
    for (i = 0; lists[i] != NULL; i++) {
755 9d993394 Gerd Hoffmann
        data.list = lists[i];
756 9d993394 Gerd Hoffmann
        qemu_opts_foreach(data.list, config_write_opts, &data, 0);
757 9d993394 Gerd Hoffmann
    }
758 9d993394 Gerd Hoffmann
}
759 42262ba8 Gerd Hoffmann
760 490b648e Kevin Wolf
int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
761 42262ba8 Gerd Hoffmann
{
762 42262ba8 Gerd Hoffmann
    char line[1024], group[64], id[64], arg[64], value[1024];
763 cf5a65aa Markus Armbruster
    Location loc;
764 42262ba8 Gerd Hoffmann
    QemuOptsList *list = NULL;
765 42262ba8 Gerd Hoffmann
    QemuOpts *opts = NULL;
766 cf5a65aa Markus Armbruster
    int res = -1, lno = 0;
767 42262ba8 Gerd Hoffmann
768 cf5a65aa Markus Armbruster
    loc_push_none(&loc);
769 42262ba8 Gerd Hoffmann
    while (fgets(line, sizeof(line), fp) != NULL) {
770 cf5a65aa Markus Armbruster
        loc_set_file(fname, ++lno);
771 42262ba8 Gerd Hoffmann
        if (line[0] == '\n') {
772 42262ba8 Gerd Hoffmann
            /* skip empty lines */
773 42262ba8 Gerd Hoffmann
            continue;
774 42262ba8 Gerd Hoffmann
        }
775 42262ba8 Gerd Hoffmann
        if (line[0] == '#') {
776 42262ba8 Gerd Hoffmann
            /* comment */
777 42262ba8 Gerd Hoffmann
            continue;
778 42262ba8 Gerd Hoffmann
        }
779 42262ba8 Gerd Hoffmann
        if (sscanf(line, "[%63s \"%63[^\"]\"]", group, id) == 2) {
780 42262ba8 Gerd Hoffmann
            /* group with id */
781 490b648e Kevin Wolf
            list = find_list(lists, group);
782 42262ba8 Gerd Hoffmann
            if (list == NULL)
783 cf5a65aa Markus Armbruster
                goto out;
784 42262ba8 Gerd Hoffmann
            opts = qemu_opts_create(list, id, 1);
785 42262ba8 Gerd Hoffmann
            continue;
786 42262ba8 Gerd Hoffmann
        }
787 42262ba8 Gerd Hoffmann
        if (sscanf(line, "[%63[^]]]", group) == 1) {
788 42262ba8 Gerd Hoffmann
            /* group without id */
789 490b648e Kevin Wolf
            list = find_list(lists, group);
790 42262ba8 Gerd Hoffmann
            if (list == NULL)
791 cf5a65aa Markus Armbruster
                goto out;
792 42262ba8 Gerd Hoffmann
            opts = qemu_opts_create(list, NULL, 0);
793 42262ba8 Gerd Hoffmann
            continue;
794 42262ba8 Gerd Hoffmann
        }
795 42262ba8 Gerd Hoffmann
        if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) {
796 42262ba8 Gerd Hoffmann
            /* arg = value */
797 42262ba8 Gerd Hoffmann
            if (opts == NULL) {
798 cf5a65aa Markus Armbruster
                error_report("no group defined");
799 cf5a65aa Markus Armbruster
                goto out;
800 42262ba8 Gerd Hoffmann
            }
801 42262ba8 Gerd Hoffmann
            if (qemu_opt_set(opts, arg, value) != 0) {
802 cf5a65aa Markus Armbruster
                goto out;
803 42262ba8 Gerd Hoffmann
            }
804 42262ba8 Gerd Hoffmann
            continue;
805 42262ba8 Gerd Hoffmann
        }
806 cf5a65aa Markus Armbruster
        error_report("parse error");
807 cf5a65aa Markus Armbruster
        goto out;
808 42262ba8 Gerd Hoffmann
    }
809 ef82516d Markus Armbruster
    if (ferror(fp)) {
810 ef82516d Markus Armbruster
        error_report("error reading file");
811 ef82516d Markus Armbruster
        goto out;
812 ef82516d Markus Armbruster
    }
813 cf5a65aa Markus Armbruster
    res = 0;
814 cf5a65aa Markus Armbruster
out:
815 cf5a65aa Markus Armbruster
    loc_pop(&loc);
816 cf5a65aa Markus Armbruster
    return res;
817 42262ba8 Gerd Hoffmann
}
818 dcfb0939 Kevin Wolf
819 dcfb0939 Kevin Wolf
int qemu_read_config_file(const char *filename)
820 dcfb0939 Kevin Wolf
{
821 dcfb0939 Kevin Wolf
    FILE *f = fopen(filename, "r");
822 019e78ba Kevin Wolf
    int ret;
823 019e78ba Kevin Wolf
824 dcfb0939 Kevin Wolf
    if (f == NULL) {
825 dcfb0939 Kevin Wolf
        return -errno;
826 dcfb0939 Kevin Wolf
    }
827 dcfb0939 Kevin Wolf
828 019e78ba Kevin Wolf
    ret = qemu_config_parse(f, vm_config_groups, filename);
829 dcfb0939 Kevin Wolf
    fclose(f);
830 dcfb0939 Kevin Wolf
831 019e78ba Kevin Wolf
    if (ret == 0) {
832 019e78ba Kevin Wolf
        return 0;
833 019e78ba Kevin Wolf
    } else {
834 019e78ba Kevin Wolf
        return -EINVAL;
835 019e78ba Kevin Wolf
    }
836 dcfb0939 Kevin Wolf
}