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