Statistics
| Branch: | Revision:

root / qemu-config.c @ c09015dd

History | View | Annotate | Download (19.9 kB)

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