Statistics
| Branch: | Revision:

root / qemu-config.c @ cb9c377f

History | View | Annotate | Download (23.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 0d92d17a Jan Kiszka
        },{
118 0d92d17a Jan Kiszka
            .name = "boot",
119 0d92d17a Jan Kiszka
            .type = QEMU_OPT_BOOL,
120 0d92d17a Jan Kiszka
            .help = "(deprecated, ignored)",
121 7282a033 Gerd Hoffmann
        },
122 26056e0c Jes Sorensen
        { /* end of list */ }
123 7282a033 Gerd Hoffmann
    },
124 7282a033 Gerd Hoffmann
};
125 7282a033 Gerd Hoffmann
126 f9dadc98 Ronnie Sahlberg
static QemuOptsList qemu_iscsi_opts = {
127 f9dadc98 Ronnie Sahlberg
    .name = "iscsi",
128 f9dadc98 Ronnie Sahlberg
    .head = QTAILQ_HEAD_INITIALIZER(qemu_iscsi_opts.head),
129 f9dadc98 Ronnie Sahlberg
    .desc = {
130 f9dadc98 Ronnie Sahlberg
        {
131 f9dadc98 Ronnie Sahlberg
            .name = "user",
132 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
133 f9dadc98 Ronnie Sahlberg
            .help = "username for CHAP authentication to target",
134 f9dadc98 Ronnie Sahlberg
        },{
135 f9dadc98 Ronnie Sahlberg
            .name = "password",
136 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
137 f9dadc98 Ronnie Sahlberg
            .help = "password for CHAP authentication to target",
138 f9dadc98 Ronnie Sahlberg
        },{
139 f9dadc98 Ronnie Sahlberg
            .name = "header-digest",
140 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
141 f9dadc98 Ronnie Sahlberg
            .help = "HeaderDigest setting. "
142 f9dadc98 Ronnie Sahlberg
                    "{CRC32C|CRC32C-NONE|NONE-CRC32C|NONE}",
143 f9dadc98 Ronnie Sahlberg
        },{
144 f9dadc98 Ronnie Sahlberg
            .name = "initiator-name",
145 f9dadc98 Ronnie Sahlberg
            .type = QEMU_OPT_STRING,
146 f9dadc98 Ronnie Sahlberg
            .help = "Initiator iqn name to use when connecting",
147 f9dadc98 Ronnie Sahlberg
        },
148 f9dadc98 Ronnie Sahlberg
        { /* end of list */ }
149 f9dadc98 Ronnie Sahlberg
    },
150 f9dadc98 Ronnie Sahlberg
};
151 f9dadc98 Ronnie Sahlberg
152 3329f07b Gerd Hoffmann
static QemuOptsList qemu_chardev_opts = {
153 191bc01b Gerd Hoffmann
    .name = "chardev",
154 8212c64f Markus Armbruster
    .implied_opt_name = "backend",
155 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_chardev_opts.head),
156 191bc01b Gerd Hoffmann
    .desc = {
157 7d31544f Gerd Hoffmann
        {
158 7d31544f Gerd Hoffmann
            .name = "backend",
159 7d31544f Gerd Hoffmann
            .type = QEMU_OPT_STRING,
160 7d31544f Gerd Hoffmann
        },{
161 7d31544f Gerd Hoffmann
            .name = "path",
162 7d31544f Gerd Hoffmann
            .type = QEMU_OPT_STRING,
163 aeb2c47a Gerd Hoffmann
        },{
164 aeb2c47a Gerd Hoffmann
            .name = "host",
165 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_STRING,
166 aeb2c47a Gerd Hoffmann
        },{
167 aeb2c47a Gerd Hoffmann
            .name = "port",
168 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_STRING,
169 aeb2c47a Gerd Hoffmann
        },{
170 7e1b35b4 Gerd Hoffmann
            .name = "localaddr",
171 7e1b35b4 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
172 7e1b35b4 Gerd Hoffmann
        },{
173 7e1b35b4 Gerd Hoffmann
            .name = "localport",
174 7e1b35b4 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
175 7e1b35b4 Gerd Hoffmann
        },{
176 aeb2c47a Gerd Hoffmann
            .name = "to",
177 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
178 aeb2c47a Gerd Hoffmann
        },{
179 aeb2c47a Gerd Hoffmann
            .name = "ipv4",
180 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
181 aeb2c47a Gerd Hoffmann
        },{
182 aeb2c47a Gerd Hoffmann
            .name = "ipv6",
183 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
184 aeb2c47a Gerd Hoffmann
        },{
185 aeb2c47a Gerd Hoffmann
            .name = "wait",
186 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
187 aeb2c47a Gerd Hoffmann
        },{
188 aeb2c47a Gerd Hoffmann
            .name = "server",
189 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
190 aeb2c47a Gerd Hoffmann
        },{
191 aeb2c47a Gerd Hoffmann
            .name = "delay",
192 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
193 aeb2c47a Gerd Hoffmann
        },{
194 aeb2c47a Gerd Hoffmann
            .name = "telnet",
195 aeb2c47a Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
196 6ea314d9 Gerd Hoffmann
        },{
197 6ea314d9 Gerd Hoffmann
            .name = "width",
198 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
199 6ea314d9 Gerd Hoffmann
        },{
200 6ea314d9 Gerd Hoffmann
            .name = "height",
201 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
202 6ea314d9 Gerd Hoffmann
        },{
203 6ea314d9 Gerd Hoffmann
            .name = "cols",
204 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
205 6ea314d9 Gerd Hoffmann
        },{
206 6ea314d9 Gerd Hoffmann
            .name = "rows",
207 6ea314d9 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
208 c845f401 Gerd Hoffmann
        },{
209 c845f401 Gerd Hoffmann
            .name = "mux",
210 c845f401 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
211 5989020b Kusanagi Kouichi
        },{
212 5989020b Kusanagi Kouichi
            .name = "signal",
213 5989020b Kusanagi Kouichi
            .type = QEMU_OPT_BOOL,
214 cbcc6336 Alon Levy
        },{
215 cbcc6336 Alon Levy
            .name = "name",
216 cbcc6336 Alon Levy
            .type = QEMU_OPT_STRING,
217 cbcc6336 Alon Levy
        },{
218 cbcc6336 Alon Levy
            .name = "debug",
219 cbcc6336 Alon Levy
            .type = QEMU_OPT_NUMBER,
220 7d31544f Gerd Hoffmann
        },
221 26056e0c Jes Sorensen
        { /* end of list */ }
222 191bc01b Gerd Hoffmann
    },
