Statistics
| Branch: | Revision:

root / qemu-config.c @ 7bc3018b

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