root / qemu-config.c @ b5ec5ce0
History | View | Annotate | Download (11.9 kB)
1 | 7282a033 | Gerd Hoffmann | #include "qemu-common.h" |
---|---|---|---|
2 | 7282a033 | Gerd Hoffmann | #include "qemu-option.h" |
3 | 7282a033 | Gerd Hoffmann | #include "qemu-config.h" |
4 | a861c453 | Gerd Hoffmann | #include "sysemu.h" |
5 | d0fef6fb | Gerd Hoffmann | #include "hw/qdev.h" |
6 | 7282a033 | Gerd Hoffmann | |
7 | 7282a033 | Gerd Hoffmann | 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 | 7282a033 | Gerd Hoffmann | .help = "host cache usage (none, writeback, writethrough)",
|
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 | 7282a033 | Gerd Hoffmann | { /* end if list */ }
|
83 | 7282a033 | Gerd Hoffmann | }, |
84 | 7282a033 | Gerd Hoffmann | }; |
85 | 7282a033 | Gerd Hoffmann | |
86 | 191bc01b | Gerd Hoffmann | QemuOptsList qemu_chardev_opts = { |
87 | 191bc01b | Gerd Hoffmann | .name = "chardev",
|
88 | 72cf2d4f | Blue Swirl | .head = QTAILQ_HEAD_INITIALIZER(qemu_chardev_opts.head), |
89 | 191bc01b | Gerd Hoffmann | .desc = { |
90 | 7d31544f | Gerd Hoffmann | { |
91 | 7d31544f | Gerd Hoffmann | .name = "backend",
|
92 | 7d31544f | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
93 | 7d31544f | Gerd Hoffmann | },{ |
94 | 7d31544f | Gerd Hoffmann | .name = "path",
|
95 | 7d31544f | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
96 | aeb2c47a | Gerd Hoffmann | },{ |
97 | aeb2c47a | Gerd Hoffmann | .name = "host",
|
98 | aeb2c47a | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
99 | aeb2c47a | Gerd Hoffmann | },{ |
100 | aeb2c47a | Gerd Hoffmann | .name = "port",
|
101 | aeb2c47a | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
102 | aeb2c47a | Gerd Hoffmann | },{ |
103 | 7e1b35b4 | Gerd Hoffmann | .name = "localaddr",
|
104 | 7e1b35b4 | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
105 | 7e1b35b4 | Gerd Hoffmann | },{ |
106 | 7e1b35b4 | Gerd Hoffmann | .name = "localport",
|
107 | 7e1b35b4 | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
108 | 7e1b35b4 | Gerd Hoffmann | },{ |
109 | aeb2c47a | Gerd Hoffmann | .name = "to",
|
110 | aeb2c47a | Gerd Hoffmann | .type = QEMU_OPT_NUMBER, |
111 | aeb2c47a | Gerd Hoffmann | },{ |
112 | aeb2c47a | Gerd Hoffmann | .name = "ipv4",
|
113 | aeb2c47a | Gerd Hoffmann | .type = QEMU_OPT_BOOL, |
114 | aeb2c47a | Gerd Hoffmann | },{ |
115 | aeb2c47a | Gerd Hoffmann | .name = "ipv6",
|
116 | aeb2c47a | Gerd Hoffmann | .type = QEMU_OPT_BOOL, |
117 | aeb2c47a | Gerd Hoffmann | },{ |
118 | aeb2c47a | Gerd Hoffmann | .name = "wait",
|
119 | aeb2c47a | Gerd Hoffmann | .type = QEMU_OPT_BOOL, |
120 | aeb2c47a | Gerd Hoffmann | },{ |
121 | aeb2c47a | Gerd Hoffmann | .name = "server",
|
122 | aeb2c47a | Gerd Hoffmann | .type = QEMU_OPT_BOOL, |
123 | aeb2c47a | Gerd Hoffmann | },{ |
124 | aeb2c47a | Gerd Hoffmann | .name = "delay",
|
125 | aeb2c47a | Gerd Hoffmann | .type = QEMU_OPT_BOOL, |
126 | aeb2c47a | Gerd Hoffmann | },{ |
127 | aeb2c47a | Gerd Hoffmann | .name = "telnet",
|
128 | aeb2c47a | Gerd Hoffmann | .type = QEMU_OPT_BOOL, |
129 | 6ea314d9 | Gerd Hoffmann | },{ |
130 | 6ea314d9 | Gerd Hoffmann | .name = "width",
|
131 | 6ea314d9 | Gerd Hoffmann | .type = QEMU_OPT_NUMBER, |
132 | 6ea314d9 | Gerd Hoffmann | },{ |
133 | 6ea314d9 | Gerd Hoffmann | .name = "height",
|
134 | 6ea314d9 | Gerd Hoffmann | .type = QEMU_OPT_NUMBER, |
135 | 6ea314d9 | Gerd Hoffmann | },{ |
136 | 6ea314d9 | Gerd Hoffmann | .name = "cols",
|
137 | 6ea314d9 | Gerd Hoffmann | .type = QEMU_OPT_NUMBER, |
138 | 6ea314d9 | Gerd Hoffmann | },{ |
139 | 6ea314d9 | Gerd Hoffmann | .name = "rows",
|
140 | 6ea314d9 | Gerd Hoffmann | .type = QEMU_OPT_NUMBER, |
141 | c845f401 | Gerd Hoffmann | },{ |
142 | c845f401 | Gerd Hoffmann | .name = "mux",
|
143 | c845f401 | Gerd Hoffmann | .type = QEMU_OPT_BOOL, |
144 | 5989020b | Kusanagi Kouichi | },{ |
145 | 5989020b | Kusanagi Kouichi | .name = "signal",
|
146 | 5989020b | Kusanagi Kouichi | .type = QEMU_OPT_BOOL, |
147 | 7d31544f | Gerd Hoffmann | }, |
148 | 191bc01b | Gerd Hoffmann | { /* end if list */ }
|
149 | 191bc01b | Gerd Hoffmann | }, |
150 | 191bc01b | Gerd Hoffmann | }; |
151 | 191bc01b | Gerd Hoffmann | |
152 | f31d07d1 | Gerd Hoffmann | QemuOptsList qemu_device_opts = { |
153 | f31d07d1 | Gerd Hoffmann | .name = "device",
|
154 | 72cf2d4f | Blue Swirl | .head = QTAILQ_HEAD_INITIALIZER(qemu_device_opts.head), |
155 | f31d07d1 | Gerd Hoffmann | .desc = { |
156 | f31d07d1 | Gerd Hoffmann | /*
|
157 | f31d07d1 | Gerd Hoffmann | * no elements => accept any
|
158 | f31d07d1 | Gerd Hoffmann | * sanity checking will happen later
|
159 | f31d07d1 | Gerd Hoffmann | * when setting device properties
|
160 | f31d07d1 | Gerd Hoffmann | */
|
161 | f31d07d1 | Gerd Hoffmann | { /* end if list */ }
|
162 | f31d07d1 | Gerd Hoffmann | }, |
163 | f31d07d1 | Gerd Hoffmann | }; |
164 | f31d07d1 | Gerd Hoffmann | |
165 | a1ea458f | Mark McLoughlin | QemuOptsList qemu_netdev_opts = { |
166 | a1ea458f | Mark McLoughlin | .name = "netdev",
|
167 | a1ea458f | Mark McLoughlin | .head = QTAILQ_HEAD_INITIALIZER(qemu_netdev_opts.head), |
168 | a1ea458f | Mark McLoughlin | .desc = { |
169 | a1ea458f | Mark McLoughlin | /*
|
170 | a1ea458f | Mark McLoughlin | * no elements => accept any params
|
171 | a1ea458f | Mark McLoughlin | * validation will happen later
|
172 | a1ea458f | Mark McLoughlin | */
|
173 | a1ea458f | Mark McLoughlin | { /* end of list */ }
|
174 | a1ea458f | Mark McLoughlin | }, |
175 | a1ea458f | Mark McLoughlin | }; |
176 | a1ea458f | Mark McLoughlin | |
177 | 8119b33d | Mark McLoughlin | QemuOptsList qemu_net_opts = { |
178 | 8119b33d | Mark McLoughlin | .name = "net",
|
179 | 8119b33d | Mark McLoughlin | .head = QTAILQ_HEAD_INITIALIZER(qemu_net_opts.head), |
180 | 8119b33d | Mark McLoughlin | .desc = { |
181 | 8119b33d | Mark McLoughlin | /*
|
182 | 8119b33d | Mark McLoughlin | * no elements => accept any params
|
183 | 8119b33d | Mark McLoughlin | * validation will happen later
|
184 | 8119b33d | Mark McLoughlin | */
|
185 | 8119b33d | Mark McLoughlin | { /* end of list */ }
|
186 | 8119b33d | Mark McLoughlin | }, |
187 | 8119b33d | Mark McLoughlin | }; |
188 | 8119b33d | Mark McLoughlin | |
189 | 1ed2fc1f | Jan Kiszka | QemuOptsList qemu_rtc_opts = { |
190 | 1ed2fc1f | Jan Kiszka | .name = "rtc",
|
191 | 1ed2fc1f | Jan Kiszka | .head = QTAILQ_HEAD_INITIALIZER(qemu_rtc_opts.head), |
192 | 1ed2fc1f | Jan Kiszka | .desc = { |
193 | 1ed2fc1f | Jan Kiszka | { |
194 | 1ed2fc1f | Jan Kiszka | .name = "base",
|
195 | 1ed2fc1f | Jan Kiszka | .type = QEMU_OPT_STRING, |
196 | 6875204c | Jan Kiszka | },{ |
197 | 6875204c | Jan Kiszka | .name = "clock",
|
198 | 6875204c | Jan Kiszka | .type = QEMU_OPT_STRING, |
199 | 1ed2fc1f | Jan Kiszka | #ifdef TARGET_I386
|
200 | 1ed2fc1f | Jan Kiszka | },{ |
201 | 1ed2fc1f | Jan Kiszka | .name = "driftfix",
|
202 | 1ed2fc1f | Jan Kiszka | .type = QEMU_OPT_STRING, |
203 | 1ed2fc1f | Jan Kiszka | #endif
|
204 | 1ed2fc1f | Jan Kiszka | }, |
205 | 1ed2fc1f | Jan Kiszka | { /* end if list */ }
|
206 | 1ed2fc1f | Jan Kiszka | }, |
207 | 1ed2fc1f | Jan Kiszka | }; |
208 | 1ed2fc1f | Jan Kiszka | |
209 | d0fef6fb | Gerd Hoffmann | QemuOptsList qemu_global_opts = { |
210 | d0fef6fb | Gerd Hoffmann | .name = "global",
|
211 | d0fef6fb | Gerd Hoffmann | .head = QTAILQ_HEAD_INITIALIZER(qemu_global_opts.head), |
212 | d0fef6fb | Gerd Hoffmann | .desc = { |
213 | d0fef6fb | Gerd Hoffmann | { |
214 | d0fef6fb | Gerd Hoffmann | .name = "driver",
|
215 | d0fef6fb | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
216 | d0fef6fb | Gerd Hoffmann | },{ |
217 | d0fef6fb | Gerd Hoffmann | .name = "property",
|
218 | d0fef6fb | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
219 | d0fef6fb | Gerd Hoffmann | },{ |
220 | d0fef6fb | Gerd Hoffmann | .name = "value",
|
221 | d0fef6fb | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
222 | d0fef6fb | Gerd Hoffmann | }, |
223 | d0fef6fb | Gerd Hoffmann | { /* end if list */ }
|
224 | d0fef6fb | Gerd Hoffmann | }, |
225 | d0fef6fb | Gerd Hoffmann | }; |
226 | d0fef6fb | Gerd Hoffmann | |
227 | 88589343 | Gerd Hoffmann | QemuOptsList qemu_mon_opts = { |
228 | 88589343 | Gerd Hoffmann | .name = "mon",
|
229 | 88589343 | Gerd Hoffmann | .head = QTAILQ_HEAD_INITIALIZER(qemu_mon_opts.head), |
230 | 88589343 | Gerd Hoffmann | .desc = { |
231 | 88589343 | Gerd Hoffmann | { |
232 | 88589343 | Gerd Hoffmann | .name = "mode",
|
233 | 88589343 | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
234 | 88589343 | Gerd Hoffmann | },{ |
235 | 88589343 | Gerd Hoffmann | .name = "chardev",
|
236 | 88589343 | Gerd Hoffmann | .type = QEMU_OPT_STRING, |
237 | 88589343 | Gerd Hoffmann | },{ |
238 | 88589343 | Gerd Hoffmann | .name = "default",
|
239 | 88589343 | Gerd Hoffmann | .type = QEMU_OPT_BOOL, |
240 | 88589343 | Gerd Hoffmann | }, |
241 | 88589343 | Gerd Hoffmann | { /* end if list */ }
|
242 | 88589343 | Gerd Hoffmann | }, |
243 | 88589343 | Gerd Hoffmann | }; |
244 | 88589343 | Gerd Hoffmann | |
245 | b5ec5ce0 | john cooper | QemuOptsList qemu_cpudef_opts = { |
246 | b5ec5ce0 | john cooper | .name = "cpudef",
|
247 | b5ec5ce0 | john cooper | .head = QTAILQ_HEAD_INITIALIZER(qemu_cpudef_opts.head), |
248 | b5ec5ce0 | john cooper | .desc = { |
249 | b5ec5ce0 | john cooper | { |
250 | b5ec5ce0 | john cooper | .name = "name",
|
251 | b5ec5ce0 | john cooper | .type = QEMU_OPT_STRING, |
252 | b5ec5ce0 | john cooper | },{ |
253 | b5ec5ce0 | john cooper | .name = "level",
|
254 | b5ec5ce0 | john cooper | .type = QEMU_OPT_NUMBER, |
255 | b5ec5ce0 | john cooper | },{ |
256 | b5ec5ce0 | john cooper | .name = "vendor",
|
257 | b5ec5ce0 | john cooper | .type = QEMU_OPT_STRING, |
258 | b5ec5ce0 | john cooper | },{ |
259 | b5ec5ce0 | john cooper | .name = "family",
|
260 | b5ec5ce0 | john cooper | .type = QEMU_OPT_NUMBER, |
261 | b5ec5ce0 | john cooper | },{ |
262 | b5ec5ce0 | john cooper | .name = "model",
|
263 | b5ec5ce0 | john cooper | .type = QEMU_OPT_NUMBER, |
264 | b5ec5ce0 | john cooper | },{ |
265 | b5ec5ce0 | john cooper | .name = "stepping",
|
266 | b5ec5ce0 | john cooper | .type = QEMU_OPT_NUMBER, |
267 | b5ec5ce0 | john cooper | },{ |
268 | b5ec5ce0 | john cooper | .name = "feature_edx", /* cpuid 0000_0001.edx */ |
269 | b5ec5ce0 | john cooper | .type = QEMU_OPT_STRING, |
270 | b5ec5ce0 | john cooper | },{ |
271 | b5ec5ce0 | john cooper | .name = "feature_ecx", /* cpuid 0000_0001.ecx */ |
272 | b5ec5ce0 | john cooper | .type = QEMU_OPT_STRING, |
273 | b5ec5ce0 | john cooper | },{ |
274 | b5ec5ce0 | john cooper | .name = "extfeature_edx", /* cpuid 8000_0001.edx */ |
275 | b5ec5ce0 | john cooper | .type = QEMU_OPT_STRING, |
276 | b5ec5ce0 | john cooper | },{ |
277 | b5ec5ce0 | john cooper | .name = "extfeature_ecx", /* cpuid 8000_0001.ecx */ |
278 | b5ec5ce0 | john cooper | .type = QEMU_OPT_STRING, |
279 | b5ec5ce0 | john cooper | },{ |
280 | b5ec5ce0 | john cooper | .name = "xlevel",
|
281 | b5ec5ce0 | john cooper | .type = QEMU_OPT_NUMBER, |
282 | b5ec5ce0 | john cooper | },{ |
283 | b5ec5ce0 | john cooper | .name = "model_id",
|
284 | b5ec5ce0 | john cooper | .type = QEMU_OPT_STRING, |
285 | b5ec5ce0 | john cooper | },{ |
286 | b5ec5ce0 | john cooper | .name = "vendor_override",
|
287 | b5ec5ce0 | john cooper | .type = QEMU_OPT_NUMBER, |
288 | b5ec5ce0 | john cooper | }, |
289 | b5ec5ce0 | john cooper | { /* end of list */ }
|
290 | b5ec5ce0 | john cooper | }, |
291 | b5ec5ce0 | john cooper | }; |
292 | b5ec5ce0 | john cooper | |
293 | d058fe03 | Gerd Hoffmann | static QemuOptsList *lists[] = {
|
294 | d058fe03 | Gerd Hoffmann | &qemu_drive_opts, |
295 | 191bc01b | Gerd Hoffmann | &qemu_chardev_opts, |
296 | f31d07d1 | Gerd Hoffmann | &qemu_device_opts, |
297 | a1ea458f | Mark McLoughlin | &qemu_netdev_opts, |
298 | 8119b33d | Mark McLoughlin | &qemu_net_opts, |
299 | 5fdfbf7e | Jan Kiszka | &qemu_rtc_opts, |
300 | d0fef6fb | Gerd Hoffmann | &qemu_global_opts, |
301 | 88589343 | Gerd Hoffmann | &qemu_mon_opts, |
302 | b5ec5ce0 | john cooper | &qemu_cpudef_opts, |
303 | d058fe03 | Gerd Hoffmann | NULL,
|
304 | d058fe03 | Gerd Hoffmann | }; |
305 | d058fe03 | Gerd Hoffmann | |
306 | ddc97855 | Gerd Hoffmann | static QemuOptsList *find_list(const char *group) |
307 | ddc97855 | Gerd Hoffmann | { |
308 | ddc97855 | Gerd Hoffmann | int i;
|
309 | ddc97855 | Gerd Hoffmann | |
310 | ddc97855 | Gerd Hoffmann | for (i = 0; lists[i] != NULL; i++) { |
311 | ddc97855 | Gerd Hoffmann | if (strcmp(lists[i]->name, group) == 0) |
312 | ddc97855 | Gerd Hoffmann | break;
|
313 | ddc97855 | Gerd Hoffmann | } |
314 | ddc97855 | Gerd Hoffmann | if (lists[i] == NULL) { |
315 | ddc97855 | Gerd Hoffmann | qemu_error("there is no option group \"%s\"\n", group);
|
316 | ddc97855 | Gerd Hoffmann | } |
317 | ddc97855 | Gerd Hoffmann | return lists[i];
|
318 | ddc97855 | Gerd Hoffmann | } |
319 | ddc97855 | Gerd Hoffmann | |
320 | d058fe03 | Gerd Hoffmann | int qemu_set_option(const char *str) |
321 | d058fe03 | Gerd Hoffmann | { |
322 | d058fe03 | Gerd Hoffmann | char group[64], id[64], arg[64]; |
323 | ddc97855 | Gerd Hoffmann | QemuOptsList *list; |
324 | d058fe03 | Gerd Hoffmann | QemuOpts *opts; |
325 | ddc97855 | Gerd Hoffmann | int rc, offset;
|
326 | d058fe03 | Gerd Hoffmann | |
327 | d058fe03 | Gerd Hoffmann | rc = sscanf(str, "%63[^.].%63[^.].%63[^=]%n", group, id, arg, &offset);
|
328 | d058fe03 | Gerd Hoffmann | if (rc < 3 || str[offset] != '=') { |
329 | a861c453 | Gerd Hoffmann | qemu_error("can't parse: \"%s\"\n", str);
|
330 | d058fe03 | Gerd Hoffmann | return -1; |
331 | d058fe03 | Gerd Hoffmann | } |
332 | d058fe03 | Gerd Hoffmann | |
333 | ddc97855 | Gerd Hoffmann | list = find_list(group); |
334 | ddc97855 | Gerd Hoffmann | if (list == NULL) { |
335 | d058fe03 | Gerd Hoffmann | return -1; |
336 | d058fe03 | Gerd Hoffmann | } |
337 | d058fe03 | Gerd Hoffmann | |
338 | ddc97855 | Gerd Hoffmann | opts = qemu_opts_find(list, id); |
339 | d058fe03 | Gerd Hoffmann | if (!opts) {
|
340 | a861c453 | Gerd Hoffmann | qemu_error("there is no %s \"%s\" defined\n",
|
341 | ddc97855 | Gerd Hoffmann | list->name, id); |
342 | d058fe03 | Gerd Hoffmann | return -1; |
343 | d058fe03 | Gerd Hoffmann | } |
344 | d058fe03 | Gerd Hoffmann | |
345 | 3df04ac3 | Mark McLoughlin | if (qemu_opt_set(opts, arg, str+offset+1) == -1) { |
346 | d058fe03 | Gerd Hoffmann | return -1; |
347 | d058fe03 | Gerd Hoffmann | } |
348 | d058fe03 | Gerd Hoffmann | return 0; |
349 | d058fe03 | Gerd Hoffmann | } |
350 | d058fe03 | Gerd Hoffmann | |
351 | d0fef6fb | Gerd Hoffmann | int qemu_global_option(const char *str) |
352 | d0fef6fb | Gerd Hoffmann | { |
353 | d0fef6fb | Gerd Hoffmann | char driver[64], property[64]; |
354 | d0fef6fb | Gerd Hoffmann | QemuOpts *opts; |
355 | d0fef6fb | Gerd Hoffmann | int rc, offset;
|
356 | d0fef6fb | Gerd Hoffmann | |
357 | d0fef6fb | Gerd Hoffmann | rc = sscanf(str, "%63[^.].%63[^=]%n", driver, property, &offset);
|
358 | d0fef6fb | Gerd Hoffmann | if (rc < 2 || str[offset] != '=') { |
359 | d0fef6fb | Gerd Hoffmann | qemu_error("can't parse: \"%s\"\n", str);
|
360 | d0fef6fb | Gerd Hoffmann | return -1; |
361 | d0fef6fb | Gerd Hoffmann | } |
362 | d0fef6fb | Gerd Hoffmann | |
363 | d0fef6fb | Gerd Hoffmann | opts = qemu_opts_create(&qemu_global_opts, NULL, 0); |
364 | d0fef6fb | Gerd Hoffmann | qemu_opt_set(opts, "driver", driver);
|
365 | d0fef6fb | Gerd Hoffmann | qemu_opt_set(opts, "property", property);
|
366 | d0fef6fb | Gerd Hoffmann | qemu_opt_set(opts, "value", str+offset+1); |
367 | d0fef6fb | Gerd Hoffmann | return 0; |
368 | d0fef6fb | Gerd Hoffmann | } |
369 | d0fef6fb | Gerd Hoffmann | |
370 | d0fef6fb | Gerd Hoffmann | static int qemu_add_one_global(QemuOpts *opts, void *opaque) |
371 | d0fef6fb | Gerd Hoffmann | { |
372 | d0fef6fb | Gerd Hoffmann | GlobalProperty *g; |
373 | d0fef6fb | Gerd Hoffmann | |
374 | d0fef6fb | Gerd Hoffmann | g = qemu_mallocz(sizeof(*g));
|
375 | d0fef6fb | Gerd Hoffmann | g->driver = qemu_opt_get(opts, "driver");
|
376 | d0fef6fb | Gerd Hoffmann | g->property = qemu_opt_get(opts, "property");
|
377 | d0fef6fb | Gerd Hoffmann | g->value = qemu_opt_get(opts, "value");
|
378 | d0fef6fb | Gerd Hoffmann | qdev_prop_register_global(g); |
379 | d0fef6fb | Gerd Hoffmann | return 0; |
380 | d0fef6fb | Gerd Hoffmann | } |
381 | d0fef6fb | Gerd Hoffmann | |
382 | d0fef6fb | Gerd Hoffmann | void qemu_add_globals(void) |
383 | d0fef6fb | Gerd Hoffmann | { |
384 | d0fef6fb | Gerd Hoffmann | qemu_opts_foreach(&qemu_global_opts, qemu_add_one_global, NULL, 0); |
385 | d0fef6fb | Gerd Hoffmann | } |
386 | d0fef6fb | Gerd Hoffmann | |
387 | 9d993394 | Gerd Hoffmann | struct ConfigWriteData {
|
388 | 9d993394 | Gerd Hoffmann | QemuOptsList *list; |
389 | 9d993394 | Gerd Hoffmann | FILE *fp; |
390 | 9d993394 | Gerd Hoffmann | }; |
391 | 9d993394 | Gerd Hoffmann | |
392 | 9d993394 | Gerd Hoffmann | static int config_write_opt(const char *name, const char *value, void *opaque) |
393 | 9d993394 | Gerd Hoffmann | { |
394 | 9d993394 | Gerd Hoffmann | struct ConfigWriteData *data = opaque;
|
395 | 9d993394 | Gerd Hoffmann | |
396 | 9d993394 | Gerd Hoffmann | fprintf(data->fp, " %s = \"%s\"\n", name, value);
|
397 | 9d993394 | Gerd Hoffmann | return 0; |
398 | 9d993394 | Gerd Hoffmann | } |
399 | 9d993394 | Gerd Hoffmann | |
400 | 9d993394 | Gerd Hoffmann | static int config_write_opts(QemuOpts *opts, void *opaque) |
401 | 9d993394 | Gerd Hoffmann | { |
402 | 9d993394 | Gerd Hoffmann | struct ConfigWriteData *data = opaque;
|
403 | 9d993394 | Gerd Hoffmann | const char *id = qemu_opts_id(opts); |
404 | 9d993394 | Gerd Hoffmann | |
405 | 9d993394 | Gerd Hoffmann | if (id) {
|
406 | 9d993394 | Gerd Hoffmann | fprintf(data->fp, "[%s \"%s\"]\n", data->list->name, id);
|
407 | 9d993394 | Gerd Hoffmann | } else {
|
408 | 9d993394 | Gerd Hoffmann | fprintf(data->fp, "[%s]\n", data->list->name);
|
409 | 9d993394 | Gerd Hoffmann | } |
410 | 9d993394 | Gerd Hoffmann | qemu_opt_foreach(opts, config_write_opt, data, 0);
|
411 | 9d993394 | Gerd Hoffmann | fprintf(data->fp, "\n");
|
412 | 9d993394 | Gerd Hoffmann | return 0; |
413 | 9d993394 | Gerd Hoffmann | } |
414 | 9d993394 | Gerd Hoffmann | |
415 | 9d993394 | Gerd Hoffmann | void qemu_config_write(FILE *fp)
|
416 | 9d993394 | Gerd Hoffmann | { |
417 | 9d993394 | Gerd Hoffmann | struct ConfigWriteData data = { .fp = fp };
|
418 | 9d993394 | Gerd Hoffmann | int i;
|
419 | 9d993394 | Gerd Hoffmann | |
420 | 9d993394 | Gerd Hoffmann | fprintf(fp, "# qemu config file\n\n");
|
421 | 9d993394 | Gerd Hoffmann | for (i = 0; lists[i] != NULL; i++) { |
422 | 9d993394 | Gerd Hoffmann | data.list = lists[i]; |
423 | 9d993394 | Gerd Hoffmann | qemu_opts_foreach(data.list, config_write_opts, &data, 0);
|
424 | 9d993394 | Gerd Hoffmann | } |
425 | 9d993394 | Gerd Hoffmann | } |
426 | 42262ba8 | Gerd Hoffmann | |
427 | 42262ba8 | Gerd Hoffmann | int qemu_config_parse(FILE *fp)
|
428 | 42262ba8 | Gerd Hoffmann | { |
429 | 42262ba8 | Gerd Hoffmann | char line[1024], group[64], id[64], arg[64], value[1024]; |
430 | 42262ba8 | Gerd Hoffmann | QemuOptsList *list = NULL;
|
431 | 42262ba8 | Gerd Hoffmann | QemuOpts *opts = NULL;
|
432 | 42262ba8 | Gerd Hoffmann | |
433 | 42262ba8 | Gerd Hoffmann | while (fgets(line, sizeof(line), fp) != NULL) { |
434 | 42262ba8 | Gerd Hoffmann | if (line[0] == '\n') { |
435 | 42262ba8 | Gerd Hoffmann | /* skip empty lines */
|
436 | 42262ba8 | Gerd Hoffmann | continue;
|
437 | 42262ba8 | Gerd Hoffmann | } |
438 | 42262ba8 | Gerd Hoffmann | if (line[0] == '#') { |
439 | 42262ba8 | Gerd Hoffmann | /* comment */
|
440 | 42262ba8 | Gerd Hoffmann | continue;
|
441 | 42262ba8 | Gerd Hoffmann | } |
442 | 42262ba8 | Gerd Hoffmann | if (sscanf(line, "[%63s \"%63[^\"]\"]", group, id) == 2) { |
443 | 42262ba8 | Gerd Hoffmann | /* group with id */
|
444 | 42262ba8 | Gerd Hoffmann | list = find_list(group); |
445 | 42262ba8 | Gerd Hoffmann | if (list == NULL) |
446 | 42262ba8 | Gerd Hoffmann | return -1; |
447 | 42262ba8 | Gerd Hoffmann | opts = qemu_opts_create(list, id, 1);
|
448 | 42262ba8 | Gerd Hoffmann | continue;
|
449 | 42262ba8 | Gerd Hoffmann | } |
450 | 42262ba8 | Gerd Hoffmann | if (sscanf(line, "[%63[^]]]", group) == 1) { |
451 | 42262ba8 | Gerd Hoffmann | /* group without id */
|
452 | 42262ba8 | Gerd Hoffmann | list = find_list(group); |
453 | 42262ba8 | Gerd Hoffmann | if (list == NULL) |
454 | 42262ba8 | Gerd Hoffmann | return -1; |
455 | 42262ba8 | Gerd Hoffmann | opts = qemu_opts_create(list, NULL, 0); |
456 | 42262ba8 | Gerd Hoffmann | continue;
|
457 | 42262ba8 | Gerd Hoffmann | } |
458 | 42262ba8 | Gerd Hoffmann | if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) { |
459 | 42262ba8 | Gerd Hoffmann | /* arg = value */
|
460 | 42262ba8 | Gerd Hoffmann | if (opts == NULL) { |
461 | 42262ba8 | Gerd Hoffmann | fprintf(stderr, "no group defined\n");
|
462 | 42262ba8 | Gerd Hoffmann | return -1; |
463 | 42262ba8 | Gerd Hoffmann | } |
464 | 42262ba8 | Gerd Hoffmann | if (qemu_opt_set(opts, arg, value) != 0) { |
465 | 42262ba8 | Gerd Hoffmann | fprintf(stderr, "failed to set \"%s\" for %s\n",
|
466 | 42262ba8 | Gerd Hoffmann | arg, group); |
467 | 42262ba8 | Gerd Hoffmann | return -1; |
468 | 42262ba8 | Gerd Hoffmann | } |
469 | 42262ba8 | Gerd Hoffmann | continue;
|
470 | 42262ba8 | Gerd Hoffmann | } |
471 | 42262ba8 | Gerd Hoffmann | fprintf(stderr, "parse error: %s\n", line);
|
472 | 42262ba8 | Gerd Hoffmann | return -1; |
473 | 42262ba8 | Gerd Hoffmann | } |
474 | 42262ba8 | Gerd Hoffmann | return 0; |
475 | 42262ba8 | Gerd Hoffmann | } |