223 191bc01b Gerd Hoffmann
};
224 191bc01b Gerd Hoffmann
225 74db920c Gautham R Shenoy
QemuOptsList qemu_fsdev_opts = {
226 74db920c Gautham R Shenoy
    .name = "fsdev",
227 fbcbf101 Aneesh Kumar K.V
    .implied_opt_name = "fsdriver",
228 74db920c Gautham R Shenoy
    .head = QTAILQ_HEAD_INITIALIZER(qemu_fsdev_opts.head),
229 74db920c Gautham R Shenoy
    .desc = {
230 74db920c Gautham R Shenoy
        {
231 fbcbf101 Aneesh Kumar K.V
            .name = "fsdriver",
232 74db920c Gautham R Shenoy
            .type = QEMU_OPT_STRING,
233 74db920c Gautham R Shenoy
        }, {
234 74db920c Gautham R Shenoy
            .name = "path",
235 74db920c Gautham R Shenoy
            .type = QEMU_OPT_STRING,
236 9ce56db6 Venkateswararao Jujjuri (JV)
        }, {
237 9ce56db6 Venkateswararao Jujjuri (JV)
            .name = "security_model",
238 9ce56db6 Venkateswararao Jujjuri (JV)
            .type = QEMU_OPT_STRING,
239 d3ab98e6 Aneesh Kumar K.V
        }, {
240 d3ab98e6 Aneesh Kumar K.V
            .name = "writeout",
241 d3ab98e6 Aneesh Kumar K.V
            .type = QEMU_OPT_STRING,
242 2c74c2cb M. Mohan Kumar
        }, {
243 2c74c2cb M. Mohan Kumar
            .name = "readonly",
244 2c74c2cb M. Mohan Kumar
            .type = QEMU_OPT_BOOL,
245 84a87cc4 M. Mohan Kumar
246 84a87cc4 M. Mohan Kumar
        }, {
247 84a87cc4 M. Mohan Kumar
            .name = "socket",
248 84a87cc4 M. Mohan Kumar
            .type = QEMU_OPT_STRING,
249 4c793dda M. Mohan Kumar
        }, {
250 4c793dda M. Mohan Kumar
            .name = "sock_fd",
251 4c793dda M. Mohan Kumar
            .type = QEMU_OPT_NUMBER,
252 74db920c Gautham R Shenoy
        },
253 2c74c2cb M. Mohan Kumar
254 74db920c Gautham R Shenoy
        { /*End of list */ }
255 74db920c Gautham R Shenoy
    },
256 74db920c Gautham R Shenoy
};
257 74db920c Gautham R Shenoy
258 3d54abc7 Gautham R Shenoy
QemuOptsList qemu_virtfs_opts = {
259 3d54abc7 Gautham R Shenoy
    .name = "virtfs",
260 fbcbf101 Aneesh Kumar K.V
    .implied_opt_name = "fsdriver",
261 3d54abc7 Gautham R Shenoy
    .head = QTAILQ_HEAD_INITIALIZER(qemu_virtfs_opts.head),
262 3d54abc7 Gautham R Shenoy
    .desc = {
263 3d54abc7 Gautham R Shenoy
        {
264 fbcbf101 Aneesh Kumar K.V
            .name = "fsdriver",
265 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
266 3d54abc7 Gautham R Shenoy
        }, {
267 3d54abc7 Gautham R Shenoy
            .name = "path",
268 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
269 3d54abc7 Gautham R Shenoy
        }, {
270 3d54abc7 Gautham R Shenoy
            .name = "mount_tag",
271 3d54abc7 Gautham R Shenoy
            .type = QEMU_OPT_STRING,
272 9ce56db6 Venkateswararao Jujjuri (JV)
        }, {
273 9ce56db6 Venkateswararao Jujjuri (JV)
            .name = "security_model",
274 9ce56db6 Venkateswararao Jujjuri (JV)
            .type = QEMU_OPT_STRING,
275 d3ab98e6 Aneesh Kumar K.V
        }, {
276 d3ab98e6 Aneesh Kumar K.V
            .name = "writeout",
277 d3ab98e6 Aneesh Kumar K.V
            .type = QEMU_OPT_STRING,
278 2c74c2cb M. Mohan Kumar
        }, {
279 2c74c2cb M. Mohan Kumar
            .name = "readonly",
280 2c74c2cb M. Mohan Kumar
            .type = QEMU_OPT_BOOL,
281 4c793dda M. Mohan Kumar
        }, {
282 84a87cc4 M. Mohan Kumar
            .name = "socket",
283 84a87cc4 M. Mohan Kumar
            .type = QEMU_OPT_STRING,
284 84a87cc4 M. Mohan Kumar
        }, {
285 4c793dda M. Mohan Kumar
            .name = "sock_fd",
286 4c793dda M. Mohan Kumar
            .type = QEMU_OPT_NUMBER,
287 3d54abc7 Gautham R Shenoy
        },
288 3d54abc7 Gautham R Shenoy
289 3d54abc7 Gautham R Shenoy
        { /*End of list */ }
290 3d54abc7 Gautham R Shenoy
    },
291 3d54abc7 Gautham R Shenoy
};
292 3d54abc7 Gautham R Shenoy
293 3329f07b Gerd Hoffmann
static QemuOptsList qemu_device_opts = {
294 f31d07d1 Gerd Hoffmann
    .name = "device",
295 8212c64f Markus Armbruster
    .implied_opt_name = "driver",
296 72cf2d4f Blue Swirl
    .head = QTAILQ_HEAD_INITIALIZER(qemu_device_opts.head),
297 f31d07d1 Gerd Hoffmann
    .desc = {
298 f31d07d1 Gerd Hoffmann
        /*
299 f31d07d1 Gerd Hoffmann
         * no elements => accept any
300 f31d07d1 Gerd Hoffmann
         * sanity checking will happen later
301 f31d07d1 Gerd Hoffmann
         * when setting device properties
302 f31d07d1 Gerd Hoffmann
         */
303 26056e0c Jes Sorensen
        { /* end of list */ }
304 f31d07d1 Gerd Hoffmann
    },
305 f31d07d1 Gerd Hoffmann
};
306 f31d07d1 Gerd Hoffmann
307 3329f07b Gerd Hoffmann
static QemuOptsList qemu_netdev_opts = {
308 a1ea458f Mark McLoughlin
    .name = "netdev",
309 8212c64f Markus Armbruster
    .implied_opt_name = "type",
310 a1ea458f Mark McLoughlin
    .head = QTAILQ_HEAD_INITIALIZER(qemu_netdev_opts.head),
311 a1ea458f Mark McLoughlin
    .desc = {
312 a1ea458f Mark McLoughlin
        /*
313 a1ea458f Mark McLoughlin
         * no elements => accept any params
314 a1ea458f Mark McLoughlin
         * validation will happen later
315 a1ea458f Mark McLoughlin
         */
316 a1ea458f Mark McLoughlin
        { /* end of list */ }
317 a1ea458f Mark McLoughlin
    },
318 a1ea458f Mark McLoughlin
};
319 a1ea458f Mark McLoughlin
320 3329f07b Gerd Hoffmann
static QemuOptsList qemu_net_opts = {
321 8119b33d Mark McLoughlin
    .name = "net",
322 8212c64f Markus Armbruster
    .implied_opt_name = "type",
323 8119b33d Mark McLoughlin
    .head = QTAILQ_HEAD_INITIALIZER(qemu_net_opts.head),
324 8119b33d Mark McLoughlin
    .desc = {
325 8119b33d Mark McLoughlin
        /*
326 8119b33d Mark McLoughlin
         * no elements => accept any params
327 8119b33d Mark McLoughlin
         * validation will happen later
328 8119b33d Mark McLoughlin
         */
329 8119b33d Mark McLoughlin
        { /* end of list */ }
330 8119b33d Mark McLoughlin
    },
331 8119b33d Mark McLoughlin
};
332 8119b33d Mark McLoughlin
333 3329f07b Gerd Hoffmann
static QemuOptsList qemu_rtc_opts = {
334 1ed2fc1f Jan Kiszka
    .name = "rtc",
335 1ed2fc1f Jan Kiszka
    .head = QTAILQ_HEAD_INITIALIZER(qemu_rtc_opts.head),
336 1ed2fc1f Jan Kiszka
    .desc = {
337 1ed2fc1f Jan Kiszka
        {
338 1ed2fc1f Jan Kiszka
            .name = "base",
339 1ed2fc1f Jan Kiszka
            .type = QEMU_OPT_STRING,
340 6875204c Jan Kiszka
        },{
341 6875204c Jan Kiszka
            .name = "clock",
342 6875204c Jan Kiszka
            .type = QEMU_OPT_STRING,
343 1ed2fc1f Jan Kiszka
        },{
344 1ed2fc1f Jan Kiszka
            .name = "driftfix",
345 1ed2fc1f Jan Kiszka
            .type = QEMU_OPT_STRING,
346 1ed2fc1f Jan Kiszka
        },
347 26056e0c Jes Sorensen
        { /* end of list */ }
348 1ed2fc1f Jan Kiszka
    },
349 1ed2fc1f Jan Kiszka
};
350 1ed2fc1f Jan Kiszka
351 3329f07b Gerd Hoffmann
static QemuOptsList qemu_global_opts = {
352 d0fef6fb Gerd Hoffmann
    .name = "global",
353 d0fef6fb Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_global_opts.head),
354 d0fef6fb Gerd Hoffmann
    .desc = {
355 d0fef6fb Gerd Hoffmann
        {
356 d0fef6fb Gerd Hoffmann
            .name = "driver",
357 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
358 d0fef6fb Gerd Hoffmann
        },{
359 d0fef6fb Gerd Hoffmann
            .name = "property",
360 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
361 d0fef6fb Gerd Hoffmann
        },{
362 d0fef6fb Gerd Hoffmann
            .name = "value",
363 d0fef6fb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
364 d0fef6fb Gerd Hoffmann
        },
365 26056e0c Jes Sorensen
        { /* end of list */ }
366 d0fef6fb Gerd Hoffmann
    },
