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