Statistics
| Branch: | Revision:

root / qemu-config.c @ 4e17eae9

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
}