367 d0fef6fb Gerd Hoffmann
};
368 d0fef6fb Gerd Hoffmann
369 7d76ad4f Eduardo Otubo
QemuOptsList qemu_sandbox_opts = {
370 7d76ad4f Eduardo Otubo
    .name = "sandbox",
371 7d76ad4f Eduardo Otubo
    .implied_opt_name = "enable",
372 7d76ad4f Eduardo Otubo
    .head = QTAILQ_HEAD_INITIALIZER(qemu_sandbox_opts.head),
373 7d76ad4f Eduardo Otubo
    .desc = {
374 7d76ad4f Eduardo Otubo
        {
375 7d76ad4f Eduardo Otubo
            .name = "enable",
376 7d76ad4f Eduardo Otubo
            .type = QEMU_OPT_BOOL,
377 7d76ad4f Eduardo Otubo
        },
378 7d76ad4f Eduardo Otubo
        { /* end of list */ }
379 7d76ad4f Eduardo Otubo
    },
380 7d76ad4f Eduardo Otubo
};
381 7d76ad4f Eduardo Otubo
382 3329f07b Gerd Hoffmann
static QemuOptsList qemu_mon_opts = {
383 88589343 Gerd Hoffmann
    .name = "mon",
384 8212c64f Markus Armbruster
    .implied_opt_name = "chardev",
385 88589343 Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_mon_opts.head),
386 88589343 Gerd Hoffmann
    .desc = {
387 88589343 Gerd Hoffmann
        {
388 88589343 Gerd Hoffmann
            .name = "mode",
389 88589343 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
390 88589343 Gerd Hoffmann
        },{
391 88589343 Gerd Hoffmann
            .name = "chardev",
392 88589343 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
393 88589343 Gerd Hoffmann
        },{
394 88589343 Gerd Hoffmann
            .name = "default",
395 88589343 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
396 39eaab9a Daniel P. Berrange
        },{
397 39eaab9a Daniel P. Berrange
            .name = "pretty",
398 39eaab9a Daniel P. Berrange
            .type = QEMU_OPT_BOOL,
399 88589343 Gerd Hoffmann
        },
400 26056e0c Jes Sorensen
        { /* end of list */ }
401 88589343 Gerd Hoffmann
    },
