Statistics
| Branch: | Revision:

root / qemu-config.c @ c2162a8b

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