402 88589343 Gerd Hoffmann
};
403 88589343 Gerd Hoffmann
404 ab6540d5 Prerna Saxena
static QemuOptsList qemu_trace_opts = {
405 ab6540d5 Prerna Saxena
    .name = "trace",
406 ab6540d5 Prerna Saxena
    .implied_opt_name = "trace",
407 ab6540d5 Prerna Saxena
    .head = QTAILQ_HEAD_INITIALIZER(qemu_trace_opts.head),
408 ab6540d5 Prerna Saxena
    .desc = {
409 ab6540d5 Prerna Saxena
        {
410 23d15e86 Lluรญs
            .name = "events",
411 23d15e86 Lluรญs
            .type = QEMU_OPT_STRING,
412 23d15e86 Lluรญs
        },{
413 ab6540d5 Prerna Saxena
            .name = "file",
414 ab6540d5 Prerna Saxena
            .type = QEMU_OPT_STRING,
415 ab6540d5 Prerna Saxena
        },
416 44bd6907 Gerd Hoffmann
        { /* end of list */ }
417 ab6540d5 Prerna Saxena
    },
418 ab6540d5 Prerna Saxena
};
419 ab6540d5 Prerna Saxena
420 29b0040b Gerd Hoffmann
QemuOptsList qemu_spice_opts = {
421 29b0040b Gerd Hoffmann
    .name = "spice",
422 29b0040b Gerd Hoffmann
    .head = QTAILQ_HEAD_INITIALIZER(qemu_spice_opts.head),
423 29b0040b Gerd Hoffmann
    .desc = {
424 29b0040b Gerd Hoffmann
        {
425 29b0040b Gerd Hoffmann
            .name = "port",
426 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
427 29b0040b Gerd Hoffmann
        },{
428 c448e855 Gerd Hoffmann
            .name = "tls-port",
429 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_NUMBER,
430 c448e855 Gerd Hoffmann
        },{
431 333b0eeb Gerd Hoffmann
            .name = "addr",
432 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_STRING,
433 333b0eeb Gerd Hoffmann
        },{
434 333b0eeb Gerd Hoffmann
            .name = "ipv4",
435 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
436 333b0eeb Gerd Hoffmann
        },{
437 333b0eeb Gerd Hoffmann
            .name = "ipv6",
438 333b0eeb Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
439 333b0eeb Gerd Hoffmann
        },{
440 29b0040b Gerd Hoffmann
            .name = "password",
441 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_STRING,
442 29b0040b Gerd Hoffmann
        },{
443 29b0040b Gerd Hoffmann
            .name = "disable-ticketing",
444 29b0040b Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
445 c448e855 Gerd Hoffmann
        },{
446 d4970b07 Hans de Goede
            .name = "disable-copy-paste",
447 d4970b07 Hans de Goede
            .type = QEMU_OPT_BOOL,
448 d4970b07 Hans de Goede
        },{
449 48b3ed0a Marc-Andrรฉ Lureau
            .name = "sasl",
450 48b3ed0a Marc-Andrรฉ Lureau
            .type = QEMU_OPT_BOOL,
451 48b3ed0a Marc-Andrรฉ Lureau
        },{
452 c448e855 Gerd Hoffmann
            .name = "x509-dir",
453 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
454 c448e855 Gerd Hoffmann
        },{
455 c448e855 Gerd Hoffmann
            .name = "x509-key-file",
456 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
457 c448e855 Gerd Hoffmann
        },{
458 c448e855 Gerd Hoffmann
            .name = "x509-key-password",
459 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
460 c448e855 Gerd Hoffmann
        },{
461 c448e855 Gerd Hoffmann
            .name = "x509-cert-file",
462 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
463 c448e855 Gerd Hoffmann
        },{
464 c448e855 Gerd Hoffmann
            .name = "x509-cacert-file",
465 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
466 c448e855 Gerd Hoffmann
        },{
467 c448e855 Gerd Hoffmann
            .name = "x509-dh-key-file",
468 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
469 c448e855 Gerd Hoffmann
        },{
470 c448e855 Gerd Hoffmann
            .name = "tls-ciphers",
471 c448e855 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
472 9f04e09e Yonit Halperin
        },{
473 17b6dea0 Gerd Hoffmann
            .name = "tls-channel",
474 17b6dea0 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
475 17b6dea0 Gerd Hoffmann
        },{
476 17b6dea0 Gerd Hoffmann
            .name = "plaintext-channel",
477 17b6dea0 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
478 17b6dea0 Gerd Hoffmann
        },{
479 9f04e09e Yonit Halperin
            .name = "image-compression",
480 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
481 9f04e09e Yonit Halperin
        },{
482 9f04e09e Yonit Halperin
            .name = "jpeg-wan-compression",
483 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
484 9f04e09e Yonit Halperin
        },{
485 9f04e09e Yonit Halperin
            .name = "zlib-glz-wan-compression",
486 9f04e09e Yonit Halperin
            .type = QEMU_OPT_STRING,
487 84a23f25 Gerd Hoffmann
        },{
488 84a23f25 Gerd Hoffmann
            .name = "streaming-video",
489 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_STRING,
490 84a23f25 Gerd Hoffmann
        },{
491 84a23f25 Gerd Hoffmann
            .name = "agent-mouse",
492 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
493 84a23f25 Gerd Hoffmann
        },{
494 84a23f25 Gerd Hoffmann
            .name = "playback-compression",
495 84a23f25 Gerd Hoffmann
            .type = QEMU_OPT_BOOL,
496 8c957053 Yonit Halperin
        }, {
497 8c957053 Yonit Halperin
            .name = "seamless-migration",
498 8c957053 Yonit Halperin
            .type = QEMU_OPT_BOOL,
499 29b0040b Gerd Hoffmann
        },
500 44bd6907 Gerd Hoffmann
        { /* end of list */ }
501 29b0040b Gerd Hoffmann
    },
502 29b0040b Gerd Hoffmann
};
503 29b0040b Gerd Hoffmann
504 2e55e842 Gleb Natapov
QemuOptsList qemu_option_rom_opts = {
505 2e55e842 Gleb Natapov
    .name = "option-rom",
506 2e55e842 Gleb Natapov
    .implied_opt_name = "romfile",
507 2e55e842 Gleb Natapov
    .head = QTAILQ_HEAD_INITIALIZER(qemu_option_rom_opts.head),
508 2e55e842 Gleb Natapov
    .desc = {
509 2e55e842 Gleb Natapov
        {
510 2e55e842 Gleb Natapov
            .name = "bootindex",
511 2e55e842 Gleb Natapov
            .type = QEMU_OPT_NUMBER,
512 2e55e842 Gleb Natapov
        }, {
513 2e55e842 Gleb Natapov
            .name = "romfile",
514 2e55e842 Gleb Natapov
            .type = QEMU_OPT_STRING,
515 2e55e842 Gleb Natapov
        },
516 44bd6907 Gerd Hoffmann
        { /* end of list */ }
517 2e55e842 Gleb Natapov
    },
518 2e55e842 Gleb Natapov
};
519 2e55e842 Gleb Natapov
520 303d4e86 Anthony PERARD
static QemuOptsList qemu_machine_opts = {
521 303d4e86 Anthony PERARD
    .name = "machine",
522 9052ea6b Jan Kiszka
    .implied_opt_name = "type",
523 9de36b1a Peter Maydell
    .merge_lists = true,
524 303d4e86 Anthony PERARD
    .head = QTAILQ_HEAD_INITIALIZER(qemu_machine_opts.head),
525 303d4e86 Anthony PERARD
    .desc = {
526 303d4e86 Anthony PERARD
        {
527 9052ea6b Jan Kiszka
            .name = "type",
528 9052ea6b Jan Kiszka
            .type = QEMU_OPT_STRING,
529 9052ea6b Jan Kiszka
            .help = "emulated machine"
530 9052ea6b Jan Kiszka
        }, {
531 303d4e86 Anthony PERARD
            .name = "accel",
532 303d4e86 Anthony PERARD
            .type = QEMU_OPT_STRING,
533 303d4e86 Anthony PERARD
            .help = "accelerator list",
534 6a48ffaa Jan Kiszka
        }, {
535 6a48ffaa Jan Kiszka
            .name = "kernel_irqchip",
536 6a48ffaa Jan Kiszka
            .type = QEMU_OPT_BOOL,
537 6a48ffaa Jan Kiszka
            .help = "use KVM in-kernel irqchip",
538 39d6960a Jan Kiszka
        }, {
539 39d6960a Jan Kiszka
            .name = "kvm_shadow_mem",
540 39d6960a Jan Kiszka
            .type = QEMU_OPT_SIZE,
541 39d6960a Jan Kiszka
            .help = "KVM shadow MMU size",
542 a0abe474 Peter Maydell
        }, {
543 a0abe474 Peter Maydell
            .name = "kernel",
544 a0abe474 Peter Maydell
            .type = QEMU_OPT_STRING,
545 a0abe474 Peter Maydell
            .help = "Linux kernel image file",
546 a0abe474 Peter Maydell
        }, {
547 a0abe474 Peter Maydell
            .name = "initrd",
548 a0abe474 Peter Maydell
            .type = QEMU_OPT_STRING,
549 a0abe474 Peter Maydell
            .help = "Linux initial ramdisk file",
550 a0abe474 Peter Maydell
        }, {
551 a0abe474 Peter Maydell
            .name = "append",
552 a0abe474 Peter Maydell
            .type = QEMU_OPT_STRING,
553 a0abe474 Peter Maydell
            .help = "Linux kernel command line",
554 412beee6 Grant Likely
        }, {
555 412beee6 Grant Likely
            .name = "dtb",
556 412beee6 Grant Likely
            .type = QEMU_OPT_STRING,
557 412beee6 Grant Likely
            .help = "Linux kernel device tree file",
558 25b42708 Alexander Graf
        }, {
559 25b42708 Alexander Graf
            .name = "dumpdtb",
560 25b42708 Alexander Graf
            .type = QEMU_OPT_STRING,
561 25b42708 Alexander Graf
            .help = "Dump current dtb to a file and quit",
562 4b1b1c89 Alexander Graf
        }, {
563 4b1b1c89 Alexander Graf
            .name = "phandle_start",
564 4b1b1c89 Alexander Graf
            .type = QEMU_OPT_STRING,
565 4b1b1c89 Alexander Graf
            .help = "The first phandle ID we may generate dynamically",
566 caedc737 Alexander Graf
        }, {
567 caedc737 Alexander Graf
            .name = "dt_compatible",
568 caedc737 Alexander Graf
            .type = QEMU_OPT_STRING,
569 caedc737 Alexander Graf
            .help = "Overrides the \"compatible\" property of the dt root node",
570 ddb97f1d Jason Baron
        }, {
571 ddb97f1d Jason Baron
            .name = "dump-guest-core",
572 ddb97f1d Jason Baron
            .type = QEMU_OPT_BOOL,
573 ddb97f1d Jason Baron
            .help = "Include guest memory in  a core dump",
574 8490fc78 Luiz Capitulino
        }, {
575 8490fc78 Luiz Capitulino
            .name = "mem-merge",
576 8490fc78 Luiz Capitulino
            .type = QEMU_OPT_BOOL,
577 8490fc78 Luiz Capitulino
            .help = "enable/disable memory merge support",
578 094b287f zhlcindy@gmail.com
        },{
579 094b287f zhlcindy@gmail.com
            .name = "usb",
580 094b287f zhlcindy@gmail.com
            .type = QEMU_OPT_BOOL,
581 094b287f zhlcindy@gmail.com
            .help = "Set on/off to enable/disable usb",
582 639e8102 David Gibson
        }, {
583 639e8102 David Gibson
            .name = "nvram",
584 639e8102 David Gibson
            .type = QEMU_OPT_STRING,
585 639e8102 David Gibson
            .help = "Drive backing persistent NVRAM",
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 ac05f349 Amos Kong
        }, {
613 ac05f349 Amos Kong
            .name = "reboot-timeout",
614 ac05f349 Amos Kong
            .type = QEMU_OPT_STRING,
615 3d3b8303 wayne
        },
616 3d3b8303 wayne
        { /*End of list */ }
617 3d3b8303 wayne
    },
618 3d3b8303 wayne
};
619 3d3b8303 wayne
620 587ed6be Corey Bryant
static QemuOptsList qemu_add_fd_opts = {
621 587ed6be Corey Bryant
    .name = "add-fd",
622 587ed6be Corey Bryant
    .head = QTAILQ_HEAD_INITIALIZER(qemu_add_fd_opts.head),
623 587ed6be Corey Bryant
    .desc = {
624 587ed6be Corey Bryant
        {
625 587ed6be Corey Bryant
            .name = "fd",
626 587ed6be Corey Bryant
            .type = QEMU_OPT_NUMBER,
627 587ed6be Corey Bryant
            .help = "file descriptor of which a duplicate is added to fd set",
628 587ed6be Corey Bryant
        },{
629 587ed6be Corey Bryant
            .name = "set",
630 587ed6be Corey Bryant
            .type = QEMU_OPT_NUMBER,
631 587ed6be Corey Bryant
            .help = "ID of the fd set to add fd to",
632 587ed6be Corey Bryant
        },{
633 587ed6be Corey Bryant
            .name = "opaque",
634 587ed6be Corey Bryant
            .type = QEMU_OPT_STRING,
635 587ed6be Corey Bryant
            .help = "free-form string used to describe fd",
636 587ed6be Corey Bryant
        },
637 587ed6be Corey Bryant
        { /* end of list */ }
638 587ed6be Corey Bryant
    },
639 587ed6be Corey Bryant
};
640 587ed6be Corey Bryant
641 68d98d3e Anthony Liguori
static QemuOptsList qemu_object_opts = {
642 68d98d3e Anthony Liguori
    .name = "object",
643 68d98d3e Anthony Liguori
    .implied_opt_name = "qom-type",
644 68d98d3e Anthony Liguori
    .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head),
645 68d98d3e Anthony Liguori
    .desc = {
646 68d98d3e Anthony Liguori
        { }
647 68d98d3e Anthony Liguori
    },
648 68d98d3e Anthony Liguori
};
649 68d98d3e Anthony Liguori
650 dfe795e7 Gerd Hoffmann
static QemuOptsList *vm_config_groups[32] = {
651 d058fe03 Gerd Hoffmann
    &qemu_drive_opts,
652 191bc01b Gerd Hoffmann
    &qemu_chardev_opts,
653 f31d07d1 Gerd Hoffmann
    &qemu_device_opts,
654 a1ea458f Mark McLoughlin
    &qemu_netdev_opts,
655 8119b33d Mark McLoughlin
    &qemu_net_opts,
656 5fdfbf7e Jan Kiszka
    &qemu_rtc_opts,
657 d0fef6fb Gerd Hoffmann
    &qemu_global_opts,
658 88589343 Gerd Hoffmann
    &qemu_mon_opts,
659 ab6540d5 Prerna Saxena
    &qemu_trace_opts,
660 2e55e842 Gleb Natapov
    &qemu_option_rom_opts,
661 303d4e86 Anthony PERARD
    &qemu_machine_opts,
662 3d3b8303 wayne
    &qemu_boot_opts,
663 f9dadc98 Ronnie Sahlberg
    &qemu_iscsi_opts,
664 7d76ad4f Eduardo Otubo
    &qemu_sandbox_opts,
665 587ed6be Corey Bryant
    &qemu_add_fd_opts,
666 68d98d3e Anthony Liguori
    &qemu_object_opts,
667 d058fe03 Gerd Hoffmann
    NULL,
668 d058fe03 Gerd Hoffmann
};
669 d058fe03 Gerd Hoffmann
670 2ac20613 Luiz Capitulino
static QemuOptsList *find_list(QemuOptsList **lists, const char *group,
671 2ac20613 Luiz Capitulino
                               Error **errp)
672 ddc97855 Gerd Hoffmann
{
673 ddc97855 Gerd Hoffmann
    int i;
674 ddc97855 Gerd Hoffmann
675 ddc97855 Gerd Hoffmann
    for (i = 0; lists[i] != NULL; i++) {
676 ddc97855 Gerd Hoffmann
        if (strcmp(lists[i]->name, group) == 0)
677 ddc97855 Gerd Hoffmann
            break;
678 ddc97855 Gerd Hoffmann
    }
679 ddc97855 Gerd Hoffmann
    if (lists[i] == NULL) {
680 2ac20613 Luiz Capitulino
        error_set(errp, QERR_INVALID_OPTION_GROUP, group);
681 ddc97855 Gerd Hoffmann
    }
682 ddc97855 Gerd Hoffmann
    return lists[i];
683 ddc97855 Gerd Hoffmann
}
684 ddc97855 Gerd Hoffmann
685 490b648e Kevin Wolf
QemuOptsList *qemu_find_opts(const char *group)
686 490b648e Kevin Wolf
{
687 2ac20613 Luiz Capitulino
    QemuOptsList *ret;
688 2ac20613 Luiz Capitulino
    Error *local_err = NULL;
689 2ac20613 Luiz Capitulino
690 2ac20613 Luiz Capitulino
    ret = find_list(vm_config_groups, group, &local_err);
691 2ac20613 Luiz Capitulino
    if (error_is_set(&local_err)) {
692 2ac20613 Luiz Capitulino
        error_report("%s\n", error_get_pretty(local_err));
693 2ac20613 Luiz Capitulino
        error_free(local_err);
694 2ac20613 Luiz Capitulino
    }
695 2ac20613 Luiz Capitulino
696 2ac20613 Luiz Capitulino
    return ret;
697 490b648e Kevin Wolf
}
698 490b648e Kevin Wolf
699 60d5666f Luiz Capitulino
QemuOptsList *qemu_find_opts_err(const char *group, Error **errp)
700 60d5666f Luiz Capitulino
{
701 60d5666f Luiz Capitulino
    return find_list(vm_config_groups, group, errp);
702 60d5666f Luiz Capitulino
}
703 60d5666f Luiz Capitulino
704 dfe795e7 Gerd Hoffmann
void qemu_add_opts(QemuOptsList *list)
705 dfe795e7 Gerd Hoffmann
{
706 dfe795e7 Gerd Hoffmann
    int entries, i;
707 dfe795e7 Gerd Hoffmann
708 dfe795e7 Gerd Hoffmann
    entries = ARRAY_SIZE(vm_config_groups);
709 dfe795e7 Gerd Hoffmann
    entries--; /* keep list NULL terminated */
710 dfe795e7 Gerd Hoffmann
    for (i = 0; i < entries; i++) {
711 dfe795e7 Gerd Hoffmann
        if (vm_config_groups[i] == NULL) {
712 dfe795e7 Gerd Hoffmann
            vm_config_groups[i] = list;
713 dfe795e7 Gerd Hoffmann
            return;
714 dfe795e7 Gerd Hoffmann
        }
715 dfe795e7 Gerd Hoffmann
    }
716 dfe795e7 Gerd Hoffmann
    fprintf(stderr, "ran out of space in vm_config_groups");
717 dfe795e7 Gerd Hoffmann
    abort();
718 dfe795e7 Gerd Hoffmann
}
719 dfe795e7 Gerd Hoffmann
720 d058fe03 Gerd Hoffmann
int qemu_set_option(const char *str)
721 d058fe03 Gerd Hoffmann
{
722 d058fe03 Gerd Hoffmann
    char group[64], id[64], arg[64];
723 ddc97855 Gerd Hoffmann
    QemuOptsList *list;
724 d058fe03 Gerd Hoffmann
    QemuOpts *opts;
725 ddc97855 Gerd Hoffmann
    int rc, offset;
726 d058fe03 Gerd Hoffmann
727 d058fe03 Gerd Hoffmann
    rc = sscanf(str, "%63[^.].%63[^.].%63[^=]%n", group, id, arg, &offset);
728 d058fe03 Gerd Hoffmann
    if (rc < 3 || str[offset] != '=') {
729 1ecda02b Markus Armbruster
        error_report("can't parse: \"%s\"", str);
730 d058fe03 Gerd Hoffmann
        return -1;
731 d058fe03 Gerd Hoffmann
    }
732 d058fe03 Gerd Hoffmann
733 304329ee Markus Armbruster
    list = qemu_find_opts(group);
734 ddc97855 Gerd Hoffmann
    if (list == NULL) {
735 d058fe03 Gerd Hoffmann
        return -1;
736 d058fe03 Gerd Hoffmann
    }
737 d058fe03 Gerd Hoffmann
738 ddc97855 Gerd Hoffmann
    opts = qemu_opts_find(list, id);
739 d058fe03 Gerd Hoffmann
    if (!opts) {
740 1ecda02b Markus Armbruster
        error_report("there is no %s \"%s\" defined",
741 1ecda02b Markus Armbruster
                     list->name, id);
742 d058fe03 Gerd Hoffmann
        return -1;
743 d058fe03 Gerd Hoffmann
    }
744 d058fe03 Gerd Hoffmann
745 3df04ac3 Mark McLoughlin
    if (qemu_opt_set(opts, arg, str+offset+1) == -1) {
746 d058fe03 Gerd Hoffmann
        return -1;
747 d058fe03 Gerd Hoffmann
    }
748 d058fe03 Gerd Hoffmann
    return 0;
749 d058fe03 Gerd Hoffmann
}
750 d058fe03 Gerd Hoffmann
751 d0fef6fb Gerd Hoffmann
int qemu_global_option(const char *str)
752 d0fef6fb Gerd Hoffmann
{
753 d0fef6fb Gerd Hoffmann
    char driver[64], property[64];
754 d0fef6fb Gerd Hoffmann
    QemuOpts *opts;
755 d0fef6fb Gerd Hoffmann
    int rc, offset;
756 d0fef6fb Gerd Hoffmann
757 d0fef6fb Gerd Hoffmann
    rc = sscanf(str, "%63[^.].%63[^=]%n", driver, property, &offset);
758 d0fef6fb Gerd Hoffmann
    if (rc < 2 || str[offset] != '=') {
759 1ecda02b Markus Armbruster
        error_report("can't parse: \"%s\"", str);
760 d0fef6fb Gerd Hoffmann
        return -1;
761 d0fef6fb Gerd Hoffmann
    }
762 d0fef6fb Gerd Hoffmann
763 e478b448 Dong Xu Wang
    opts = qemu_opts_create_nofail(&qemu_global_opts);
764 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "driver", driver);
765 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "property", property);
766 d0fef6fb Gerd Hoffmann
    qemu_opt_set(opts, "value", str+offset+1);
767 d0fef6fb Gerd Hoffmann
    return 0;
768 d0fef6fb Gerd Hoffmann
}
769 d0fef6fb Gerd Hoffmann
770 9d993394 Gerd Hoffmann
struct ConfigWriteData {
771 9d993394 Gerd Hoffmann
    QemuOptsList *list;
772 9d993394 Gerd Hoffmann
    FILE *fp;
773 9d993394 Gerd Hoffmann
};
774 9d993394 Gerd Hoffmann
775 9d993394 Gerd Hoffmann
static int config_write_opt(const char *name, const char *value, void *opaque)
776 9d993394 Gerd Hoffmann
{
777 9d993394 Gerd Hoffmann
    struct ConfigWriteData *data = opaque;
778 9d993394 Gerd Hoffmann
779 9d993394 Gerd Hoffmann
    fprintf(data->fp, "  %s = \"%s\"\n", name, value);
780 9d993394 Gerd Hoffmann
    return 0;
781 9d993394 Gerd Hoffmann
}
782 9d993394 Gerd Hoffmann
783 9d993394 Gerd Hoffmann
static int config_write_opts(QemuOpts *opts, void *opaque)
784 9d993394 Gerd Hoffmann
{
785 9d993394 Gerd Hoffmann
    struct ConfigWriteData *data = opaque;
786 9d993394 Gerd Hoffmann
    const char *id = qemu_opts_id(opts);
787 9d993394 Gerd Hoffmann
788 9d993394 Gerd Hoffmann
    if (id) {
789 9d993394 Gerd Hoffmann
        fprintf(data->fp, "[%s \"%s\"]\n", data->list->name, id);
790 9d993394 Gerd Hoffmann
    } else {
791 9d993394 Gerd Hoffmann
        fprintf(data->fp, "[%s]\n", data->list->name);
792 9d993394 Gerd Hoffmann
    }
793 9d993394 Gerd Hoffmann
    qemu_opt_foreach(opts, config_write_opt, data, 0);
794 9d993394 Gerd Hoffmann
    fprintf(data->fp, "\n");
795 9d993394 Gerd Hoffmann
    return 0;
796 9d993394 Gerd Hoffmann
}
797 9d993394 Gerd Hoffmann
798 9d993394 Gerd Hoffmann
void qemu_config_write(FILE *fp)
799 9d993394 Gerd Hoffmann
{
800 9d993394 Gerd Hoffmann
    struct ConfigWriteData data = { .fp = fp };
801 490b648e Kevin Wolf
    QemuOptsList **lists = vm_config_groups;
802 9d993394 Gerd Hoffmann
    int i;
803 9d993394 Gerd Hoffmann
804 9d993394 Gerd Hoffmann
    fprintf(fp, "# qemu config file\n\n");
805 9d993394 Gerd Hoffmann
    for (i = 0; lists[i] != NULL; i++) {
806 9d993394 Gerd Hoffmann
        data.list = lists[i];
807 9d993394 Gerd Hoffmann
        qemu_opts_foreach(data.list, config_write_opts, &data, 0);
808 9d993394 Gerd Hoffmann
    }
809 9d993394 Gerd Hoffmann
}
810 42262ba8 Gerd Hoffmann
811 490b648e Kevin Wolf
int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
812 42262ba8 Gerd Hoffmann
{
813 42262ba8 Gerd Hoffmann
    char line[1024], group[64], id[64], arg[64], value[1024];
814 cf5a65aa Markus Armbruster
    Location loc;
815 42262ba8 Gerd Hoffmann
    QemuOptsList *list = NULL;
816 2ac20613 Luiz Capitulino
    Error *local_err = NULL;
817 42262ba8 Gerd Hoffmann
    QemuOpts *opts = NULL;
818 cf5a65aa Markus Armbruster
    int res = -1, lno = 0;
819 42262ba8 Gerd Hoffmann
820 cf5a65aa Markus Armbruster
    loc_push_none(&loc);
821 42262ba8 Gerd Hoffmann
    while (fgets(line, sizeof(line), fp) != NULL) {
822 cf5a65aa Markus Armbruster
        loc_set_file(fname, ++lno);
823 42262ba8 Gerd Hoffmann
        if (line[0] == '\n') {
824 42262ba8 Gerd Hoffmann
            /* skip empty lines */
825 42262ba8 Gerd Hoffmann
            continue;
826 42262ba8 Gerd Hoffmann
        }
827 42262ba8 Gerd Hoffmann
        if (line[0] == '#') {
828 42262ba8 Gerd Hoffmann
            /* comment */
829 42262ba8 Gerd Hoffmann
            continue;
830 42262ba8 Gerd Hoffmann
        }
831 42262ba8 Gerd Hoffmann
        if (sscanf(line, "[%63s \"%63[^\"]\"]", group, id) == 2) {
832 42262ba8 Gerd Hoffmann
            /* group with id */
833 2ac20613 Luiz Capitulino
            list = find_list(lists, group, &local_err);
834 2ac20613 Luiz Capitulino
            if (error_is_set(&local_err)) {
835 2ac20613 Luiz Capitulino
                error_report("%s\n", error_get_pretty(local_err));
836 2ac20613 Luiz Capitulino
                error_free(local_err);
837 cf5a65aa Markus Armbruster
                goto out;
838 2ac20613 Luiz Capitulino
            }
839 8be7e7e4 Luiz Capitulino
            opts = qemu_opts_create(list, id, 1, NULL);
840 42262ba8 Gerd Hoffmann
            continue;
841 42262ba8 Gerd Hoffmann
        }
842 42262ba8 Gerd Hoffmann
        if (sscanf(line, "[%63[^]]]", group) == 1) {
843 42262ba8 Gerd Hoffmann
            /* group without id */
844 2ac20613 Luiz Capitulino
            list = find_list(lists, group, &local_err);
845 2ac20613 Luiz Capitulino
            if (error_is_set(&local_err)) {
846 2ac20613 Luiz Capitulino
                error_report("%s\n", error_get_pretty(local_err));
847 2ac20613 Luiz Capitulino
                error_free(local_err);
848 cf5a65aa Markus Armbruster
                goto out;
849 2ac20613 Luiz Capitulino
            }
850 e478b448 Dong Xu Wang
            opts = qemu_opts_create_nofail(list);
851 42262ba8 Gerd Hoffmann
            continue;
852 42262ba8 Gerd Hoffmann
        }
853 42262ba8 Gerd Hoffmann
        if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) {
854 42262ba8 Gerd Hoffmann
            /* arg = value */
855 42262ba8 Gerd Hoffmann
            if (opts == NULL) {
856 cf5a65aa Markus Armbruster
                error_report("no group defined");
857 cf5a65aa Markus Armbruster
                goto out;
858 42262ba8 Gerd Hoffmann
            }
859 42262ba8 Gerd Hoffmann
            if (qemu_opt_set(opts, arg, value) != 0) {
860 cf5a65aa Markus Armbruster
                goto out;
861 42262ba8 Gerd Hoffmann
            }
862 42262ba8 Gerd Hoffmann
            continue;
863 42262ba8 Gerd Hoffmann
        }
864 cf5a65aa Markus Armbruster
        error_report("parse error");
865 cf5a65aa Markus Armbruster
        goto out;
866 42262ba8 Gerd Hoffmann
    }
867 ef82516d Markus Armbruster
    if (ferror(fp)) {
868 ef82516d Markus Armbruster
        error_report("error reading file");
869 ef82516d Markus Armbruster
        goto out;
870 ef82516d Markus Armbruster
    }
871 cf5a65aa Markus Armbruster
    res = 0;
872 cf5a65aa Markus Armbruster
out:
873 cf5a65aa Markus Armbruster
    loc_pop(&loc);
874 cf5a65aa Markus Armbruster
    return res;
875 42262ba8 Gerd Hoffmann
}
876 dcfb0939 Kevin Wolf
877 dcfb0939 Kevin Wolf
int qemu_read_config_file(const char *filename)
878 dcfb0939 Kevin Wolf
{
879 dcfb0939 Kevin Wolf
    FILE *f = fopen(filename, "r");
880 019e78ba Kevin Wolf
    int ret;
881 019e78ba Kevin Wolf
882 dcfb0939 Kevin Wolf
    if (f == NULL) {
883 dcfb0939 Kevin Wolf
        return -errno;
884 dcfb0939 Kevin Wolf
    }
885 dcfb0939 Kevin Wolf
886 019e78ba Kevin Wolf
    ret = qemu_config_parse(f, vm_config_groups, filename);
887 dcfb0939 Kevin Wolf
    fclose(f);
888 dcfb0939 Kevin Wolf
889 019e78ba Kevin Wolf
    if (ret == 0) {
890 019e78ba Kevin Wolf
        return 0;
891 019e78ba Kevin Wolf
    } else {
892 019e78ba Kevin Wolf
        return -EINVAL;
893 019e78ba Kevin Wolf
    }
894 dcfb0939 Kevin Wolf
}