~serge-hallyn/ubuntu/raring/libvirt/libvirt-hugepages

« back to all changes in this revision

Viewing changes to .pc/ubuntu/9023-qemu-change-rbd-auth_supported-separation-character-.patch/src/qemu/qemu_command.c

  • Committer: Package Import Robot
  • Author(s): Chuck Short
  • Date: 2012-05-13 15:44:12 UTC
  • mfrom: (1.2.13)
  • Revision ID: package-import@ubuntu.com-20120513154412-fgmn5sxqdzgnzlx3
Tags: 0.9.12-0ubuntu1
* New upstream version:
  * Synchronize with debian packaging:
    - debian/control: Update build depends.
    - debian/libvirt-bin.postrm: Cleanup /var/log/libvirt
      on purge.
    - Bump standards verson (no changes).
    - debian/patches/Don-t-fail-if-we-can-t-setup-avahi.patch: Added
  * Dropped patches:
    - debian/patches/Debianize-libvirt-guests.patch
    - debian/patches/rewrite-lxc-controller-eof-handling-yet-again
    - debian/patches/ubuntu/libnl13.patch
    - debian/patches/ubuntu/fix-lxc-startup-error.patch
    - debian/patches/ubuntu/fix-bridge-fd.patch
    - debian/patches/ubuntu/skip-labelling-network-disks.patch
    - debian/patches/ubuntu/xen-xend-shutdown-detection.patch
    - debian/patches/ubuntu/xen-config-no-vfb-for-hvm.patch
    - debian/patches/debian/Disable-daemon-start-test.patch
    - debian/patches/debian/Disable-gnulib-s-test-nonplocking-pipe.sh.patch
    - debian/patches/ubuntu/9006-default-config-test-case.patch
    - debian/patches/fix-block-migration.patch
    - debian/patches/ubuntu/9022-qemu-unescape-HMP-commands-before-converting-them-to.patch
    - debian/patches/ubuntu/9023-qemu-change-rbd-auth_supported-separation-character-.patch
    - debian/patches/ubuntu/9024-qemu-allow-snapshotting-of-sheepdog-and-rbd-disks.patch
    - debian/patches/9025-qemu-change-rbd-auth_supported-separation-character-.patch
    - debian/patches/ubuntu/arm-gcc-workaround.patch
  * Rediffed:
    - debian/patches/Allow-libvirt-group-to-access-the-socket.patch
    - debian/patches/Disable-failing-virnetsockettest.patch
    - debian/patches/dnsmasq-as-priv-user
    - debian/patches/9002-better_default_uri_virsh.patch
  * debian/control: Add libnl-route-3-dev ass a build depends.
  * debian/patches/libnl3-build-fix.patch: Fix build with libnl3.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * qemu_command.c: QEMU command generation
3
 
 *
4
 
 * Copyright (C) 2006-2011 Red Hat, Inc.
5
 
 * Copyright (C) 2006 Daniel P. Berrange
6
 
 *
7
 
 * This library is free software; you can redistribute it and/or
8
 
 * modify it under the terms of the GNU Lesser General Public
9
 
 * License as published by the Free Software Foundation; either
10
 
 * version 2.1 of the License, or (at your option) any later version.
11
 
 *
12
 
 * This library is distributed in the hope that it will be useful,
13
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 
 * Lesser General Public License for more details.
16
 
 *
17
 
 * You should have received a copy of the GNU Lesser General Public
18
 
 * License along with this library; if not, write to the Free Software
19
 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
20
 
 *
21
 
 * Author: Daniel P. Berrange <berrange@redhat.com>
22
 
 */
23
 
 
24
 
#include <config.h>
25
 
 
26
 
#include "qemu_command.h"
27
 
#include "qemu_capabilities.h"
28
 
#include "qemu_bridge_filter.h"
29
 
#include "cpu/cpu.h"
30
 
#include "memory.h"
31
 
#include "logging.h"
32
 
#include "virterror_internal.h"
33
 
#include "util.h"
34
 
#include "virfile.h"
35
 
#include "uuid.h"
36
 
#include "c-ctype.h"
37
 
#include "domain_nwfilter.h"
38
 
#include "domain_audit.h"
39
 
#include "domain_conf.h"
40
 
#include "network/bridge_driver.h"
41
 
#include "virnetdevtap.h"
42
 
#include "base64.h"
43
 
 
44
 
#include <sys/utsname.h>
45
 
#include <sys/stat.h>
46
 
#include <fcntl.h>
47
 
 
48
 
#define VIR_FROM_THIS VIR_FROM_QEMU
49
 
 
50
 
 
51
 
VIR_ENUM_DECL(virDomainDiskQEMUBus)
52
 
VIR_ENUM_IMPL(virDomainDiskQEMUBus, VIR_DOMAIN_DISK_BUS_LAST,
53
 
              "ide",
54
 
              "floppy",
55
 
              "scsi",
56
 
              "virtio",
57
 
              "xen",
58
 
              "usb",
59
 
              "uml",
60
 
              "sata")
61
 
 
62
 
 
63
 
VIR_ENUM_DECL(qemuDiskCacheV1)
64
 
VIR_ENUM_DECL(qemuDiskCacheV2)
65
 
 
66
 
VIR_ENUM_IMPL(qemuDiskCacheV1, VIR_DOMAIN_DISK_CACHE_LAST,
67
 
              "default",
68
 
              "off",
69
 
              "off",  /* writethrough not supported, so for safety, disable */
70
 
              "on",   /* Old 'on' was equivalent to 'writeback' */
71
 
              "off",  /* directsync not supported, for safety, disable */
72
 
              "off"); /* unsafe not supported, for safety, disable */
73
 
 
74
 
VIR_ENUM_IMPL(qemuDiskCacheV2, VIR_DOMAIN_DISK_CACHE_LAST,
75
 
              "default",
76
 
              "none",
77
 
              "writethrough",
78
 
              "writeback",
79
 
              "directsync",
80
 
              "unsafe");
81
 
 
82
 
VIR_ENUM_DECL(qemuVideo)
83
 
 
84
 
VIR_ENUM_IMPL(qemuVideo, VIR_DOMAIN_VIDEO_TYPE_LAST,
85
 
              "std",
86
 
              "cirrus",
87
 
              "vmware",
88
 
              "", /* no arg needed for xen */
89
 
              "", /* don't support vbox */
90
 
              "qxl");
91
 
 
92
 
VIR_ENUM_DECL(qemuControllerModelUSB)
93
 
 
94
 
VIR_ENUM_IMPL(qemuControllerModelUSB, VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST,
95
 
              "piix3-usb-uhci",
96
 
              "piix4-usb-uhci",
97
 
              "usb-ehci",
98
 
              "ich9-usb-ehci1",
99
 
              "ich9-usb-uhci1",
100
 
              "ich9-usb-uhci2",
101
 
              "ich9-usb-uhci3",
102
 
              "vt82c686b-usb-uhci",
103
 
              "pci-ohci");
104
 
 
105
 
VIR_ENUM_DECL(qemuDomainFSDriver)
106
 
VIR_ENUM_IMPL(qemuDomainFSDriver, VIR_DOMAIN_FS_DRIVER_TYPE_LAST,
107
 
              "local",
108
 
              "local",
109
 
              "handle");
110
 
 
111
 
 
112
 
static void
113
 
uname_normalize (struct utsname *ut)
114
 
{
115
 
    uname(ut);
116
 
 
117
 
    /* Map i386, i486, i586 to i686.  */
118
 
    if (ut->machine[0] == 'i' &&
119
 
        ut->machine[1] != '\0' &&
120
 
        ut->machine[2] == '8' &&
121
 
        ut->machine[3] == '6' &&
122
 
        ut->machine[4] == '\0')
123
 
        ut->machine[1] = '6';
124
 
}
125
 
 
126
 
 
127
 
/**
128
 
 * qemuPhysIfaceConnect:
129
 
 * @def: the definition of the VM (needed by 802.1Qbh and audit)
130
 
 * @driver: pointer to the qemud_driver
131
 
 * @net: pointer to he VM's interface description with direct device type
132
 
 * @qemuCaps: flags for qemu
133
 
 * @vmop: VM operation type
134
 
 *
135
 
 * Returns a filedescriptor on success or -1 in case of error.
136
 
 */
137
 
int
138
 
qemuPhysIfaceConnect(virDomainDefPtr def,
139
 
                     struct qemud_driver *driver,
140
 
                     virDomainNetDefPtr net,
141
 
                     virBitmapPtr qemuCaps,
142
 
                     enum virNetDevVPortProfileOp vmop)
143
 
{
144
 
    int rc;
145
 
    char *res_ifname = NULL;
146
 
    int vnet_hdr = 0;
147
 
 
148
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_VNET_HDR) &&
149
 
        net->model && STREQ(net->model, "virtio"))
150
 
        vnet_hdr = 1;
151
 
 
152
 
    rc = virNetDevMacVLanCreateWithVPortProfile(
153
 
        net->ifname, net->mac,
154
 
        virDomainNetGetActualDirectDev(net),
155
 
        virDomainNetGetActualDirectMode(net),
156
 
        true, vnet_hdr, def->uuid,
157
 
        virDomainNetGetActualDirectVirtPortProfile(net),
158
 
        &res_ifname,
159
 
        vmop, driver->stateDir,
160
 
        virDomainNetGetActualBandwidth(net));
161
 
    if (rc >= 0) {
162
 
        virDomainAuditNetDevice(def, net, res_ifname, true);
163
 
        VIR_FREE(net->ifname);
164
 
        net->ifname = res_ifname;
165
 
    }
166
 
 
167
 
    return rc;
168
 
}
169
 
 
170
 
 
171
 
int
172
 
qemuNetworkIfaceConnect(virDomainDefPtr def,
173
 
                        virConnectPtr conn,
174
 
                        struct qemud_driver *driver,
175
 
                        virDomainNetDefPtr net,
176
 
                        virBitmapPtr qemuCaps)
177
 
{
178
 
    char *brname = NULL;
179
 
    int err;
180
 
    int tapfd = -1;
181
 
    int vnet_hdr = 0;
182
 
    bool template_ifname = false;
183
 
    unsigned char tapmac[VIR_MAC_BUFLEN];
184
 
    int actualType = virDomainNetGetActualType(net);
185
 
 
186
 
    if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK) {
187
 
        int active, fail = 0;
188
 
        virErrorPtr errobj;
189
 
        virNetworkPtr network = virNetworkLookupByName(conn,
190
 
                                                       net->data.network.name);
191
 
        if (!network)
192
 
            return -1;
193
 
 
194
 
        active = virNetworkIsActive(network);
195
 
        if (active != 1) {
196
 
            fail = 1;
197
 
 
198
 
            if (active == 0)
199
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
200
 
                                _("Network '%s' is not active."),
201
 
                                net->data.network.name);
202
 
        }
203
 
 
204
 
        if (!fail) {
205
 
            brname = virNetworkGetBridgeName(network);
206
 
            if (brname == NULL)
207
 
                fail = 1;
208
 
        }
209
 
 
210
 
        /* Make sure any above failure is preserved */
211
 
        errobj = virSaveLastError();
212
 
        virNetworkFree(network);
213
 
        virSetError(errobj);
214
 
        virFreeError(errobj);
215
 
 
216
 
        if (fail)
217
 
            return -1;
218
 
 
219
 
    } else if (actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) {
220
 
        if (!(brname = strdup(virDomainNetGetActualBridgeName(net)))) {
221
 
            virReportOOMError();
222
 
            return -1;
223
 
        }
224
 
    } else {
225
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
226
 
                        _("Network type %d is not supported"),
227
 
                        virDomainNetGetActualType(net));
228
 
        return -1;
229
 
    }
230
 
 
231
 
    if (!net->ifname ||
232
 
        STRPREFIX(net->ifname, VIR_NET_GENERATED_PREFIX) ||
233
 
        strchr(net->ifname, '%')) {
234
 
        VIR_FREE(net->ifname);
235
 
        if (!(net->ifname = strdup(VIR_NET_GENERATED_PREFIX "%d"))) {
236
 
            virReportOOMError();
237
 
            goto cleanup;
238
 
        }
239
 
        /* avoid exposing vnet%d in getXMLDesc or error outputs */
240
 
        template_ifname = true;
241
 
    }
242
 
 
243
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_VNET_HDR) &&
244
 
        net->model && STREQ(net->model, "virtio"))
245
 
        vnet_hdr = 1;
246
 
 
247
 
    memcpy(tapmac, net->mac, VIR_MAC_BUFLEN);
248
 
    tapmac[0] = 0xFE; /* Discourage bridge from using TAP dev MAC */
249
 
    err = virNetDevTapCreateInBridgePort(brname, &net->ifname, tapmac,
250
 
                                         vnet_hdr, true, &tapfd);
251
 
    virDomainAuditNetDevice(def, net, "/dev/net/tun", tapfd >= 0);
252
 
    if (err < 0) {
253
 
        if (template_ifname)
254
 
            VIR_FREE(net->ifname);
255
 
        tapfd = -1;
256
 
    }
257
 
 
258
 
    if (driver->macFilter) {
259
 
        if ((err = networkAllowMacOnPort(driver, net->ifname, net->mac))) {
260
 
            virReportSystemError(err,
261
 
                 _("failed to add ebtables rule to allow MAC address on  '%s'"),
262
 
                                 net->ifname);
263
 
        }
264
 
    }
265
 
 
266
 
    if (tapfd >= 0 &&
267
 
        virNetDevBandwidthSet(net->ifname,
268
 
                              virDomainNetGetActualBandwidth(net)) < 0) {
269
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
270
 
                        _("cannot set bandwidth limits on %s"),
271
 
                        net->ifname);
272
 
        VIR_FORCE_CLOSE(tapfd);
273
 
        goto cleanup;
274
 
    }
275
 
 
276
 
    if (tapfd >= 0) {
277
 
        if ((net->filter) && (net->ifname)) {
278
 
            err = virDomainConfNWFilterInstantiate(conn, net);
279
 
            if (err)
280
 
                VIR_FORCE_CLOSE(tapfd);
281
 
        }
282
 
    }
283
 
 
284
 
cleanup:
285
 
    VIR_FREE(brname);
286
 
 
287
 
    return tapfd;
288
 
}
289
 
 
290
 
 
291
 
int
292
 
qemuOpenVhostNet(virDomainDefPtr def,
293
 
                 virDomainNetDefPtr net,
294
 
                 virBitmapPtr qemuCaps,
295
 
                 int *vhostfd)
296
 
{
297
 
    *vhostfd = -1;   /* assume we won't use vhost */
298
 
 
299
 
    /* If the config says explicitly to not use vhost, return now */
300
 
    if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_QEMU) {
301
 
       return 0;
302
 
    }
303
 
 
304
 
    /* If qemu doesn't support vhost-net mode (including the -netdev command
305
 
     * option), don't try to open the device.
306
 
     */
307
 
    if (!(qemuCapsGet(qemuCaps, QEMU_CAPS_VHOST_NET) &&
308
 
          qemuCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
309
 
          qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
310
 
        if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
311
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
312
 
                            "%s", _("vhost-net is not supported with "
313
 
                                    "this QEMU binary"));
314
 
            return -1;
315
 
        }
316
 
        return 0;
317
 
    }
318
 
 
319
 
    /* If the nic model isn't virtio, don't try to open. */
320
 
    if (!(net->model && STREQ(net->model, "virtio"))) {
321
 
        if (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST) {
322
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
323
 
                            "%s", _("vhost-net is only supported for "
324
 
                                    "virtio network interfaces"));
325
 
            return -1;
326
 
        }
327
 
        return 0;
328
 
    }
329
 
 
330
 
    *vhostfd = open("/dev/vhost-net", O_RDWR);
331
 
    virDomainAuditNetDevice(def, net, "/dev/vhost-net", *vhostfd >= 0);
332
 
 
333
 
    /* If the config says explicitly to use vhost and we couldn't open it,
334
 
     * report an error.
335
 
     */
336
 
    if ((*vhostfd < 0) &&
337
 
        (net->driver.virtio.name == VIR_DOMAIN_NET_BACKEND_TYPE_VHOST)) {
338
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
339
 
                        "%s", _("vhost-net was requested for an interface, "
340
 
                                "but is unavailable"));
341
 
        return -1;
342
 
    }
343
 
    return 0;
344
 
}
345
 
 
346
 
 
347
 
static int qemuDomainDeviceAliasIndex(virDomainDeviceInfoPtr info,
348
 
                                      const char *prefix)
349
 
{
350
 
    int idx;
351
 
 
352
 
    if (!info->alias)
353
 
        return -1;
354
 
    if (!STRPREFIX(info->alias, prefix))
355
 
        return -1;
356
 
 
357
 
    if (virStrToLong_i(info->alias + strlen(prefix), NULL, 10, &idx) < 0)
358
 
        return -1;
359
 
 
360
 
    return idx;
361
 
}
362
 
 
363
 
 
364
 
int qemuDomainNetVLAN(virDomainNetDefPtr def)
365
 
{
366
 
    return qemuDomainDeviceAliasIndex(&def->info, "net");
367
 
}
368
 
 
369
 
 
370
 
/* Names used before -drive existed */
371
 
static int qemuAssignDeviceDiskAliasLegacy(virDomainDiskDefPtr disk)
372
 
{
373
 
    char *dev_name;
374
 
 
375
 
    if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
376
 
        STREQ(disk->dst, "hdc"))
377
 
        dev_name = strdup("cdrom");
378
 
    else
379
 
        dev_name = strdup(disk->dst);
380
 
 
381
 
    if (!dev_name) {
382
 
        virReportOOMError();
383
 
        return -1;
384
 
    }
385
 
 
386
 
    disk->info.alias = dev_name;
387
 
    return 0;
388
 
}
389
 
 
390
 
 
391
 
char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk,
392
 
                               virBitmapPtr qemuCaps)
393
 
{
394
 
    char *ret;
395
 
 
396
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
397
 
        if (virAsprintf(&ret, "%s%s", QEMU_DRIVE_HOST_PREFIX, disk->info.alias) < 0) {
398
 
            virReportOOMError();
399
 
            return NULL;
400
 
        }
401
 
    } else {
402
 
        if (!(ret = strdup(disk->info.alias))) {
403
 
            virReportOOMError();
404
 
            return NULL;
405
 
        }
406
 
    }
407
 
    return ret;
408
 
}
409
 
 
410
 
 
411
 
/* Names used before -drive supported the id= option */
412
 
static int qemuAssignDeviceDiskAliasFixed(virDomainDiskDefPtr disk)
413
 
{
414
 
    int busid, devid;
415
 
    int ret;
416
 
    char *dev_name;
417
 
 
418
 
    if (virDiskNameToBusDeviceIndex(disk, &busid, &devid) < 0) {
419
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
420
 
                        _("cannot convert disk '%s' to bus/device index"),
421
 
                        disk->dst);
422
 
        return -1;
423
 
    }
424
 
 
425
 
    switch (disk->bus) {
426
 
    case VIR_DOMAIN_DISK_BUS_IDE:
427
 
        if (disk->device== VIR_DOMAIN_DISK_DEVICE_DISK)
428
 
            ret = virAsprintf(&dev_name, "ide%d-hd%d", busid, devid);
429
 
        else
430
 
            ret = virAsprintf(&dev_name, "ide%d-cd%d", busid, devid);
431
 
        break;
432
 
    case VIR_DOMAIN_DISK_BUS_SCSI:
433
 
        if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
434
 
            ret = virAsprintf(&dev_name, "scsi%d-hd%d", busid, devid);
435
 
        else
436
 
            ret = virAsprintf(&dev_name, "scsi%d-cd%d", busid, devid);
437
 
        break;
438
 
    case VIR_DOMAIN_DISK_BUS_FDC:
439
 
        ret = virAsprintf(&dev_name, "floppy%d", devid);
440
 
        break;
441
 
    case VIR_DOMAIN_DISK_BUS_VIRTIO:
442
 
        ret = virAsprintf(&dev_name, "virtio%d", devid);
443
 
        break;
444
 
    case VIR_DOMAIN_DISK_BUS_XEN:
445
 
        ret = virAsprintf(&dev_name, "xenblk%d", devid);
446
 
        break;
447
 
    default:
448
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
449
 
                        _("Unsupported disk name mapping for bus '%s'"),
450
 
                        virDomainDiskBusTypeToString(disk->bus));
451
 
        return -1;
452
 
    }
453
 
 
454
 
    if (ret == -1) {
455
 
        virReportOOMError();
456
 
        return -1;
457
 
    }
458
 
 
459
 
    disk->info.alias = dev_name;
460
 
 
461
 
    return 0;
462
 
}
463
 
 
464
 
 
465
 
/* Our custom -drive naming scheme used with id= */
466
 
static int qemuAssignDeviceDiskAliasCustom(virDomainDiskDefPtr disk)
467
 
{
468
 
    const char *prefix = virDomainDiskBusTypeToString(disk->bus);
469
 
    if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
470
 
        if (virAsprintf(&disk->info.alias, "%s%d-%d-%d", prefix,
471
 
                        disk->info.addr.drive.controller,
472
 
                        disk->info.addr.drive.bus,
473
 
                        disk->info.addr.drive.unit) < 0)
474
 
            goto no_memory;
475
 
    } else {
476
 
        int idx = virDiskNameToIndex(disk->dst);
477
 
        if (virAsprintf(&disk->info.alias, "%s-disk%d", prefix, idx) < 0)
478
 
            goto no_memory;
479
 
    }
480
 
 
481
 
    return 0;
482
 
 
483
 
no_memory:
484
 
    virReportOOMError();
485
 
    return -1;
486
 
}
487
 
 
488
 
 
489
 
int
490
 
qemuAssignDeviceDiskAlias(virDomainDiskDefPtr def, virBitmapPtr qemuCaps)
491
 
{
492
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE)) {
493
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
494
 
            return qemuAssignDeviceDiskAliasCustom(def);
495
 
        else
496
 
            return qemuAssignDeviceDiskAliasFixed(def);
497
 
    } else {
498
 
        return qemuAssignDeviceDiskAliasLegacy(def);
499
 
    }
500
 
}
501
 
 
502
 
 
503
 
int
504
 
qemuAssignDeviceNetAlias(virDomainDefPtr def, virDomainNetDefPtr net, int idx)
505
 
{
506
 
    if (idx == -1) {
507
 
        int i;
508
 
        idx = 0;
509
 
        for (i = 0 ; i < def->nnets ; i++) {
510
 
            int thisidx;
511
 
            if ((thisidx = qemuDomainDeviceAliasIndex(&def->nets[i]->info, "net")) < 0) {
512
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
513
 
                                _("Unable to determine device index for network device"));
514
 
                return -1;
515
 
            }
516
 
            if (thisidx >= idx)
517
 
                idx = thisidx + 1;
518
 
        }
519
 
    }
520
 
 
521
 
    if (virAsprintf(&net->info.alias, "net%d", idx) < 0) {
522
 
        virReportOOMError();
523
 
        return -1;
524
 
    }
525
 
 
526
 
    return 0;
527
 
}
528
 
 
529
 
 
530
 
int
531
 
qemuAssignDeviceHostdevAlias(virDomainDefPtr def, virDomainHostdevDefPtr hostdev, int idx)
532
 
{
533
 
    if (idx == -1) {
534
 
        int i;
535
 
        idx = 0;
536
 
        for (i = 0 ; i < def->nhostdevs ; i++) {
537
 
            int thisidx;
538
 
            if ((thisidx = qemuDomainDeviceAliasIndex(&def->hostdevs[i]->info, "hostdev")) < 0) {
539
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
540
 
                                _("Unable to determine device index for hostdev device"));
541
 
                return -1;
542
 
            }
543
 
            if (thisidx >= idx)
544
 
                idx = thisidx + 1;
545
 
        }
546
 
    }
547
 
 
548
 
    if (virAsprintf(&hostdev->info.alias, "hostdev%d", idx) < 0) {
549
 
        virReportOOMError();
550
 
        return -1;
551
 
    }
552
 
 
553
 
    return 0;
554
 
}
555
 
 
556
 
 
557
 
int
558
 
qemuAssignDeviceRedirdevAlias(virDomainDefPtr def, virDomainRedirdevDefPtr redirdev, int idx)
559
 
{
560
 
    if (idx == -1) {
561
 
        int i;
562
 
        idx = 0;
563
 
        for (i = 0 ; i < def->nredirdevs ; i++) {
564
 
            int thisidx;
565
 
            if ((thisidx = qemuDomainDeviceAliasIndex(&def->redirdevs[i]->info, "redir")) < 0) {
566
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
567
 
                                _("Unable to determine device index for redirected device"));
568
 
                return -1;
569
 
            }
570
 
            if (thisidx >= idx)
571
 
                idx = thisidx + 1;
572
 
        }
573
 
    }
574
 
 
575
 
    if (virAsprintf(&redirdev->info.alias, "redir%d", idx) < 0) {
576
 
        virReportOOMError();
577
 
        return -1;
578
 
    }
579
 
 
580
 
    return 0;
581
 
}
582
 
 
583
 
 
584
 
int
585
 
qemuAssignDeviceControllerAlias(virDomainControllerDefPtr controller)
586
 
{
587
 
    const char *prefix = virDomainControllerTypeToString(controller->type);
588
 
 
589
 
    if (virAsprintf(&controller->info.alias,  "%s%d", prefix,
590
 
                    controller->idx) < 0) {
591
 
        virReportOOMError();
592
 
        return -1;
593
 
    }
594
 
 
595
 
    return 0;
596
 
}
597
 
 
598
 
 
599
 
int
600
 
qemuAssignDeviceAliases(virDomainDefPtr def, virBitmapPtr qemuCaps)
601
 
{
602
 
    int i;
603
 
 
604
 
    for (i = 0; i < def->ndisks ; i++) {
605
 
        if (qemuAssignDeviceDiskAlias(def->disks[i], qemuCaps) < 0)
606
 
            return -1;
607
 
    }
608
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_NET_NAME) ||
609
 
        qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
610
 
        for (i = 0; i < def->nnets ; i++) {
611
 
            if (qemuAssignDeviceNetAlias(def, def->nets[i], i) < 0)
612
 
                return -1;
613
 
        }
614
 
    }
615
 
 
616
 
    if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
617
 
        return 0;
618
 
 
619
 
    for (i = 0; i < def->nfss ; i++) {
620
 
        if (virAsprintf(&def->fss[i]->info.alias, "fs%d", i) < 0)
621
 
            goto no_memory;
622
 
    }
623
 
    for (i = 0; i < def->nsounds ; i++) {
624
 
        if (virAsprintf(&def->sounds[i]->info.alias, "sound%d", i) < 0)
625
 
            goto no_memory;
626
 
    }
627
 
    for (i = 0; i < def->nhostdevs ; i++) {
628
 
        if (qemuAssignDeviceHostdevAlias(def, def->hostdevs[i], i) < 0)
629
 
            return -1;
630
 
    }
631
 
    for (i = 0; i < def->nredirdevs ; i++) {
632
 
        if (qemuAssignDeviceRedirdevAlias(def, def->redirdevs[i], i) < 0)
633
 
            return -1;
634
 
    }
635
 
    for (i = 0; i < def->nvideos ; i++) {
636
 
        if (virAsprintf(&def->videos[i]->info.alias, "video%d", i) < 0)
637
 
            goto no_memory;
638
 
    }
639
 
    for (i = 0; i < def->ncontrollers ; i++) {
640
 
        if (qemuAssignDeviceControllerAlias(def->controllers[i]) < 0)
641
 
            return -1;
642
 
    }
643
 
    for (i = 0; i < def->ninputs ; i++) {
644
 
        if (virAsprintf(&def->inputs[i]->info.alias, "input%d", i) < 0)
645
 
            goto no_memory;
646
 
    }
647
 
    for (i = 0; i < def->nparallels ; i++) {
648
 
        if (virAsprintf(&def->parallels[i]->info.alias, "parallel%d", i) < 0)
649
 
            goto no_memory;
650
 
    }
651
 
    for (i = 0; i < def->nserials ; i++) {
652
 
        if (virAsprintf(&def->serials[i]->info.alias, "serial%d", i) < 0)
653
 
            goto no_memory;
654
 
    }
655
 
    for (i = 0; i < def->nchannels ; i++) {
656
 
        if (virAsprintf(&def->channels[i]->info.alias, "channel%d", i) < 0)
657
 
            goto no_memory;
658
 
    }
659
 
    for (i = 0; i < def->nconsoles ; i++) {
660
 
        if (virAsprintf(&def->consoles[i]->info.alias, "console%d", i) < 0)
661
 
            goto no_memory;
662
 
    }
663
 
    for (i = 0; i < def->nhubs ; i++) {
664
 
        if (virAsprintf(&def->hubs[i]->info.alias, "hub%d", i) < 0)
665
 
            goto no_memory;
666
 
    }
667
 
    for (i = 0; i < def->nsmartcards ; i++) {
668
 
        if (virAsprintf(&def->smartcards[i]->info.alias, "smartcard%d", i) < 0)
669
 
            goto no_memory;
670
 
    }
671
 
    if (def->watchdog) {
672
 
        if (virAsprintf(&def->watchdog->info.alias, "watchdog%d", 0) < 0)
673
 
            goto no_memory;
674
 
    }
675
 
    if (def->memballoon) {
676
 
        if (virAsprintf(&def->memballoon->info.alias, "balloon%d", 0) < 0)
677
 
            goto no_memory;
678
 
    }
679
 
 
680
 
    return 0;
681
 
 
682
 
    no_memory:
683
 
    virReportOOMError();
684
 
    return -1;
685
 
}
686
 
 
687
 
 
688
 
#define QEMU_PCI_ADDRESS_LAST_SLOT 31
689
 
#define QEMU_PCI_ADDRESS_LAST_FUNCTION 8
690
 
struct _qemuDomainPCIAddressSet {
691
 
    virHashTablePtr used;
692
 
    int nextslot;
693
 
};
694
 
 
695
 
 
696
 
static char *qemuPCIAddressAsString(virDomainDeviceInfoPtr dev)
697
 
{
698
 
    char *addr;
699
 
 
700
 
    if (dev->addr.pci.domain != 0 ||
701
 
        dev->addr.pci.bus != 0) {
702
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
703
 
                        _("Only PCI domain 0 and bus 0 are available"));
704
 
        return NULL;
705
 
    }
706
 
 
707
 
    if (virAsprintf(&addr, "%d:%d:%d.%d",
708
 
                    dev->addr.pci.domain,
709
 
                    dev->addr.pci.bus,
710
 
                    dev->addr.pci.slot,
711
 
                    dev->addr.pci.function) < 0) {
712
 
        virReportOOMError();
713
 
        return NULL;
714
 
    }
715
 
    return addr;
716
 
}
717
 
 
718
 
 
719
 
static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
720
 
                                 virDomainDeviceInfoPtr dev,
721
 
                                 void *opaque)
722
 
{
723
 
    int ret = -1;
724
 
    char *addr = NULL;
725
 
    qemuDomainPCIAddressSetPtr addrs = opaque;
726
 
 
727
 
    if (dev->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
728
 
        return 0;
729
 
 
730
 
    addr = qemuPCIAddressAsString(dev);
731
 
    if (!addr)
732
 
        goto cleanup;
733
 
 
734
 
    if (virHashLookup(addrs->used, addr)) {
735
 
        if (dev->addr.pci.function != 0) {
736
 
            qemuReportError(VIR_ERR_XML_ERROR,
737
 
                            _("Attempted double use of PCI Address '%s' "
738
 
                              "(may need \"multifunction='on'\" for device on function 0"),
739
 
                            addr);
740
 
        } else {
741
 
            qemuReportError(VIR_ERR_XML_ERROR,
742
 
                            _("Attempted double use of PCI Address '%s'"), addr);
743
 
        }
744
 
        goto cleanup;
745
 
    }
746
 
 
747
 
    VIR_DEBUG("Remembering PCI addr %s", addr);
748
 
    if (virHashAddEntry(addrs->used, addr, addr) < 0)
749
 
        goto cleanup;
750
 
    addr = NULL;
751
 
 
752
 
    if ((dev->addr.pci.function == 0) &&
753
 
        (dev->addr.pci.multi != VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON)) {
754
 
        /* a function 0 w/o multifunction=on must reserve the entire slot */
755
 
        int function;
756
 
        virDomainDeviceInfo temp_dev = *dev;
757
 
 
758
 
        for (function = 1; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
759
 
            temp_dev.addr.pci.function = function;
760
 
            addr = qemuPCIAddressAsString(&temp_dev);
761
 
            if (!addr)
762
 
                goto cleanup;
763
 
 
764
 
            if (virHashLookup(addrs->used, addr)) {
765
 
                qemuReportError(VIR_ERR_XML_ERROR,
766
 
                                _("Attempted double use of PCI Address '%s'"
767
 
                                  "(need \"multifunction='off'\" for device on function 0)"),
768
 
                                addr);
769
 
                goto cleanup;
770
 
            }
771
 
 
772
 
            VIR_DEBUG("Remembering PCI addr %s (multifunction=off for function 0)", addr);
773
 
            if (virHashAddEntry(addrs->used, addr, addr))
774
 
                goto cleanup;
775
 
            addr = NULL;
776
 
        }
777
 
    }
778
 
    ret = 0;
779
 
cleanup:
780
 
    VIR_FREE(addr);
781
 
    return ret;
782
 
}
783
 
 
784
 
 
785
 
int
786
 
qemuDomainAssignPCIAddresses(virDomainDefPtr def)
787
 
{
788
 
    int ret = -1;
789
 
    virBitmapPtr qemuCaps = NULL;
790
 
    qemuDomainPCIAddressSetPtr addrs = NULL;
791
 
 
792
 
    if (qemuCapsExtractVersionInfo(def->emulator, def->os.arch,
793
 
                                   NULL,
794
 
                                   &qemuCaps) < 0)
795
 
        goto cleanup;
796
 
 
797
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
798
 
        if (!(addrs = qemuDomainPCIAddressSetCreate(def)))
799
 
            goto cleanup;
800
 
 
801
 
        if (qemuAssignDevicePCISlots(def, addrs) < 0)
802
 
            goto cleanup;
803
 
    }
804
 
 
805
 
    ret = 0;
806
 
 
807
 
cleanup:
808
 
    qemuCapsFree(qemuCaps);
809
 
    qemuDomainPCIAddressSetFree(addrs);
810
 
 
811
 
    return ret;
812
 
}
813
 
 
814
 
 
815
 
static void
816
 
qemuDomainPCIAddressSetFreeEntry(void *payload,
817
 
                                 const void *name ATTRIBUTE_UNUSED)
818
 
{
819
 
    VIR_FREE(payload);
820
 
}
821
 
 
822
 
qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def)
823
 
{
824
 
    qemuDomainPCIAddressSetPtr addrs;
825
 
 
826
 
    if (VIR_ALLOC(addrs) < 0)
827
 
        goto no_memory;
828
 
 
829
 
    if (!(addrs->used = virHashCreate(10, qemuDomainPCIAddressSetFreeEntry)))
830
 
        goto error;
831
 
 
832
 
    if (virDomainDeviceInfoIterate(def, qemuCollectPCIAddress, addrs) < 0)
833
 
        goto error;
834
 
 
835
 
    return addrs;
836
 
 
837
 
no_memory:
838
 
    virReportOOMError();
839
 
error:
840
 
    qemuDomainPCIAddressSetFree(addrs);
841
 
    return NULL;
842
 
}
843
 
 
844
 
/* check whether the slot is used by the other device
845
 
 * Return 0 if the slot is not used by the other device, or -1 if the slot
846
 
 * is used by the other device.
847
 
 */
848
 
static int qemuDomainPCIAddressCheckSlot(qemuDomainPCIAddressSetPtr addrs,
849
 
                                         virDomainDeviceInfoPtr dev)
850
 
{
851
 
    char *addr;
852
 
    virDomainDeviceInfo temp_dev;
853
 
    int function;
854
 
 
855
 
    temp_dev = *dev;
856
 
    for (function = 0; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
857
 
        temp_dev.addr.pci.function = function;
858
 
        addr = qemuPCIAddressAsString(&temp_dev);
859
 
        if (!addr)
860
 
            return -1;
861
 
 
862
 
        if (virHashLookup(addrs->used, addr)) {
863
 
            VIR_FREE(addr);
864
 
            return -1;
865
 
        }
866
 
 
867
 
        VIR_FREE(addr);
868
 
    }
869
 
 
870
 
    return 0;
871
 
}
872
 
 
873
 
int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs,
874
 
                                    virDomainDeviceInfoPtr dev)
875
 
{
876
 
    char *addr;
877
 
 
878
 
    addr = qemuPCIAddressAsString(dev);
879
 
    if (!addr)
880
 
        return -1;
881
 
 
882
 
    VIR_DEBUG("Reserving PCI addr %s", addr);
883
 
 
884
 
    if (virHashLookup(addrs->used, addr)) {
885
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
886
 
                        _("unable to reserve PCI address %s"), addr);
887
 
        VIR_FREE(addr);
888
 
        return -1;
889
 
    }
890
 
 
891
 
    if (virHashAddEntry(addrs->used, addr, addr)) {
892
 
        VIR_FREE(addr);
893
 
        return -1;
894
 
    }
895
 
 
896
 
    if (dev->addr.pci.slot > addrs->nextslot) {
897
 
        addrs->nextslot = dev->addr.pci.slot + 1;
898
 
        if (QEMU_PCI_ADDRESS_LAST_SLOT < addrs->nextslot)
899
 
            addrs->nextslot = 0;
900
 
    }
901
 
 
902
 
    return 0;
903
 
}
904
 
 
905
 
int qemuDomainPCIAddressReserveFunction(qemuDomainPCIAddressSetPtr addrs,
906
 
                                        int slot, int function)
907
 
{
908
 
    virDomainDeviceInfo dev;
909
 
 
910
 
    dev.addr.pci.domain = 0;
911
 
    dev.addr.pci.bus = 0;
912
 
    dev.addr.pci.slot = slot;
913
 
    dev.addr.pci.function = function;
914
 
 
915
 
    return qemuDomainPCIAddressReserveAddr(addrs, &dev);
916
 
}
917
 
 
918
 
int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs,
919
 
                                    int slot)
920
 
{
921
 
    int function;
922
 
 
923
 
    for (function = 0; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
924
 
        if (qemuDomainPCIAddressReserveFunction(addrs, slot, function) < 0)
925
 
            goto cleanup;
926
 
    }
927
 
 
928
 
    return 0;
929
 
 
930
 
cleanup:
931
 
    for (function--; function >= 0; function--) {
932
 
        qemuDomainPCIAddressReleaseFunction(addrs, slot, function);
933
 
    }
934
 
    return -1;
935
 
}
936
 
 
937
 
int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs,
938
 
                                    virDomainDeviceInfoPtr dev)
939
 
{
940
 
    int ret = 0;
941
 
    if (dev->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
942
 
        /* We do not support hotplug multi-function PCI device now, so we should
943
 
         * reserve the whole slot. The function of the PCI device must be 0.
944
 
         */
945
 
        if (dev->addr.pci.function != 0) {
946
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
947
 
                            _("Only PCI device addresses with function=0"
948
 
                              " are supported"));
949
 
            return -1;
950
 
        }
951
 
 
952
 
        ret = qemuDomainPCIAddressReserveSlot(addrs, dev->addr.pci.slot);
953
 
    } else {
954
 
        ret = qemuDomainPCIAddressSetNextAddr(addrs, dev);
955
 
    }
956
 
    return ret;
957
 
}
958
 
 
959
 
 
960
 
int qemuDomainPCIAddressReleaseAddr(qemuDomainPCIAddressSetPtr addrs,
961
 
                                    virDomainDeviceInfoPtr dev)
962
 
{
963
 
    char *addr;
964
 
    int ret;
965
 
 
966
 
    addr = qemuPCIAddressAsString(dev);
967
 
    if (!addr)
968
 
        return -1;
969
 
 
970
 
    ret = virHashRemoveEntry(addrs->used, addr);
971
 
 
972
 
    VIR_FREE(addr);
973
 
 
974
 
    return ret;
975
 
}
976
 
 
977
 
int qemuDomainPCIAddressReleaseFunction(qemuDomainPCIAddressSetPtr addrs,
978
 
                                        int slot, int function)
979
 
{
980
 
    virDomainDeviceInfo dev;
981
 
 
982
 
    dev.addr.pci.domain = 0;
983
 
    dev.addr.pci.bus = 0;
984
 
    dev.addr.pci.slot = slot;
985
 
    dev.addr.pci.function = function;
986
 
 
987
 
    return qemuDomainPCIAddressReleaseAddr(addrs, &dev);
988
 
}
989
 
 
990
 
int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, int slot)
991
 
{
992
 
    virDomainDeviceInfo dev;
993
 
    char *addr;
994
 
    int ret = 0;
995
 
    unsigned int *function = &dev.addr.pci.function;
996
 
 
997
 
    dev.addr.pci.domain = 0;
998
 
    dev.addr.pci.bus = 0;
999
 
    dev.addr.pci.slot = slot;
1000
 
 
1001
 
    for (*function = 0; *function < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*function)++) {
1002
 
        addr = qemuPCIAddressAsString(&dev);
1003
 
        if (!addr)
1004
 
            return -1;
1005
 
 
1006
 
        if (!virHashLookup(addrs->used, addr)) {
1007
 
            VIR_FREE(addr);
1008
 
            continue;
1009
 
        }
1010
 
 
1011
 
        VIR_FREE(addr);
1012
 
 
1013
 
        if (qemuDomainPCIAddressReleaseFunction(addrs, slot, *function) < 0)
1014
 
            ret = -1;
1015
 
    }
1016
 
 
1017
 
    return ret;
1018
 
}
1019
 
 
1020
 
void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs)
1021
 
{
1022
 
    if (!addrs)
1023
 
        return;
1024
 
 
1025
 
    virHashFree(addrs->used);
1026
 
    VIR_FREE(addrs);
1027
 
}
1028
 
 
1029
 
 
1030
 
int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs,
1031
 
                                    virDomainDeviceInfoPtr dev)
1032
 
{
1033
 
    int i;
1034
 
    int iteration;
1035
 
 
1036
 
    for (i = addrs->nextslot, iteration = 0;
1037
 
         iteration <= QEMU_PCI_ADDRESS_LAST_SLOT; i++, iteration++) {
1038
 
        virDomainDeviceInfo maybe;
1039
 
        char *addr;
1040
 
 
1041
 
        if (QEMU_PCI_ADDRESS_LAST_SLOT < i)
1042
 
            i = 0;
1043
 
        memset(&maybe, 0, sizeof(maybe));
1044
 
        maybe.addr.pci.domain = 0;
1045
 
        maybe.addr.pci.bus = 0;
1046
 
        maybe.addr.pci.slot = i;
1047
 
        maybe.addr.pci.function = 0;
1048
 
 
1049
 
        if (!(addr = qemuPCIAddressAsString(&maybe)))
1050
 
            return -1;
1051
 
 
1052
 
        if (qemuDomainPCIAddressCheckSlot(addrs, &maybe) < 0) {
1053
 
            VIR_DEBUG("PCI addr %s already in use", addr);
1054
 
            VIR_FREE(addr);
1055
 
            continue;
1056
 
        }
1057
 
 
1058
 
        VIR_DEBUG("Allocating PCI addr %s", addr);
1059
 
        VIR_FREE(addr);
1060
 
 
1061
 
        if (qemuDomainPCIAddressReserveSlot(addrs, i) < 0)
1062
 
            return -1;
1063
 
 
1064
 
        dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
1065
 
        dev->addr.pci = maybe.addr.pci;
1066
 
 
1067
 
        addrs->nextslot = i + 1;
1068
 
        if (QEMU_PCI_ADDRESS_LAST_SLOT < addrs->nextslot)
1069
 
            addrs->nextslot = 0;
1070
 
 
1071
 
        return 0;
1072
 
    }
1073
 
 
1074
 
    qemuReportError(VIR_ERR_INTERNAL_ERROR,
1075
 
                    "%s", _("No more available PCI addresses"));
1076
 
    return -1;
1077
 
}
1078
 
 
1079
 
/*
1080
 
 * This assigns static PCI slots to all configured devices.
1081
 
 * The ordering here is chosen to match the ordering used
1082
 
 * with old QEMU < 0.12, so that if a user updates a QEMU
1083
 
 * host from old QEMU to QEMU >= 0.12, their guests should
1084
 
 * get PCI addresses in the same order as before.
1085
 
 *
1086
 
 * NB, if they previously hotplugged devices then all bets
1087
 
 * are off. Hotplug for old QEMU was unfixably broken wrt
1088
 
 * to stable PCI addressing.
1089
 
 *
1090
 
 * Order is:
1091
 
 *
1092
 
 *  - Host bridge (slot 0)
1093
 
 *  - PIIX3 ISA bridge, IDE controller, something else unknown, USB controller (slot 1)
1094
 
 *  - Video (slot 2)
1095
 
 *
1096
 
 * Incrementally assign slots from 3 onwards:
1097
 
 *
1098
 
 *  - Net
1099
 
 *  - Sound
1100
 
 *  - SCSI controllers
1101
 
 *  - VirtIO block
1102
 
 *  - VirtIO balloon
1103
 
 *  - Host device passthrough
1104
 
 *  - Watchdog (not IB700)
1105
 
 *
1106
 
 * Prior to this function being invoked, qemuCollectPCIAddress() will have
1107
 
 * added all existing PCI addresses from the 'def' to 'addrs'. Thus this
1108
 
 * function must only try to reserve addresses if info.type == NONE and
1109
 
 * skip over info.type == PCI
1110
 
 */
1111
 
int
1112
 
qemuAssignDevicePCISlots(virDomainDefPtr def, qemuDomainPCIAddressSetPtr addrs)
1113
 
{
1114
 
    int i;
1115
 
    bool reservedIDE = false;
1116
 
    bool reservedUSB = false;
1117
 
    bool reservedVGA = false;
1118
 
    int function;
1119
 
 
1120
 
    /* Host bridge */
1121
 
    if (qemuDomainPCIAddressReserveSlot(addrs, 0) < 0)
1122
 
        goto error;
1123
 
 
1124
 
    /* Verify that first IDE and USB controllers (if any) is on the PIIX3, fn 1 */
1125
 
    for (i = 0; i < def->ncontrollers ; i++) {
1126
 
        /* First IDE controller lives on the PIIX3 at slot=1, function=1 */
1127
 
        if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE &&
1128
 
            def->controllers[i]->idx == 0) {
1129
 
            if (def->controllers[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
1130
 
                if (def->controllers[i]->info.addr.pci.domain != 0 ||
1131
 
                    def->controllers[i]->info.addr.pci.bus != 0 ||
1132
 
                    def->controllers[i]->info.addr.pci.slot != 1 ||
1133
 
                    def->controllers[i]->info.addr.pci.function != 1) {
1134
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1135
 
                                    _("Primary IDE controller must have PCI address 0:0:1.1"));
1136
 
                    goto error;
1137
 
                }
1138
 
                /* If TYPE==PCI, then qemuCollectPCIAddress() function
1139
 
                 * has already reserved the address, so we must skip */
1140
 
                reservedIDE = true;
1141
 
            } else {
1142
 
                def->controllers[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
1143
 
                def->controllers[i]->info.addr.pci.domain = 0;
1144
 
                def->controllers[i]->info.addr.pci.bus = 0;
1145
 
                def->controllers[i]->info.addr.pci.slot = 1;
1146
 
                def->controllers[i]->info.addr.pci.function = 1;
1147
 
            }
1148
 
        } else if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
1149
 
                   def->controllers[i]->idx == 0 &&
1150
 
                   (def->controllers[i]->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI ||
1151
 
                    def->controllers[i]->model == -1)) {
1152
 
            if (def->controllers[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
1153
 
                if (def->controllers[i]->info.addr.pci.domain != 0 ||
1154
 
                    def->controllers[i]->info.addr.pci.bus != 0 ||
1155
 
                    def->controllers[i]->info.addr.pci.slot != 1 ||
1156
 
                    def->controllers[i]->info.addr.pci.function != 2) {
1157
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1158
 
                                    _("PIIX3 USB controller must have PCI address 0:0:1.2"));
1159
 
                    goto error;
1160
 
                }
1161
 
                reservedUSB = true;
1162
 
            } else {
1163
 
                def->controllers[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
1164
 
                def->controllers[i]->info.addr.pci.domain = 0;
1165
 
                def->controllers[i]->info.addr.pci.bus = 0;
1166
 
                def->controllers[i]->info.addr.pci.slot = 1;
1167
 
                def->controllers[i]->info.addr.pci.function = 2;
1168
 
            }
1169
 
        }
1170
 
    }
1171
 
 
1172
 
    /* PIIX3 (ISA bridge, IDE controller, something else unknown, USB controller)
1173
 
     * hardcoded slot=1, multifunction device
1174
 
     */
1175
 
    for (function = 0; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) {
1176
 
        if ((function == 1 && reservedIDE) ||
1177
 
            (function == 2 && reservedUSB))
1178
 
            /* we have reserved this pci address */
1179
 
            continue;
1180
 
 
1181
 
        if (qemuDomainPCIAddressReserveFunction(addrs, 1, function) < 0)
1182
 
            goto error;
1183
 
    }
1184
 
 
1185
 
    /* First VGA is hardcoded slot=2 */
1186
 
    if (def->nvideos > 0) {
1187
 
        if (def->videos[0]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
1188
 
            if (def->videos[0]->info.addr.pci.domain != 0 ||
1189
 
                def->videos[0]->info.addr.pci.bus != 0 ||
1190
 
                def->videos[0]->info.addr.pci.slot != 2 ||
1191
 
                def->videos[0]->info.addr.pci.function != 0) {
1192
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1193
 
                                _("Primary video card must have PCI address 0:0:2.0"));
1194
 
                goto error;
1195
 
            }
1196
 
            /* If TYPE==PCI, then qemuCollectPCIAddress() function
1197
 
             * has already reserved the address, so we must skip */
1198
 
            reservedVGA = true;
1199
 
        } else {
1200
 
            def->videos[0]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
1201
 
            def->videos[0]->info.addr.pci.domain = 0;
1202
 
            def->videos[0]->info.addr.pci.bus = 0;
1203
 
            def->videos[0]->info.addr.pci.slot = 2;
1204
 
            def->videos[0]->info.addr.pci.function = 0;
1205
 
        }
1206
 
    }
1207
 
 
1208
 
    if (!reservedVGA
1209
 
        && qemuDomainPCIAddressReserveSlot(addrs, 2) < 0)
1210
 
        goto error;
1211
 
 
1212
 
    for (i = 0; i < def->nfss ; i++) {
1213
 
        if (def->fss[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1214
 
            continue;
1215
 
 
1216
 
        /* Only support VirtIO-9p-pci so far. If that changes,
1217
 
         * we might need to skip devices here */
1218
 
        if (qemuDomainPCIAddressSetNextAddr(addrs, &def->fss[i]->info) < 0)
1219
 
            goto error;
1220
 
    }
1221
 
 
1222
 
    /* Network interfaces */
1223
 
    for (i = 0; i < def->nnets ; i++) {
1224
 
        if (def->nets[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1225
 
            continue;
1226
 
        if (qemuDomainPCIAddressSetNextAddr(addrs, &def->nets[i]->info) < 0)
1227
 
            goto error;
1228
 
    }
1229
 
 
1230
 
    /* Sound cards */
1231
 
    for (i = 0; i < def->nsounds ; i++) {
1232
 
        if (def->sounds[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1233
 
            continue;
1234
 
        /* Skip ISA sound card, and PCSPK */
1235
 
        if (def->sounds[i]->model == VIR_DOMAIN_SOUND_MODEL_SB16 ||
1236
 
            def->sounds[i]->model == VIR_DOMAIN_SOUND_MODEL_PCSPK)
1237
 
            continue;
1238
 
 
1239
 
        if (qemuDomainPCIAddressSetNextAddr(addrs, &def->sounds[i]->info) < 0)
1240
 
            goto error;
1241
 
    }
1242
 
 
1243
 
    /* Disk controllers (SCSI only for now) */
1244
 
    for (i = 0; i < def->ncontrollers ; i++) {
1245
 
        /* FDC lives behind the ISA bridge; CCID is a usb device */
1246
 
        if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_FDC ||
1247
 
            def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_CCID)
1248
 
            continue;
1249
 
 
1250
 
        /* First IDE controller lives on the PIIX3 at slot=1, function=1,
1251
 
           dealt with earlier on*/
1252
 
        if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE &&
1253
 
            def->controllers[i]->idx == 0)
1254
 
            continue;
1255
 
 
1256
 
        if (def->controllers[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1257
 
            continue;
1258
 
        if (qemuDomainPCIAddressSetNextAddr(addrs, &def->controllers[i]->info) < 0)
1259
 
            goto error;
1260
 
    }
1261
 
 
1262
 
    /* Disks (VirtIO only for now) */
1263
 
    for (i = 0; i < def->ndisks ; i++) {
1264
 
        /* Only VirtIO disks use PCI addrs */
1265
 
        if (def->disks[i]->bus != VIR_DOMAIN_DISK_BUS_VIRTIO)
1266
 
            continue;
1267
 
 
1268
 
        if (def->disks[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)
1269
 
            continue;
1270
 
 
1271
 
        if (def->disks[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
1272
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
1273
 
                          _("virtio only support device address type 'PCI'"));
1274
 
            goto error;
1275
 
        }
1276
 
 
1277
 
        if (qemuDomainPCIAddressSetNextAddr(addrs, &def->disks[i]->info) < 0)
1278
 
            goto error;
1279
 
    }
1280
 
 
1281
 
    /* Host PCI devices */
1282
 
    for (i = 0; i < def->nhostdevs ; i++) {
1283
 
        if (def->hostdevs[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1284
 
            continue;
1285
 
        if (def->hostdevs[i]->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
1286
 
            def->hostdevs[i]->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
1287
 
            continue;
1288
 
 
1289
 
        if (qemuDomainPCIAddressSetNextAddr(addrs, &def->hostdevs[i]->info) < 0)
1290
 
            goto error;
1291
 
    }
1292
 
 
1293
 
    /* VirtIO balloon */
1294
 
    if (def->memballoon &&
1295
 
        def->memballoon->model == VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO &&
1296
 
        def->memballoon->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
1297
 
        if (qemuDomainPCIAddressSetNextAddr(addrs, &def->memballoon->info) < 0)
1298
 
            goto error;
1299
 
    }
1300
 
 
1301
 
    /* A watchdog - skip IB700, it is not a PCI device */
1302
 
    if (def->watchdog &&
1303
 
        def->watchdog->model != VIR_DOMAIN_WATCHDOG_MODEL_IB700 &&
1304
 
        def->watchdog->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
1305
 
        if (qemuDomainPCIAddressSetNextAddr(addrs, &def->watchdog->info) < 0)
1306
 
            goto error;
1307
 
    }
1308
 
 
1309
 
    /* Further non-primary video cards */
1310
 
    for (i = 1; i < def->nvideos ; i++) {
1311
 
        if (def->videos[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
1312
 
            continue;
1313
 
        if (qemuDomainPCIAddressSetNextAddr(addrs, &def->videos[i]->info) < 0)
1314
 
            goto error;
1315
 
    }
1316
 
    for (i = 0; i < def->ninputs ; i++) {
1317
 
        /* Nada - none are PCI based (yet) */
1318
 
    }
1319
 
    for (i = 0; i < def->nparallels ; i++) {
1320
 
        /* Nada - none are PCI based (yet) */
1321
 
    }
1322
 
    for (i = 0; i < def->nserials ; i++) {
1323
 
        /* Nada - none are PCI based (yet) */
1324
 
    }
1325
 
    for (i = 0; i < def->nchannels ; i++) {
1326
 
        /* Nada - none are PCI based (yet) */
1327
 
    }
1328
 
    for (i = 0; i < def->nhubs ; i++) {
1329
 
        /* Nada - none are PCI based (yet) */
1330
 
    }
1331
 
 
1332
 
    return 0;
1333
 
 
1334
 
error:
1335
 
    return -1;
1336
 
}
1337
 
 
1338
 
static void
1339
 
qemuUsbId(virBufferPtr buf, int idx)
1340
 
{
1341
 
    if (idx == 0)
1342
 
        virBufferAsprintf(buf, "usb");
1343
 
    else
1344
 
        virBufferAsprintf(buf, "usb%d", idx);
1345
 
}
1346
 
 
1347
 
static int
1348
 
qemuBuildDeviceAddressStr(virBufferPtr buf,
1349
 
                          virDomainDeviceInfoPtr info,
1350
 
                          virBitmapPtr qemuCaps)
1351
 
{
1352
 
    if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
1353
 
        if (info->addr.pci.domain != 0) {
1354
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1355
 
                            _("Only PCI device addresses with domain=0 are supported"));
1356
 
            return -1;
1357
 
        }
1358
 
        if (info->addr.pci.bus != 0) {
1359
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1360
 
                            _("Only PCI device addresses with bus=0 are supported"));
1361
 
            return -1;
1362
 
        }
1363
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIFUNCTION)) {
1364
 
            if (info->addr.pci.function > 7) {
1365
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1366
 
                                _("The function of PCI device addresses must "
1367
 
                                  "less than 8"));
1368
 
                return -1;
1369
 
            }
1370
 
        } else {
1371
 
            if (info->addr.pci.function != 0) {
1372
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1373
 
                                _("Only PCI device addresses with function=0 "
1374
 
                                  "are supported with this QEMU binary"));
1375
 
                return -1;
1376
 
            }
1377
 
            if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON) {
1378
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1379
 
                                _("'multifunction=on' is not supported with "
1380
 
                                  "this QEMU binary"));
1381
 
                return -1;
1382
 
            }
1383
 
        }
1384
 
 
1385
 
        /* XXX
1386
 
         * When QEMU grows support for > 1 PCI bus, then pci.0 changes
1387
 
         * to pci.1, pci.2, etc
1388
 
         * When QEMU grows support for > 1 PCI domain, then pci.0 change
1389
 
         * to pciNN.0  where NN is the domain number
1390
 
         */
1391
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_MULTIBUS))
1392
 
            virBufferAsprintf(buf, ",bus=pci.0");
1393
 
        else
1394
 
            virBufferAsprintf(buf, ",bus=pci");
1395
 
        if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_ON)
1396
 
            virBufferAddLit(buf, ",multifunction=on");
1397
 
        else if (info->addr.pci.multi == VIR_DOMAIN_DEVICE_ADDRESS_PCI_MULTI_OFF)
1398
 
            virBufferAddLit(buf, ",multifunction=off");
1399
 
        virBufferAsprintf(buf, ",addr=0x%x", info->addr.pci.slot);
1400
 
        if (info->addr.pci.function != 0)
1401
 
           virBufferAsprintf(buf, ".0x%x", info->addr.pci.function);
1402
 
    } else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) {
1403
 
        virBufferAsprintf(buf, ",bus=");
1404
 
        qemuUsbId(buf, info->addr.usb.bus);
1405
 
        virBufferAsprintf(buf, ".0,port=%s", info->addr.usb.port);
1406
 
    }
1407
 
 
1408
 
    return 0;
1409
 
}
1410
 
 
1411
 
static int
1412
 
qemuBuildIoEventFdStr(virBufferPtr buf,
1413
 
                      enum virDomainIoEventFd use,
1414
 
                      virBitmapPtr qemuCaps)
1415
 
{
1416
 
    if (use && qemuCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_IOEVENTFD))
1417
 
        virBufferAsprintf(buf, ",ioeventfd=%s",
1418
 
                          virDomainIoEventFdTypeToString(use));
1419
 
    return 0;
1420
 
}
1421
 
 
1422
 
#define QEMU_SERIAL_PARAM_ACCEPTED_CHARS \
1423
 
  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"
1424
 
 
1425
 
static int
1426
 
qemuSafeSerialParamValue(const char *value)
1427
 
{
1428
 
    if (strspn(value, QEMU_SERIAL_PARAM_ACCEPTED_CHARS) != strlen (value)) {
1429
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
1430
 
                        _("driver serial '%s' contains unsafe characters"),
1431
 
                        value);
1432
 
        return -1;
1433
 
    }
1434
 
 
1435
 
    return 0;
1436
 
}
1437
 
 
1438
 
static int
1439
 
qemuBuildRBDString(virConnectPtr conn,
1440
 
                   virDomainDiskDefPtr disk,
1441
 
                   virBufferPtr opt)
1442
 
{
1443
 
    int i, ret = 0;
1444
 
    virSecretPtr sec = NULL;
1445
 
    char *secret = NULL;
1446
 
    size_t secret_size;
1447
 
 
1448
 
    virBufferAsprintf(opt, "rbd:%s", disk->src);
1449
 
    if (disk->auth.username) {
1450
 
        virBufferEscape(opt, ":", ":id=%s", disk->auth.username);
1451
 
        /* look up secret */
1452
 
        switch (disk->auth.secretType) {
1453
 
        case VIR_DOMAIN_DISK_SECRET_TYPE_UUID:
1454
 
            sec = virSecretLookupByUUID(conn,
1455
 
                                        disk->auth.secret.uuid);
1456
 
            break;
1457
 
        case VIR_DOMAIN_DISK_SECRET_TYPE_USAGE:
1458
 
            sec = virSecretLookupByUsage(conn,
1459
 
                                         VIR_SECRET_USAGE_TYPE_CEPH,
1460
 
                                         disk->auth.secret.usage);
1461
 
            break;
1462
 
        }
1463
 
 
1464
 
        if (sec) {
1465
 
            char *base64 = NULL;
1466
 
 
1467
 
            secret = (char *)conn->secretDriver->getValue(sec, &secret_size, 0,
1468
 
                                                          VIR_SECRET_GET_VALUE_INTERNAL_CALL);
1469
 
            if (secret == NULL) {
1470
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
1471
 
                                _("could not get the value of the secret for username %s"),
1472
 
                                disk->auth.username);
1473
 
                goto error;
1474
 
            }
1475
 
            /* qemu/librbd wants it base64 encoded */
1476
 
            base64_encode_alloc(secret, secret_size, &base64);
1477
 
            if (!base64) {
1478
 
                virReportOOMError();
1479
 
                goto error;
1480
 
            }
1481
 
            virBufferEscape(opt, ":", ":key=%s:auth_supported=cephx none",
1482
 
                            base64);
1483
 
            VIR_FREE(base64);
1484
 
        } else {
1485
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
1486
 
                            _("rbd username '%s' specified but secret not found"),
1487
 
                            disk->auth.username);
1488
 
            goto error;
1489
 
        }
1490
 
    }
1491
 
 
1492
 
    if (disk->nhosts > 0) {
1493
 
        virBufferAddLit(opt, ":mon_host=");
1494
 
        for (i = 0; i < disk->nhosts; ++i) {
1495
 
            if (i) {
1496
 
                virBufferAddLit(opt, "\\;");
1497
 
            }
1498
 
            if (disk->hosts[i].port) {
1499
 
                virBufferAsprintf(opt, "%s\\:%s",
1500
 
                                  disk->hosts[i].name,
1501
 
                                  disk->hosts[i].port);
1502
 
            } else {
1503
 
                virBufferAsprintf(opt, "%s", disk->hosts[i].name);
1504
 
            }
1505
 
        }
1506
 
    }
1507
 
 
1508
 
cleanup:
1509
 
    VIR_FREE(secret);
1510
 
    if (sec)
1511
 
        virUnrefSecret(sec);
1512
 
 
1513
 
    return ret;
1514
 
 
1515
 
error:
1516
 
    ret = -1;
1517
 
    goto cleanup;
1518
 
}
1519
 
 
1520
 
static int qemuAddRBDHost(virDomainDiskDefPtr disk, char *hostport)
1521
 
{
1522
 
    char *port;
1523
 
 
1524
 
    disk->nhosts++;
1525
 
    if (VIR_REALLOC_N(disk->hosts, disk->nhosts) < 0)
1526
 
        goto no_memory;
1527
 
 
1528
 
    port = strstr(hostport, "\\:");
1529
 
    if (port) {
1530
 
        *port = '\0';
1531
 
        port += 2;
1532
 
        disk->hosts[disk->nhosts-1].port = strdup(port);
1533
 
        if (!disk->hosts[disk->nhosts-1].port)
1534
 
            goto no_memory;
1535
 
    } else {
1536
 
        disk->hosts[disk->nhosts-1].port = strdup("6789");
1537
 
        if (!disk->hosts[disk->nhosts-1].port)
1538
 
            goto no_memory;
1539
 
    }
1540
 
    disk->hosts[disk->nhosts-1].name = strdup(hostport);
1541
 
    if (!disk->hosts[disk->nhosts-1].name)
1542
 
        goto no_memory;
1543
 
    return 0;
1544
 
 
1545
 
no_memory:
1546
 
    virReportOOMError();
1547
 
    VIR_FREE(disk->hosts[disk->nhosts-1].port);
1548
 
    VIR_FREE(disk->hosts[disk->nhosts-1].name);
1549
 
    return -1;
1550
 
}
1551
 
 
1552
 
/* disk->src initially has everything after the rbd: prefix */
1553
 
static int qemuParseRBDString(virDomainDiskDefPtr disk)
1554
 
{
1555
 
    char *options = NULL;
1556
 
    char *p, *e, *next;
1557
 
 
1558
 
    p = strchr(disk->src, ':');
1559
 
    if (p) {
1560
 
        options = strdup(p + 1);
1561
 
        if (!options)
1562
 
            goto no_memory;
1563
 
        *p = '\0';
1564
 
    }
1565
 
 
1566
 
    /* options */
1567
 
    if (!options)
1568
 
        return 0; /* all done */
1569
 
 
1570
 
    p = options;
1571
 
    while (*p) {
1572
 
        /* find : delimiter or end of string */
1573
 
        for (e = p; *e && *e != ':'; ++e) {
1574
 
            if (*e == '\\') {
1575
 
                e++;
1576
 
                if (*e == '\0')
1577
 
                    break;
1578
 
            }
1579
 
        }
1580
 
        if (*e == '\0') {
1581
 
            next = e;    /* last kv pair */
1582
 
        } else {
1583
 
            next = e + 1;
1584
 
            *e = '\0';
1585
 
        }
1586
 
 
1587
 
        if (STRPREFIX(p, "id=")) {
1588
 
            disk->auth.username = strdup(p + strlen("id="));
1589
 
            if (!disk->auth.username)
1590
 
                goto no_memory;
1591
 
        }
1592
 
        if (STRPREFIX(p, "mon_host=")) {
1593
 
            char *h, *sep;
1594
 
 
1595
 
            h = p + strlen("mon_host=");
1596
 
            while (h < e) {
1597
 
                for (sep = h; sep < e; ++sep) {
1598
 
                    if (*sep == '\\' && (sep[1] == ',' ||
1599
 
                                         sep[1] == ';' ||
1600
 
                                         sep[1] == ' ')) {
1601
 
                        *sep = '\0';
1602
 
                        sep += 2;
1603
 
                        break;
1604
 
                    }
1605
 
                }
1606
 
                if (qemuAddRBDHost(disk, h) < 0) {
1607
 
                    return -1;
1608
 
                }
1609
 
                h = sep;
1610
 
            }
1611
 
        }
1612
 
 
1613
 
        p = next;
1614
 
    }
1615
 
    return 0;
1616
 
 
1617
 
no_memory:
1618
 
    virReportOOMError();
1619
 
    return -1;
1620
 
}
1621
 
 
1622
 
char *
1623
 
qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
1624
 
                  virDomainDiskDefPtr disk,
1625
 
                  bool bootable,
1626
 
                  virBitmapPtr qemuCaps)
1627
 
{
1628
 
    virBuffer opt = VIR_BUFFER_INITIALIZER;
1629
 
    const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
1630
 
    int idx = virDiskNameToIndex(disk->dst);
1631
 
    int busid = -1, unitid = -1;
1632
 
 
1633
 
    if (idx < 0) {
1634
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
1635
 
                        _("unsupported disk type '%s'"), disk->dst);
1636
 
        goto error;
1637
 
    }
1638
 
 
1639
 
    switch (disk->bus) {
1640
 
    case VIR_DOMAIN_DISK_BUS_SCSI:
1641
 
        if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
1642
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1643
 
                            _("unexpected address type for scsi disk"));
1644
 
            goto error;
1645
 
        }
1646
 
 
1647
 
        /* Setting bus= attr for SCSI drives, causes a controller
1648
 
         * to be created. Yes this is slightly odd. It is not possible
1649
 
         * to have > 1 bus on a SCSI controller (yet). */
1650
 
        if (disk->info.addr.drive.bus != 0) {
1651
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
1652
 
                            "%s", _("SCSI controller only supports 1 bus"));
1653
 
            goto error;
1654
 
        }
1655
 
        busid = disk->info.addr.drive.controller;
1656
 
        unitid = disk->info.addr.drive.unit;
1657
 
        break;
1658
 
 
1659
 
    case VIR_DOMAIN_DISK_BUS_IDE:
1660
 
        if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
1661
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1662
 
                            _("unexpected address type for ide disk"));
1663
 
            goto error;
1664
 
        }
1665
 
        /* We can only have 1 IDE controller (currently) */
1666
 
        if (disk->info.addr.drive.controller != 0) {
1667
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
1668
 
                            _("Only 1 %s controller is supported"), bus);
1669
 
            goto error;
1670
 
        }
1671
 
        busid = disk->info.addr.drive.bus;
1672
 
        unitid = disk->info.addr.drive.unit;
1673
 
        break;
1674
 
 
1675
 
    case VIR_DOMAIN_DISK_BUS_FDC:
1676
 
        if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
1677
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1678
 
                            _("unexpected address type for fdc disk"));
1679
 
            goto error;
1680
 
        }
1681
 
        /* We can only have 1 FDC controller (currently) */
1682
 
        if (disk->info.addr.drive.controller != 0) {
1683
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
1684
 
                            _("Only 1 %s controller is supported"), bus);
1685
 
            goto error;
1686
 
        }
1687
 
        /* We can only have 1 FDC bus (currently) */
1688
 
        if (disk->info.addr.drive.bus != 0) {
1689
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
1690
 
                            _("Only 1 %s bus is supported"), bus);
1691
 
            goto error;
1692
 
        }
1693
 
        unitid = disk->info.addr.drive.unit;
1694
 
 
1695
 
        break;
1696
 
 
1697
 
    case VIR_DOMAIN_DISK_BUS_VIRTIO:
1698
 
        /* Each virtio drive is a separate PCI device, no unit/busid or index */
1699
 
        idx = -1;
1700
 
        break;
1701
 
 
1702
 
    case VIR_DOMAIN_DISK_BUS_XEN:
1703
 
        /* Xen has no address type currently, so assign based on index */
1704
 
        break;
1705
 
    }
1706
 
 
1707
 
    /* disk->src is NULL when we use nbd disks */
1708
 
    if (disk->src || (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK &&
1709
 
                      disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_NBD)) {
1710
 
        if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) {
1711
 
            /* QEMU only supports magic FAT format for now */
1712
 
            if (disk->driverType &&
1713
 
                STRNEQ(disk->driverType, "fat")) {
1714
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
1715
 
                                _("unsupported disk driver type for '%s'"),
1716
 
                                disk->driverType);
1717
 
                goto error;
1718
 
            }
1719
 
            if (!disk->readonly) {
1720
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1721
 
                                _("cannot create virtual FAT disks in read-write mode"));
1722
 
                goto error;
1723
 
            }
1724
 
            if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
1725
 
                virBufferAsprintf(&opt, "file=fat:floppy:%s,", disk->src);
1726
 
            else
1727
 
                virBufferAsprintf(&opt, "file=fat:%s,", disk->src);
1728
 
        } else if (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK) {
1729
 
            switch (disk->protocol) {
1730
 
            case VIR_DOMAIN_DISK_PROTOCOL_NBD:
1731
 
                if (disk->nhosts != 1) {
1732
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
1733
 
                                    _("NBD accepts only one host"));
1734
 
                    goto error;
1735
 
                }
1736
 
                virBufferAsprintf(&opt, "file=nbd:%s:%s,",
1737
 
                                  disk->hosts->name, disk->hosts->port);
1738
 
                break;
1739
 
            case VIR_DOMAIN_DISK_PROTOCOL_RBD:
1740
 
                virBufferAddLit(&opt, "file=");
1741
 
                if (qemuBuildRBDString(conn, disk, &opt) < 0)
1742
 
                    goto error;
1743
 
                virBufferAddChar(&opt, ',');
1744
 
                break;
1745
 
            case VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG:
1746
 
                if (disk->nhosts == 0)
1747
 
                    virBufferAsprintf(&opt, "file=sheepdog:%s,", disk->src);
1748
 
                else
1749
 
                    /* only one host is supported now */
1750
 
                    virBufferAsprintf(&opt, "file=sheepdog:%s:%s:%s,",
1751
 
                                      disk->hosts->name, disk->hosts->port,
1752
 
                                      disk->src);
1753
 
                break;
1754
 
            }
1755
 
        } else {
1756
 
            virBufferAsprintf(&opt, "file=%s,", disk->src);
1757
 
        }
1758
 
    }
1759
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
1760
 
        virBufferAddLit(&opt, "if=none");
1761
 
    else
1762
 
        virBufferAsprintf(&opt, "if=%s", bus);
1763
 
 
1764
 
    if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
1765
 
        virBufferAddLit(&opt, ",media=cdrom");
1766
 
 
1767
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
1768
 
        virBufferAsprintf(&opt, ",id=%s%s", QEMU_DRIVE_HOST_PREFIX, disk->info.alias);
1769
 
    } else {
1770
 
        if (busid == -1 && unitid == -1) {
1771
 
            if (idx != -1)
1772
 
                virBufferAsprintf(&opt, ",index=%d", idx);
1773
 
        } else {
1774
 
            if (busid != -1)
1775
 
                virBufferAsprintf(&opt, ",bus=%d", busid);
1776
 
            if (unitid != -1)
1777
 
                virBufferAsprintf(&opt, ",unit=%d", unitid);
1778
 
        }
1779
 
    }
1780
 
    if (bootable &&
1781
 
        qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_BOOT) &&
1782
 
        disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
1783
 
        disk->bus != VIR_DOMAIN_DISK_BUS_IDE)
1784
 
        virBufferAddLit(&opt, ",boot=on");
1785
 
    if (disk->readonly &&
1786
 
        qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_READONLY))
1787
 
        virBufferAddLit(&opt, ",readonly=on");
1788
 
    if (disk->transient) {
1789
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1790
 
                        _("transient disks not supported yet"));
1791
 
        goto error;
1792
 
    }
1793
 
    if (disk->driverType && *disk->driverType != '\0' &&
1794
 
        disk->type != VIR_DOMAIN_DISK_TYPE_DIR &&
1795
 
        qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_FORMAT))
1796
 
        virBufferAsprintf(&opt, ",format=%s", disk->driverType);
1797
 
    if (disk->serial &&
1798
 
        qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL)) {
1799
 
        if (qemuSafeSerialParamValue(disk->serial) < 0)
1800
 
            goto error;
1801
 
        virBufferAsprintf(&opt, ",serial=%s", disk->serial);
1802
 
    }
1803
 
 
1804
 
    if (disk->cachemode) {
1805
 
        const char *mode = NULL;
1806
 
 
1807
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_V2)) {
1808
 
            mode = qemuDiskCacheV2TypeToString(disk->cachemode);
1809
 
 
1810
 
            if (disk->cachemode == VIR_DOMAIN_DISK_CACHE_DIRECTSYNC &&
1811
 
                !qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_DIRECTSYNC)) {
1812
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1813
 
                                _("disk cache mode 'directsync' is not "
1814
 
                                  "supported by this QEMU"));
1815
 
                goto error;
1816
 
            } else if (disk->cachemode == VIR_DOMAIN_DISK_CACHE_UNSAFE &&
1817
 
                !qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_CACHE_UNSAFE)) {
1818
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1819
 
                                _("disk cache mode 'unsafe' is not "
1820
 
                                  "supported by this QEMU"));
1821
 
                goto error;
1822
 
            }
1823
 
        } else {
1824
 
            mode = qemuDiskCacheV1TypeToString(disk->cachemode);
1825
 
        }
1826
 
 
1827
 
        virBufferAsprintf(&opt, ",cache=%s", mode);
1828
 
    } else if (disk->shared && !disk->readonly) {
1829
 
        virBufferAddLit(&opt, ",cache=off");
1830
 
    }
1831
 
 
1832
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_MONITOR_JSON)) {
1833
 
        const char *wpolicy = NULL, *rpolicy = NULL;
1834
 
 
1835
 
        if (disk->error_policy)
1836
 
            wpolicy = virDomainDiskErrorPolicyTypeToString(disk->error_policy);
1837
 
        if (disk->rerror_policy)
1838
 
            rpolicy = virDomainDiskErrorPolicyTypeToString(disk->rerror_policy);
1839
 
 
1840
 
        if (disk->error_policy == VIR_DOMAIN_DISK_ERROR_POLICY_ENOSPACE) {
1841
 
            /* in the case of enospace, the option is spelled
1842
 
             * differently in qemu, and it's only valid for werror,
1843
 
             * not for rerror, so leave leave rerror NULL.
1844
 
             */
1845
 
            wpolicy = "enospc";
1846
 
        } else if (!rpolicy) {
1847
 
            /* for other policies, rpolicy can match wpolicy */
1848
 
            rpolicy = wpolicy;
1849
 
        }
1850
 
 
1851
 
        if (wpolicy)
1852
 
            virBufferAsprintf(&opt, ",werror=%s", wpolicy);
1853
 
        if (rpolicy)
1854
 
            virBufferAsprintf(&opt, ",rerror=%s", rpolicy);
1855
 
    }
1856
 
 
1857
 
    if (disk->iomode) {
1858
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_AIO)) {
1859
 
            virBufferAsprintf(&opt, ",aio=%s",
1860
 
                              virDomainDiskIoTypeToString(disk->iomode));
1861
 
        } else {
1862
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1863
 
                            _("disk aio mode not supported with this "
1864
 
                              "QEMU binary"));
1865
 
            goto error;
1866
 
        }
1867
 
    }
1868
 
 
1869
 
    /* block I/O throttling */
1870
 
    if (disk->blkdeviotune.total_bytes_sec) {
1871
 
        virBufferAsprintf(&opt, ",bps=%llu",
1872
 
                          disk->blkdeviotune.total_bytes_sec);
1873
 
    }
1874
 
 
1875
 
    if (disk->blkdeviotune.read_bytes_sec) {
1876
 
        virBufferAsprintf(&opt, ",bps_rd=%llu",
1877
 
                          disk->blkdeviotune.read_bytes_sec);
1878
 
    }
1879
 
 
1880
 
    if (disk->blkdeviotune.write_bytes_sec) {
1881
 
        virBufferAsprintf(&opt, ",bps_wr=%llu",
1882
 
                          disk->blkdeviotune.write_bytes_sec);
1883
 
    }
1884
 
 
1885
 
    if (disk->blkdeviotune.total_iops_sec) {
1886
 
        virBufferAsprintf(&opt, ",iops=%llu",
1887
 
                          disk->blkdeviotune.total_iops_sec);
1888
 
    }
1889
 
 
1890
 
    if (disk->blkdeviotune.read_iops_sec) {
1891
 
        virBufferAsprintf(&opt, ",iops_rd=%llu",
1892
 
                          disk->blkdeviotune.read_iops_sec);
1893
 
    }
1894
 
 
1895
 
    if (disk->blkdeviotune.write_iops_sec) {
1896
 
        virBufferAsprintf(&opt, ",iops_wr=%llu",
1897
 
                          disk->blkdeviotune.write_iops_sec);
1898
 
    }
1899
 
 
1900
 
    if (virBufferError(&opt)) {
1901
 
        virReportOOMError();
1902
 
        goto error;
1903
 
    }
1904
 
 
1905
 
    return virBufferContentAndReset(&opt);
1906
 
 
1907
 
error:
1908
 
    virBufferFreeAndReset(&opt);
1909
 
    return NULL;
1910
 
}
1911
 
 
1912
 
 
1913
 
char *
1914
 
qemuBuildDriveDevStr(virDomainDiskDefPtr disk,
1915
 
                     int bootindex,
1916
 
                     virBitmapPtr qemuCaps)
1917
 
{
1918
 
    virBuffer opt = VIR_BUFFER_INITIALIZER;
1919
 
    const char *bus = virDomainDiskQEMUBusTypeToString(disk->bus);
1920
 
    int idx = virDiskNameToIndex(disk->dst);
1921
 
 
1922
 
    if (idx < 0) {
1923
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
1924
 
                        _("unsupported disk type '%s'"), disk->dst);
1925
 
        goto error;
1926
 
    }
1927
 
 
1928
 
    switch (disk->bus) {
1929
 
    case VIR_DOMAIN_DISK_BUS_IDE:
1930
 
        virBufferAddLit(&opt, "ide-drive");
1931
 
        virBufferAsprintf(&opt, ",bus=ide.%d,unit=%d",
1932
 
                          disk->info.addr.drive.bus,
1933
 
                          disk->info.addr.drive.unit);
1934
 
        break;
1935
 
    case VIR_DOMAIN_DISK_BUS_SCSI:
1936
 
        virBufferAddLit(&opt, "scsi-disk");
1937
 
        virBufferAsprintf(&opt, ",bus=scsi%d.%d,scsi-id=%d",
1938
 
                          disk->info.addr.drive.controller,
1939
 
                          disk->info.addr.drive.bus,
1940
 
                          disk->info.addr.drive.unit);
1941
 
        break;
1942
 
    case VIR_DOMAIN_DISK_BUS_SATA:
1943
 
        virBufferAddLit(&opt, "ide-drive");
1944
 
        virBufferAsprintf(&opt, ",bus=ahci%d.%d",
1945
 
                          disk->info.addr.drive.controller,
1946
 
                          disk->info.addr.drive.unit);
1947
 
        break;
1948
 
    case VIR_DOMAIN_DISK_BUS_VIRTIO:
1949
 
        virBufferAddLit(&opt, "virtio-blk-pci");
1950
 
        qemuBuildIoEventFdStr(&opt, disk->ioeventfd, qemuCaps);
1951
 
        if (disk->event_idx &&
1952
 
            qemuCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BLK_EVENT_IDX)) {
1953
 
            virBufferAsprintf(&opt, ",event_idx=%s",
1954
 
                              virDomainVirtioEventIdxTypeToString(disk->event_idx));
1955
 
        }
1956
 
        if (qemuBuildDeviceAddressStr(&opt, &disk->info, qemuCaps) < 0)
1957
 
            goto error;
1958
 
        break;
1959
 
    case VIR_DOMAIN_DISK_BUS_USB:
1960
 
        virBufferAddLit(&opt, "usb-storage");
1961
 
        break;
1962
 
    default:
1963
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
1964
 
                        _("unsupported disk bus '%s' with device setup"), bus);
1965
 
        goto error;
1966
 
    }
1967
 
    virBufferAsprintf(&opt, ",drive=%s%s", QEMU_DRIVE_HOST_PREFIX, disk->info.alias);
1968
 
    virBufferAsprintf(&opt, ",id=%s", disk->info.alias);
1969
 
    if (bootindex && qemuCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX))
1970
 
        virBufferAsprintf(&opt, ",bootindex=%d", bootindex);
1971
 
 
1972
 
    if (virBufferError(&opt)) {
1973
 
        virReportOOMError();
1974
 
        goto error;
1975
 
    }
1976
 
 
1977
 
    return virBufferContentAndReset(&opt);
1978
 
 
1979
 
error:
1980
 
    virBufferFreeAndReset(&opt);
1981
 
    return NULL;
1982
 
}
1983
 
 
1984
 
 
1985
 
char *qemuBuildFSStr(virDomainFSDefPtr fs,
1986
 
                     virBitmapPtr qemuCaps ATTRIBUTE_UNUSED)
1987
 
{
1988
 
    virBuffer opt = VIR_BUFFER_INITIALIZER;
1989
 
    const char *driver = qemuDomainFSDriverTypeToString(fs->fsdriver);
1990
 
 
1991
 
    if (fs->type != VIR_DOMAIN_FS_TYPE_MOUNT) {
1992
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1993
 
                        _("only supports mount filesystem type"));
1994
 
        goto error;
1995
 
    }
1996
 
 
1997
 
    if (!driver) {
1998
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
1999
 
                        _("Filesystem driver type not supported"));
2000
 
        goto error;
2001
 
    }
2002
 
    virBufferAdd(&opt, driver, -1);
2003
 
 
2004
 
    if (fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_MAPPED) {
2005
 
        virBufferAddLit(&opt, ",security_model=mapped");
2006
 
    } else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) {
2007
 
        virBufferAddLit(&opt, ",security_model=passthrough");
2008
 
    } else if(fs->accessmode == VIR_DOMAIN_FS_ACCESSMODE_SQUASH) {
2009
 
        virBufferAddLit(&opt, ",security_model=none");
2010
 
    }
2011
 
    virBufferAsprintf(&opt, ",id=%s%s", QEMU_FSDEV_HOST_PREFIX, fs->info.alias);
2012
 
    virBufferAsprintf(&opt, ",path=%s", fs->src);
2013
 
 
2014
 
    if (virBufferError(&opt)) {
2015
 
        virReportOOMError();
2016
 
        goto error;
2017
 
    }
2018
 
 
2019
 
    return virBufferContentAndReset(&opt);
2020
 
 
2021
 
error:
2022
 
    virBufferFreeAndReset(&opt);
2023
 
    return NULL;
2024
 
}
2025
 
 
2026
 
 
2027
 
char *
2028
 
qemuBuildFSDevStr(virDomainFSDefPtr fs,
2029
 
                  virBitmapPtr qemuCaps)
2030
 
{
2031
 
    virBuffer opt = VIR_BUFFER_INITIALIZER;
2032
 
 
2033
 
    if (fs->type != VIR_DOMAIN_FS_TYPE_MOUNT) {
2034
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
2035
 
                        _("can only passthrough directories"));
2036
 
        goto error;
2037
 
    }
2038
 
 
2039
 
    virBufferAddLit(&opt, "virtio-9p-pci");
2040
 
    virBufferAsprintf(&opt, ",id=%s", fs->info.alias);
2041
 
    virBufferAsprintf(&opt, ",fsdev=%s%s", QEMU_FSDEV_HOST_PREFIX, fs->info.alias);
2042
 
    virBufferAsprintf(&opt, ",mount_tag=%s", fs->dst);
2043
 
 
2044
 
    if (qemuBuildDeviceAddressStr(&opt, &fs->info, qemuCaps) < 0)
2045
 
        goto error;
2046
 
 
2047
 
    if (virBufferError(&opt)) {
2048
 
        virReportOOMError();
2049
 
        goto error;
2050
 
    }
2051
 
 
2052
 
    return virBufferContentAndReset(&opt);
2053
 
 
2054
 
error:
2055
 
    virBufferFreeAndReset(&opt);
2056
 
    return NULL;
2057
 
}
2058
 
 
2059
 
 
2060
 
static int
2061
 
qemuControllerModelUSBToCaps(int model)
2062
 
{
2063
 
    switch (model) {
2064
 
    case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI:
2065
 
        return QEMU_CAPS_PIIX3_USB_UHCI;
2066
 
    case VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI:
2067
 
        return QEMU_CAPS_PIIX4_USB_UHCI;
2068
 
    case VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI:
2069
 
        return QEMU_CAPS_USB_EHCI;
2070
 
    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1:
2071
 
    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI1:
2072
 
    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI2:
2073
 
    case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3:
2074
 
        return QEMU_CAPS_ICH9_USB_EHCI1;
2075
 
    case VIR_DOMAIN_CONTROLLER_MODEL_USB_VT82C686B_UHCI:
2076
 
        return QEMU_CAPS_VT82C686B_USB_UHCI;
2077
 
    case VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI:
2078
 
        return QEMU_CAPS_PCI_OHCI;
2079
 
    default:
2080
 
        return -1;
2081
 
    }
2082
 
}
2083
 
 
2084
 
 
2085
 
static int
2086
 
qemuBuildUSBControllerDevStr(virDomainControllerDefPtr def,
2087
 
                             virBitmapPtr qemuCaps,
2088
 
                             virBuffer *buf)
2089
 
{
2090
 
    const char *smodel;
2091
 
    int model, caps;
2092
 
 
2093
 
    model = def->model;
2094
 
    if (model == -1)
2095
 
        model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI;
2096
 
 
2097
 
    smodel = qemuControllerModelUSBTypeToString(model);
2098
 
    caps = qemuControllerModelUSBToCaps(model);
2099
 
 
2100
 
    if (caps == -1 || !qemuCapsGet(qemuCaps, caps)) {
2101
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2102
 
                        _("%s not supported in this QEMU binary"), smodel);
2103
 
        return -1;
2104
 
    }
2105
 
 
2106
 
    virBufferAsprintf(buf, "%s", smodel);
2107
 
 
2108
 
    if (def->info.mastertype == VIR_DOMAIN_CONTROLLER_MASTER_USB) {
2109
 
        virBufferAsprintf(buf, ",masterbus=");
2110
 
        qemuUsbId(buf, def->idx);
2111
 
        virBufferAsprintf(buf, ".0,firstport=%d", def->info.master.usb.startport);
2112
 
    } else {
2113
 
        virBufferAsprintf(buf, ",id=");
2114
 
        qemuUsbId(buf, def->idx);
2115
 
    }
2116
 
 
2117
 
    return 0;
2118
 
}
2119
 
 
2120
 
char *
2121
 
qemuBuildControllerDevStr(virDomainControllerDefPtr def,
2122
 
                          virBitmapPtr qemuCaps,
2123
 
                          int *nusbcontroller)
2124
 
{
2125
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2126
 
 
2127
 
    switch (def->type) {
2128
 
    case VIR_DOMAIN_CONTROLLER_TYPE_SCSI:
2129
 
        virBufferAddLit(&buf, "lsi");
2130
 
        virBufferAsprintf(&buf, ",id=scsi%d", def->idx);
2131
 
        break;
2132
 
 
2133
 
    case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL:
2134
 
        if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
2135
 
            virBufferAddLit(&buf, "virtio-serial-pci");
2136
 
        } else {
2137
 
            virBufferAddLit(&buf, "virtio-serial");
2138
 
        }
2139
 
        virBufferAsprintf(&buf, ",id=" QEMU_VIRTIO_SERIAL_PREFIX "%d",
2140
 
                          def->idx);
2141
 
        if (def->opts.vioserial.ports != -1) {
2142
 
            virBufferAsprintf(&buf, ",max_ports=%d",
2143
 
                              def->opts.vioserial.ports);
2144
 
        }
2145
 
        if (def->opts.vioserial.vectors != -1) {
2146
 
            virBufferAsprintf(&buf, ",vectors=%d",
2147
 
                              def->opts.vioserial.vectors);
2148
 
        }
2149
 
        break;
2150
 
 
2151
 
    case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
2152
 
        virBufferAsprintf(&buf, "usb-ccid,id=ccid%d", def->idx);
2153
 
        break;
2154
 
 
2155
 
    case VIR_DOMAIN_CONTROLLER_TYPE_SATA:
2156
 
        virBufferAsprintf(&buf, "ahci,id=ahci%d", def->idx);
2157
 
        break;
2158
 
 
2159
 
    case VIR_DOMAIN_CONTROLLER_TYPE_USB:
2160
 
        if (qemuBuildUSBControllerDevStr(def, qemuCaps, &buf) == -1)
2161
 
            goto error;
2162
 
 
2163
 
        if (nusbcontroller)
2164
 
            *nusbcontroller += 1;
2165
 
 
2166
 
        break;
2167
 
 
2168
 
    /* We always get an IDE controller, whether we want it or not. */
2169
 
    case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
2170
 
    default:
2171
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2172
 
                        _("Unknown controller type: %s"),
2173
 
                        virDomainControllerTypeToString(def->type));
2174
 
        goto error;
2175
 
    }
2176
 
 
2177
 
    if (qemuBuildDeviceAddressStr(&buf, &def->info, qemuCaps) < 0)
2178
 
        goto error;
2179
 
 
2180
 
    if (virBufferError(&buf)) {
2181
 
        virReportOOMError();
2182
 
        goto error;
2183
 
    }
2184
 
 
2185
 
    return virBufferContentAndReset(&buf);
2186
 
 
2187
 
error:
2188
 
    virBufferFreeAndReset(&buf);
2189
 
    return NULL;
2190
 
}
2191
 
 
2192
 
 
2193
 
char *
2194
 
qemuBuildNicStr(virDomainNetDefPtr net,
2195
 
                const char *prefix,
2196
 
                int vlan)
2197
 
{
2198
 
    char *str;
2199
 
    if (virAsprintf(&str,
2200
 
                    "%smacaddr=%02x:%02x:%02x:%02x:%02x:%02x,vlan=%d%s%s%s%s",
2201
 
                    prefix ? prefix : "",
2202
 
                    net->mac[0], net->mac[1],
2203
 
                    net->mac[2], net->mac[3],
2204
 
                    net->mac[4], net->mac[5],
2205
 
                    vlan,
2206
 
                    (net->model ? ",model=" : ""),
2207
 
                    (net->model ? net->model : ""),
2208
 
                    (net->info.alias ? ",name=" : ""),
2209
 
                    (net->info.alias ? net->info.alias : "")) < 0) {
2210
 
        virReportOOMError();
2211
 
        return NULL;
2212
 
    }
2213
 
 
2214
 
    return str;
2215
 
}
2216
 
 
2217
 
 
2218
 
char *
2219
 
qemuBuildNicDevStr(virDomainNetDefPtr net,
2220
 
                   int vlan,
2221
 
                   int bootindex,
2222
 
                   virBitmapPtr qemuCaps)
2223
 
{
2224
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2225
 
    const char *nic;
2226
 
    bool usingVirtio = false;
2227
 
 
2228
 
    if (!net->model) {
2229
 
        nic = "rtl8139";
2230
 
    } else if (STREQ(net->model, "virtio")) {
2231
 
        nic = "virtio-net-pci";
2232
 
        usingVirtio = true;
2233
 
    } else {
2234
 
        nic = net->model;
2235
 
    }
2236
 
 
2237
 
    virBufferAdd(&buf, nic, strlen(nic));
2238
 
    if (usingVirtio && net->driver.virtio.txmode) {
2239
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_TX_ALG)) {
2240
 
            virBufferAddLit(&buf, ",tx=");
2241
 
            switch (net->driver.virtio.txmode) {
2242
 
                case VIR_DOMAIN_NET_VIRTIO_TX_MODE_IOTHREAD:
2243
 
                    virBufferAddLit(&buf, "bh");
2244
 
                    break;
2245
 
 
2246
 
                case VIR_DOMAIN_NET_VIRTIO_TX_MODE_TIMER:
2247
 
                    virBufferAddLit(&buf, "timer");
2248
 
                    break;
2249
 
                default:
2250
 
                    /* this should never happen, if it does, we need
2251
 
                     * to add another case to this switch.
2252
 
                     */
2253
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
2254
 
                                    _("unrecognized virtio-net-pci 'tx' option"));
2255
 
                    goto error;
2256
 
            }
2257
 
        } else {
2258
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
2259
 
                            _("virtio-net-pci 'tx' option not supported in this QEMU binary"));
2260
 
            goto error;
2261
 
        }
2262
 
    }
2263
 
    if (usingVirtio) {
2264
 
        qemuBuildIoEventFdStr(&buf, net->driver.virtio.ioeventfd, qemuCaps);
2265
 
        if (net->driver.virtio.event_idx &&
2266
 
            qemuCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_NET_EVENT_IDX)) {
2267
 
            virBufferAsprintf(&buf, ",event_idx=%s",
2268
 
                              virDomainVirtioEventIdxTypeToString(net->driver.virtio.event_idx));
2269
 
        }
2270
 
    }
2271
 
    if (vlan == -1)
2272
 
        virBufferAsprintf(&buf, ",netdev=host%s", net->info.alias);
2273
 
    else
2274
 
        virBufferAsprintf(&buf, ",vlan=%d", vlan);
2275
 
    virBufferAsprintf(&buf, ",id=%s", net->info.alias);
2276
 
    virBufferAsprintf(&buf, ",mac=%02x:%02x:%02x:%02x:%02x:%02x",
2277
 
                      net->mac[0], net->mac[1],
2278
 
                      net->mac[2], net->mac[3],
2279
 
                      net->mac[4], net->mac[5]);
2280
 
    if (qemuBuildDeviceAddressStr(&buf, &net->info, qemuCaps) < 0)
2281
 
        goto error;
2282
 
    if (bootindex && qemuCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX))
2283
 
        virBufferAsprintf(&buf, ",bootindex=%d", bootindex);
2284
 
 
2285
 
    if (virBufferError(&buf)) {
2286
 
        virReportOOMError();
2287
 
        goto error;
2288
 
    }
2289
 
 
2290
 
    return virBufferContentAndReset(&buf);
2291
 
 
2292
 
error:
2293
 
    virBufferFreeAndReset(&buf);
2294
 
    return NULL;
2295
 
}
2296
 
 
2297
 
 
2298
 
char *
2299
 
qemuBuildHostNetStr(virDomainNetDefPtr net,
2300
 
                    char type_sep,
2301
 
                    int vlan,
2302
 
                    const char *tapfd,
2303
 
                    const char *vhostfd)
2304
 
{
2305
 
    bool is_tap = false;
2306
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2307
 
 
2308
 
    switch (virDomainNetGetActualType(net)) {
2309
 
    case VIR_DOMAIN_NET_TYPE_NETWORK:
2310
 
    case VIR_DOMAIN_NET_TYPE_BRIDGE:
2311
 
    case VIR_DOMAIN_NET_TYPE_DIRECT:
2312
 
        virBufferAddLit(&buf, "tap");
2313
 
        virBufferAsprintf(&buf, "%cfd=%s", type_sep, tapfd);
2314
 
        type_sep = ',';
2315
 
        is_tap = true;
2316
 
        break;
2317
 
 
2318
 
    case VIR_DOMAIN_NET_TYPE_ETHERNET:
2319
 
        virBufferAddLit(&buf, "tap");
2320
 
        if (net->ifname) {
2321
 
            virBufferAsprintf(&buf, "%cifname=%s", type_sep, net->ifname);
2322
 
            type_sep = ',';
2323
 
        }
2324
 
        if (net->data.ethernet.script) {
2325
 
            virBufferAsprintf(&buf, "%cscript=%s", type_sep,
2326
 
                              net->data.ethernet.script);
2327
 
            type_sep = ',';
2328
 
        }
2329
 
        is_tap = true;
2330
 
        break;
2331
 
 
2332
 
    case VIR_DOMAIN_NET_TYPE_CLIENT:
2333
 
    case VIR_DOMAIN_NET_TYPE_SERVER:
2334
 
    case VIR_DOMAIN_NET_TYPE_MCAST:
2335
 
        virBufferAddLit(&buf, "socket");
2336
 
        switch (virDomainNetGetActualType(net)) {
2337
 
        case VIR_DOMAIN_NET_TYPE_CLIENT:
2338
 
            virBufferAsprintf(&buf, "%cconnect=%s:%d",
2339
 
                              type_sep,
2340
 
                              net->data.socket.address,
2341
 
                              net->data.socket.port);
2342
 
            break;
2343
 
        case VIR_DOMAIN_NET_TYPE_SERVER:
2344
 
            virBufferAsprintf(&buf, "%clisten=%s:%d",
2345
 
                              type_sep,
2346
 
                              net->data.socket.address,
2347
 
                              net->data.socket.port);
2348
 
            break;
2349
 
        case VIR_DOMAIN_NET_TYPE_MCAST:
2350
 
            virBufferAsprintf(&buf, "%cmcast=%s:%d",
2351
 
                              type_sep,
2352
 
                              net->data.socket.address,
2353
 
                              net->data.socket.port);
2354
 
            break;
2355
 
        case VIR_DOMAIN_NET_TYPE_USER:
2356
 
        case VIR_DOMAIN_NET_TYPE_ETHERNET:
2357
 
        case VIR_DOMAIN_NET_TYPE_NETWORK:
2358
 
        case VIR_DOMAIN_NET_TYPE_BRIDGE:
2359
 
        case VIR_DOMAIN_NET_TYPE_INTERNAL:
2360
 
        case VIR_DOMAIN_NET_TYPE_DIRECT:
2361
 
        case VIR_DOMAIN_NET_TYPE_LAST:
2362
 
            break;
2363
 
        }
2364
 
        type_sep = ',';
2365
 
        break;
2366
 
 
2367
 
    case VIR_DOMAIN_NET_TYPE_USER:
2368
 
    default:
2369
 
        virBufferAddLit(&buf, "user");
2370
 
        break;
2371
 
    }
2372
 
 
2373
 
    if (vlan >= 0) {
2374
 
        virBufferAsprintf(&buf, "%cvlan=%d", type_sep, vlan);
2375
 
        if (net->info.alias)
2376
 
            virBufferAsprintf(&buf, ",name=host%s",
2377
 
                              net->info.alias);
2378
 
    } else {
2379
 
        virBufferAsprintf(&buf, "%cid=host%s",
2380
 
                          type_sep, net->info.alias);
2381
 
    }
2382
 
 
2383
 
    if (is_tap) {
2384
 
        if (vhostfd && *vhostfd)
2385
 
            virBufferAsprintf(&buf, ",vhost=on,vhostfd=%s", vhostfd);
2386
 
        if (net->tune.sndbuf_specified)
2387
 
            virBufferAsprintf(&buf, ",sndbuf=%lu", net->tune.sndbuf);
2388
 
    }
2389
 
 
2390
 
    if (virBufferError(&buf)) {
2391
 
        virBufferFreeAndReset(&buf);
2392
 
        virReportOOMError();
2393
 
        return NULL;
2394
 
    }
2395
 
 
2396
 
    return virBufferContentAndReset(&buf);
2397
 
}
2398
 
 
2399
 
 
2400
 
char *
2401
 
qemuBuildWatchdogDevStr(virDomainWatchdogDefPtr dev,
2402
 
                        virBitmapPtr qemuCaps)
2403
 
{
2404
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2405
 
 
2406
 
    const char *model = virDomainWatchdogModelTypeToString(dev->model);
2407
 
    if (!model) {
2408
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
2409
 
                        "%s", _("missing watchdog model"));
2410
 
        goto error;
2411
 
    }
2412
 
 
2413
 
    virBufferAsprintf(&buf, "%s,id=%s", model, dev->info.alias);
2414
 
    if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2415
 
        goto error;
2416
 
 
2417
 
    if (virBufferError(&buf)) {
2418
 
        virReportOOMError();
2419
 
        goto error;
2420
 
    }
2421
 
 
2422
 
    return virBufferContentAndReset(&buf);
2423
 
 
2424
 
error:
2425
 
    virBufferFreeAndReset(&buf);
2426
 
    return NULL;
2427
 
}
2428
 
 
2429
 
 
2430
 
char *
2431
 
qemuBuildMemballoonDevStr(virDomainMemballoonDefPtr dev,
2432
 
                          virBitmapPtr qemuCaps)
2433
 
{
2434
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2435
 
 
2436
 
    virBufferAddLit(&buf, "virtio-balloon-pci");
2437
 
    virBufferAsprintf(&buf, ",id=%s", dev->info.alias);
2438
 
    if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2439
 
        goto error;
2440
 
 
2441
 
    if (virBufferError(&buf)) {
2442
 
        virReportOOMError();
2443
 
        goto error;
2444
 
    }
2445
 
 
2446
 
    return virBufferContentAndReset(&buf);
2447
 
 
2448
 
error:
2449
 
    virBufferFreeAndReset(&buf);
2450
 
    return NULL;
2451
 
}
2452
 
 
2453
 
 
2454
 
char *
2455
 
qemuBuildUSBInputDevStr(virDomainInputDefPtr dev,
2456
 
                        virBitmapPtr qemuCaps)
2457
 
{
2458
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2459
 
 
2460
 
    virBufferAsprintf(&buf, "%s,id=%s",
2461
 
                      dev->type == VIR_DOMAIN_INPUT_TYPE_MOUSE ?
2462
 
                      "usb-mouse" : "usb-tablet", dev->info.alias);
2463
 
 
2464
 
    if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2465
 
        goto error;
2466
 
 
2467
 
    if (virBufferError(&buf)) {
2468
 
        virReportOOMError();
2469
 
        goto error;
2470
 
    }
2471
 
 
2472
 
    return virBufferContentAndReset(&buf);
2473
 
 
2474
 
error:
2475
 
    virBufferFreeAndReset(&buf);
2476
 
    return NULL;
2477
 
}
2478
 
 
2479
 
 
2480
 
char *
2481
 
qemuBuildSoundDevStr(virDomainSoundDefPtr sound,
2482
 
                     virBitmapPtr qemuCaps)
2483
 
{
2484
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2485
 
    const char *model = virDomainSoundModelTypeToString(sound->model);
2486
 
 
2487
 
    if (!model) {
2488
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
2489
 
                        "%s", _("invalid sound model"));
2490
 
        goto error;
2491
 
    }
2492
 
 
2493
 
    /* Hack for weirdly unusual devices name in QEMU */
2494
 
    if (STREQ(model, "es1370"))
2495
 
        model = "ES1370";
2496
 
    else if (STREQ(model, "ac97"))
2497
 
        model = "AC97";
2498
 
    else if (STREQ(model, "ich6"))
2499
 
        model = "intel-hda";
2500
 
 
2501
 
    virBufferAsprintf(&buf, "%s,id=%s", model, sound->info.alias);
2502
 
    if (qemuBuildDeviceAddressStr(&buf, &sound->info, qemuCaps) < 0)
2503
 
        goto error;
2504
 
 
2505
 
    if (virBufferError(&buf)) {
2506
 
        virReportOOMError();
2507
 
        goto error;
2508
 
    }
2509
 
 
2510
 
    return virBufferContentAndReset(&buf);
2511
 
 
2512
 
error:
2513
 
    virBufferFreeAndReset(&buf);
2514
 
    return NULL;
2515
 
}
2516
 
 
2517
 
static char *
2518
 
qemuBuildSoundCodecStr(virDomainSoundDefPtr sound,
2519
 
                       const char *codec)
2520
 
{
2521
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2522
 
    int cad = 0;
2523
 
 
2524
 
    virBufferAsprintf(&buf, "%s,id=%s-codec%d,bus=%s.0,cad=%d",
2525
 
                      codec, sound->info.alias, cad, sound->info.alias, cad);
2526
 
 
2527
 
    if (virBufferError(&buf)) {
2528
 
        virReportOOMError();
2529
 
        goto error;
2530
 
    }
2531
 
 
2532
 
    return virBufferContentAndReset(&buf);
2533
 
 
2534
 
error:
2535
 
    virBufferFreeAndReset(&buf);
2536
 
    return NULL;
2537
 
}
2538
 
 
2539
 
static char *
2540
 
qemuBuildVideoDevStr(virDomainVideoDefPtr video,
2541
 
                     virBitmapPtr qemuCaps)
2542
 
{
2543
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2544
 
    const char *model = qemuVideoTypeToString(video->type);
2545
 
 
2546
 
    if (!model) {
2547
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
2548
 
                        "%s", _("invalid video model"));
2549
 
        goto error;
2550
 
    }
2551
 
 
2552
 
    virBufferAsprintf(&buf, "%s,id=%s", model, video->info.alias);
2553
 
 
2554
 
    if (video->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
2555
 
        if (video->vram > (UINT_MAX / 1024)) {
2556
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2557
 
                            _("value for 'vram' must be less than '%u'"),
2558
 
                            UINT_MAX / 1024);
2559
 
            goto error;
2560
 
        }
2561
 
 
2562
 
        /* QEMU accepts bytes for vram_size. */
2563
 
        virBufferAsprintf(&buf, ",vram_size=%u", video->vram * 1024);
2564
 
    }
2565
 
 
2566
 
    if (qemuBuildDeviceAddressStr(&buf, &video->info, qemuCaps) < 0)
2567
 
        goto error;
2568
 
 
2569
 
    if (virBufferError(&buf)) {
2570
 
        virReportOOMError();
2571
 
        goto error;
2572
 
    }
2573
 
 
2574
 
    return virBufferContentAndReset(&buf);
2575
 
 
2576
 
error:
2577
 
    virBufferFreeAndReset(&buf);
2578
 
    return NULL;
2579
 
}
2580
 
 
2581
 
 
2582
 
int
2583
 
qemuOpenPCIConfig(virDomainHostdevDefPtr dev)
2584
 
{
2585
 
    char *path = NULL;
2586
 
    int configfd = -1;
2587
 
 
2588
 
    if (virAsprintf(&path, "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/config",
2589
 
                    dev->source.subsys.u.pci.domain,
2590
 
                    dev->source.subsys.u.pci.bus,
2591
 
                    dev->source.subsys.u.pci.slot,
2592
 
                    dev->source.subsys.u.pci.function) < 0) {
2593
 
        virReportOOMError();
2594
 
        return -1;
2595
 
    }
2596
 
 
2597
 
    configfd = open(path, O_RDWR, 0);
2598
 
 
2599
 
    if (configfd < 0)
2600
 
        virReportSystemError(errno, _("Failed opening %s"), path);
2601
 
 
2602
 
    VIR_FREE(path);
2603
 
 
2604
 
    return configfd;
2605
 
}
2606
 
 
2607
 
char *
2608
 
qemuBuildPCIHostdevDevStr(virDomainHostdevDefPtr dev, const char *configfd,
2609
 
                          virBitmapPtr qemuCaps)
2610
 
{
2611
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2612
 
 
2613
 
    virBufferAddLit(&buf, "pci-assign");
2614
 
    virBufferAsprintf(&buf, ",host=%.2x:%.2x.%.1x",
2615
 
                      dev->source.subsys.u.pci.bus,
2616
 
                      dev->source.subsys.u.pci.slot,
2617
 
                      dev->source.subsys.u.pci.function);
2618
 
    virBufferAsprintf(&buf, ",id=%s", dev->info.alias);
2619
 
    if (configfd && *configfd)
2620
 
        virBufferAsprintf(&buf, ",configfd=%s", configfd);
2621
 
    if (dev->bootIndex)
2622
 
        virBufferAsprintf(&buf, ",bootindex=%d", dev->bootIndex);
2623
 
    if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2624
 
        goto error;
2625
 
 
2626
 
    if (dev->rombar) {
2627
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_ROMBAR)) {
2628
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2629
 
                            "%s", _("rombar not supported in this QEMU binary"));
2630
 
            goto error;
2631
 
        }
2632
 
 
2633
 
        switch (dev->rombar) {
2634
 
        case VIR_DOMAIN_PCI_ROMBAR_OFF:
2635
 
            virBufferAddLit(&buf, ",rombar=0");
2636
 
            break;
2637
 
        case VIR_DOMAIN_PCI_ROMBAR_ON:
2638
 
            virBufferAddLit(&buf, ",rombar=1");
2639
 
            break;
2640
 
        default:
2641
 
            break;
2642
 
        }
2643
 
    }
2644
 
 
2645
 
    if (virBufferError(&buf)) {
2646
 
        virReportOOMError();
2647
 
        goto error;
2648
 
    }
2649
 
 
2650
 
    return virBufferContentAndReset(&buf);
2651
 
 
2652
 
error:
2653
 
    virBufferFreeAndReset(&buf);
2654
 
    return NULL;
2655
 
}
2656
 
 
2657
 
 
2658
 
char *
2659
 
qemuBuildPCIHostdevPCIDevStr(virDomainHostdevDefPtr dev)
2660
 
{
2661
 
    char *ret = NULL;
2662
 
 
2663
 
    if (virAsprintf(&ret, "host=%.2x:%.2x.%.1x",
2664
 
                    dev->source.subsys.u.pci.bus,
2665
 
                    dev->source.subsys.u.pci.slot,
2666
 
                    dev->source.subsys.u.pci.function) < 0)
2667
 
        virReportOOMError();
2668
 
 
2669
 
    return ret;
2670
 
}
2671
 
 
2672
 
 
2673
 
char *
2674
 
qemuBuildRedirdevDevStr(virDomainRedirdevDefPtr dev,
2675
 
                        virBitmapPtr qemuCaps)
2676
 
{
2677
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2678
 
 
2679
 
    if (dev->bus != VIR_DOMAIN_REDIRDEV_BUS_USB) {
2680
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2681
 
                        _("Redirection bus %s is not supported by QEMU"),
2682
 
                        virDomainRedirdevBusTypeToString(dev->bus));
2683
 
        goto error;
2684
 
    }
2685
 
 
2686
 
    if (!qemuCapsGet(qemuCaps, QEMU_CAPS_USB_REDIR)) {
2687
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
2688
 
                        _("USB redirection is not supported "
2689
 
                          "by this version of QEMU"));
2690
 
        goto error;
2691
 
    }
2692
 
 
2693
 
    virBufferAsprintf(&buf, "usb-redir,chardev=char%s,id=%s",
2694
 
                      dev->info.alias,
2695
 
                      dev->info.alias);
2696
 
 
2697
 
    if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2698
 
        goto error;
2699
 
 
2700
 
    if (virBufferError(&buf)) {
2701
 
        virReportOOMError();
2702
 
        goto error;
2703
 
    }
2704
 
 
2705
 
    return virBufferContentAndReset(&buf);
2706
 
 
2707
 
error:
2708
 
    virBufferFreeAndReset(&buf);
2709
 
    return NULL;
2710
 
}
2711
 
 
2712
 
char *
2713
 
qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev,
2714
 
                          virBitmapPtr qemuCaps)
2715
 
{
2716
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2717
 
 
2718
 
    if (!dev->source.subsys.u.usb.bus &&
2719
 
        !dev->source.subsys.u.usb.device) {
2720
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
2721
 
                        _("USB host device is missing bus/device information"));
2722
 
        return NULL;
2723
 
    }
2724
 
 
2725
 
    virBufferAsprintf(&buf, "usb-host,hostbus=%d,hostaddr=%d,id=%s",
2726
 
                      dev->source.subsys.u.usb.bus,
2727
 
                      dev->source.subsys.u.usb.device,
2728
 
                      dev->info.alias);
2729
 
 
2730
 
    if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2731
 
        goto error;
2732
 
 
2733
 
    if (virBufferError(&buf)) {
2734
 
        virReportOOMError();
2735
 
        goto error;
2736
 
    }
2737
 
 
2738
 
    return virBufferContentAndReset(&buf);
2739
 
 
2740
 
error:
2741
 
    virBufferFreeAndReset(&buf);
2742
 
    return NULL;
2743
 
}
2744
 
 
2745
 
 
2746
 
char *
2747
 
qemuBuildHubDevStr(virDomainHubDefPtr dev,
2748
 
                   virBitmapPtr qemuCaps)
2749
 
{
2750
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2751
 
 
2752
 
    if (dev->type != VIR_DOMAIN_HUB_TYPE_USB) {
2753
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2754
 
                        _("hub type %s not supported"),
2755
 
                        virDomainHubTypeToString(dev->type));
2756
 
        goto error;
2757
 
    }
2758
 
 
2759
 
    if (!qemuCapsGet(qemuCaps, QEMU_CAPS_USB_HUB)) {
2760
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2761
 
                        _("usb-hub not supported by QEMU binary"));
2762
 
        goto error;
2763
 
    }
2764
 
 
2765
 
    virBufferAddLit(&buf, "usb-hub");
2766
 
    virBufferAsprintf(&buf, ",id=%s", dev->info.alias);
2767
 
    if (qemuBuildDeviceAddressStr(&buf, &dev->info, qemuCaps) < 0)
2768
 
        goto error;
2769
 
 
2770
 
    if (virBufferError(&buf)) {
2771
 
        virReportOOMError();
2772
 
        goto error;
2773
 
    }
2774
 
 
2775
 
    return virBufferContentAndReset(&buf);
2776
 
 
2777
 
error:
2778
 
    virBufferFreeAndReset(&buf);
2779
 
    return NULL;
2780
 
}
2781
 
 
2782
 
 
2783
 
char *
2784
 
qemuBuildUSBHostdevUsbDevStr(virDomainHostdevDefPtr dev)
2785
 
{
2786
 
    char *ret = NULL;
2787
 
 
2788
 
    if (!dev->source.subsys.u.usb.bus &&
2789
 
        !dev->source.subsys.u.usb.device) {
2790
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
2791
 
                        _("USB host device is missing bus/device information"));
2792
 
        return NULL;
2793
 
    }
2794
 
 
2795
 
    if (virAsprintf(&ret, "host:%d.%d",
2796
 
                    dev->source.subsys.u.usb.bus,
2797
 
                    dev->source.subsys.u.usb.device) < 0)
2798
 
        virReportOOMError();
2799
 
 
2800
 
    return ret;
2801
 
}
2802
 
 
2803
 
 
2804
 
 
2805
 
/* This function outputs a -chardev command line option which describes only the
2806
 
 * host side of the character device */
2807
 
static char *
2808
 
qemuBuildChrChardevStr(virDomainChrSourceDefPtr dev, const char *alias,
2809
 
                       virBitmapPtr qemuCaps)
2810
 
{
2811
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2812
 
    bool telnet;
2813
 
 
2814
 
    switch(dev->type) {
2815
 
    case VIR_DOMAIN_CHR_TYPE_NULL:
2816
 
        virBufferAsprintf(&buf, "null,id=char%s", alias);
2817
 
        break;
2818
 
 
2819
 
    case VIR_DOMAIN_CHR_TYPE_VC:
2820
 
        virBufferAsprintf(&buf, "vc,id=char%s", alias);
2821
 
        break;
2822
 
 
2823
 
    case VIR_DOMAIN_CHR_TYPE_PTY:
2824
 
        virBufferAsprintf(&buf, "pty,id=char%s", alias);
2825
 
        break;
2826
 
 
2827
 
    case VIR_DOMAIN_CHR_TYPE_DEV:
2828
 
        virBufferAsprintf(&buf, "tty,id=char%s,path=%s", alias,
2829
 
                          dev->data.file.path);
2830
 
        break;
2831
 
 
2832
 
    case VIR_DOMAIN_CHR_TYPE_FILE:
2833
 
        virBufferAsprintf(&buf, "file,id=char%s,path=%s", alias,
2834
 
                          dev->data.file.path);
2835
 
        break;
2836
 
 
2837
 
    case VIR_DOMAIN_CHR_TYPE_PIPE:
2838
 
        virBufferAsprintf(&buf, "pipe,id=char%s,path=%s", alias,
2839
 
                          dev->data.file.path);
2840
 
        break;
2841
 
 
2842
 
    case VIR_DOMAIN_CHR_TYPE_STDIO:
2843
 
        virBufferAsprintf(&buf, "stdio,id=char%s", alias);
2844
 
        break;
2845
 
 
2846
 
    case VIR_DOMAIN_CHR_TYPE_UDP: {
2847
 
        const char *connectHost = dev->data.udp.connectHost;
2848
 
        const char *bindHost = dev->data.udp.bindHost;
2849
 
        const char *bindService = dev->data.udp.bindService;
2850
 
 
2851
 
        if (connectHost == NULL)
2852
 
            connectHost = "";
2853
 
        if (bindHost == NULL)
2854
 
            bindHost = "";
2855
 
        if (bindService == NULL)
2856
 
            bindService = "0";
2857
 
 
2858
 
        virBufferAsprintf(&buf,
2859
 
                          "udp,id=char%s,host=%s,port=%s,localaddr=%s,"
2860
 
                          "localport=%s",
2861
 
                          alias,
2862
 
                          connectHost,
2863
 
                          dev->data.udp.connectService,
2864
 
                          bindHost, bindService);
2865
 
        break;
2866
 
    }
2867
 
    case VIR_DOMAIN_CHR_TYPE_TCP:
2868
 
        telnet = dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET;
2869
 
        virBufferAsprintf(&buf,
2870
 
                          "socket,id=char%s,host=%s,port=%s%s%s",
2871
 
                          alias,
2872
 
                          dev->data.tcp.host,
2873
 
                          dev->data.tcp.service,
2874
 
                          telnet ? ",telnet" : "",
2875
 
                          dev->data.tcp.listen ? ",server,nowait" : "");
2876
 
        break;
2877
 
 
2878
 
    case VIR_DOMAIN_CHR_TYPE_UNIX:
2879
 
        virBufferAsprintf(&buf,
2880
 
                          "socket,id=char%s,path=%s%s",
2881
 
                          alias,
2882
 
                          dev->data.nix.path,
2883
 
                          dev->data.nix.listen ? ",server,nowait" : "");
2884
 
        break;
2885
 
 
2886
 
    case VIR_DOMAIN_CHR_TYPE_SPICEVMC:
2887
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV_SPICEVMC)) {
2888
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2889
 
                            _("spicevmc not supported in this QEMU binary"));
2890
 
            goto error;
2891
 
        }
2892
 
        virBufferAsprintf(&buf, "spicevmc,id=char%s,name=%s", alias,
2893
 
                          virDomainChrSpicevmcTypeToString(dev->data.spicevmc));
2894
 
        break;
2895
 
 
2896
 
    default:
2897
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
2898
 
                        _("unsupported chardev '%s'"),
2899
 
                        virDomainChrTypeToString(dev->type));
2900
 
        goto error;
2901
 
    }
2902
 
 
2903
 
    if (virBufferError(&buf)) {
2904
 
        virReportOOMError();
2905
 
        goto error;
2906
 
    }
2907
 
 
2908
 
    return virBufferContentAndReset(&buf);
2909
 
 
2910
 
error:
2911
 
    virBufferFreeAndReset(&buf);
2912
 
    return NULL;
2913
 
}
2914
 
 
2915
 
 
2916
 
static char *
2917
 
qemuBuildChrArgStr(virDomainChrSourceDefPtr dev, const char *prefix)
2918
 
{
2919
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
2920
 
 
2921
 
    if (prefix)
2922
 
        virBufferAdd(&buf, prefix, strlen(prefix));
2923
 
 
2924
 
    switch (dev->type) {
2925
 
    case VIR_DOMAIN_CHR_TYPE_NULL:
2926
 
        virBufferAddLit(&buf, "null");
2927
 
        break;
2928
 
 
2929
 
    case VIR_DOMAIN_CHR_TYPE_VC:
2930
 
        virBufferAddLit(&buf, "vc");
2931
 
        break;
2932
 
 
2933
 
    case VIR_DOMAIN_CHR_TYPE_PTY:
2934
 
        virBufferAddLit(&buf, "pty");
2935
 
        break;
2936
 
 
2937
 
    case VIR_DOMAIN_CHR_TYPE_DEV:
2938
 
        virBufferStrcat(&buf, dev->data.file.path, NULL);
2939
 
        break;
2940
 
 
2941
 
    case VIR_DOMAIN_CHR_TYPE_FILE:
2942
 
        virBufferAsprintf(&buf, "file:%s", dev->data.file.path);
2943
 
        break;
2944
 
 
2945
 
    case VIR_DOMAIN_CHR_TYPE_PIPE:
2946
 
        virBufferAsprintf(&buf, "pipe:%s", dev->data.file.path);
2947
 
        break;
2948
 
 
2949
 
    case VIR_DOMAIN_CHR_TYPE_STDIO:
2950
 
        virBufferAddLit(&buf, "stdio");
2951
 
        break;
2952
 
 
2953
 
    case VIR_DOMAIN_CHR_TYPE_UDP: {
2954
 
        const char *connectHost = dev->data.udp.connectHost;
2955
 
        const char *bindHost = dev->data.udp.bindHost;
2956
 
        const char *bindService  = dev->data.udp.bindService;
2957
 
 
2958
 
        if (connectHost == NULL)
2959
 
            connectHost = "";
2960
 
        if (bindHost == NULL)
2961
 
            bindHost = "";
2962
 
        if (bindService == NULL)
2963
 
            bindService = "0";
2964
 
 
2965
 
        virBufferAsprintf(&buf, "udp:%s:%s@%s:%s",
2966
 
                          connectHost,
2967
 
                          dev->data.udp.connectService,
2968
 
                          bindHost,
2969
 
                          bindService);
2970
 
        break;
2971
 
    }
2972
 
    case VIR_DOMAIN_CHR_TYPE_TCP:
2973
 
        if (dev->data.tcp.protocol == VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET) {
2974
 
            virBufferAsprintf(&buf, "telnet:%s:%s%s",
2975
 
                              dev->data.tcp.host,
2976
 
                              dev->data.tcp.service,
2977
 
                              dev->data.tcp.listen ? ",server,nowait" : "");
2978
 
        } else {
2979
 
            virBufferAsprintf(&buf, "tcp:%s:%s%s",
2980
 
                              dev->data.tcp.host,
2981
 
                              dev->data.tcp.service,
2982
 
                              dev->data.tcp.listen ? ",server,nowait" : "");
2983
 
        }
2984
 
        break;
2985
 
 
2986
 
    case VIR_DOMAIN_CHR_TYPE_UNIX:
2987
 
        virBufferAsprintf(&buf, "unix:%s%s",
2988
 
                          dev->data.nix.path,
2989
 
                          dev->data.nix.listen ? ",server,nowait" : "");
2990
 
        break;
2991
 
    }
2992
 
 
2993
 
    if (virBufferError(&buf)) {
2994
 
        virReportOOMError();
2995
 
        goto error;
2996
 
    }
2997
 
 
2998
 
    return virBufferContentAndReset(&buf);
2999
 
 
3000
 
error:
3001
 
    virBufferFreeAndReset(&buf);
3002
 
    return NULL;
3003
 
}
3004
 
 
3005
 
 
3006
 
static char *
3007
 
qemuBuildVirtioSerialPortDevStr(virDomainChrDefPtr dev,
3008
 
                                virBitmapPtr qemuCaps)
3009
 
{
3010
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
3011
 
    switch (dev->deviceType) {
3012
 
    case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE:
3013
 
        virBufferAddLit(&buf, "virtconsole");
3014
 
        break;
3015
 
    case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL:
3016
 
        /* Legacy syntax  '-device spicevmc' */
3017
 
        if (dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC &&
3018
 
            qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC)) {
3019
 
            virBufferAddLit(&buf, "spicevmc");
3020
 
        } else {
3021
 
            virBufferAddLit(&buf, "virtserialport");
3022
 
        }
3023
 
        break;
3024
 
    default:
3025
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
3026
 
                        _("Cannot use virtio serial for parallel/serial devices"));
3027
 
        return NULL;
3028
 
    }
3029
 
 
3030
 
    if (dev->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
3031
 
        /* Check it's a virtio-serial address */
3032
 
        if (dev->info.type !=
3033
 
            VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL)
3034
 
        {
3035
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
3036
 
                            "%s", _("virtio serial device has invalid address type"));
3037
 
            goto error;
3038
 
        }
3039
 
 
3040
 
        virBufferAsprintf(&buf,
3041
 
                          ",bus=" QEMU_VIRTIO_SERIAL_PREFIX "%d.%d",
3042
 
                          dev->info.addr.vioserial.controller,
3043
 
                          dev->info.addr.vioserial.bus);
3044
 
        virBufferAsprintf(&buf,
3045
 
                          ",nr=%d",
3046
 
                          dev->info.addr.vioserial.port);
3047
 
    }
3048
 
 
3049
 
    if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
3050
 
        dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC &&
3051
 
        dev->target.name &&
3052
 
        STRNEQ(dev->target.name, "com.redhat.spice.0")) {
3053
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3054
 
                        _("Unsupported spicevmc target name '%s'"),
3055
 
                        dev->target.name);
3056
 
        goto error;
3057
 
    }
3058
 
 
3059
 
    if (!(dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
3060
 
          dev->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC &&
3061
 
          qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC))) {
3062
 
        virBufferAsprintf(&buf, ",chardev=char%s,id=%s",
3063
 
                          dev->info.alias, dev->info.alias);
3064
 
        if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
3065
 
            dev->target.name) {
3066
 
            virBufferAsprintf(&buf, ",name=%s", dev->target.name);
3067
 
        }
3068
 
    } else {
3069
 
        virBufferAsprintf(&buf, ",id=%s", dev->info.alias);
3070
 
    }
3071
 
    if (virBufferError(&buf)) {
3072
 
        virReportOOMError();
3073
 
        goto error;
3074
 
    }
3075
 
 
3076
 
    return virBufferContentAndReset(&buf);
3077
 
 
3078
 
error:
3079
 
    virBufferFreeAndReset(&buf);
3080
 
    return NULL;
3081
 
}
3082
 
 
3083
 
static char *qemuBuildSmbiosBiosStr(virSysinfoDefPtr def)
3084
 
{
3085
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
3086
 
 
3087
 
    if ((def->bios_vendor == NULL) && (def->bios_version == NULL) &&
3088
 
        (def->bios_date == NULL) && (def->bios_release == NULL))
3089
 
        return(NULL);
3090
 
 
3091
 
    virBufferAddLit(&buf, "type=0");
3092
 
 
3093
 
    /* 0:Vendor */
3094
 
    if (def->bios_vendor)
3095
 
        virBufferAsprintf(&buf, ",vendor=%s", def->bios_vendor);
3096
 
    /* 0:BIOS Version */
3097
 
    if (def->bios_version)
3098
 
        virBufferAsprintf(&buf, ",version=%s", def->bios_version);
3099
 
    /* 0:BIOS Release Date */
3100
 
    if (def->bios_date)
3101
 
        virBufferAsprintf(&buf, ",date=%s", def->bios_date);
3102
 
    /* 0:System BIOS Major Release and 0:System BIOS Minor Release */
3103
 
    if (def->bios_release)
3104
 
        virBufferAsprintf(&buf, ",release=%s", def->bios_release);
3105
 
 
3106
 
    if (virBufferError(&buf)) {
3107
 
        virReportOOMError();
3108
 
        goto error;
3109
 
    }
3110
 
 
3111
 
    return virBufferContentAndReset(&buf);
3112
 
 
3113
 
error:
3114
 
    virBufferFreeAndReset(&buf);
3115
 
    return(NULL);
3116
 
}
3117
 
 
3118
 
static char *qemuBuildSmbiosSystemStr(virSysinfoDefPtr def, bool skip_uuid)
3119
 
{
3120
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
3121
 
 
3122
 
    if ((def->system_manufacturer == NULL) && (def->system_sku == NULL) &&
3123
 
        (def->system_product == NULL) && (def->system_version == NULL) &&
3124
 
        (def->system_serial == NULL) && (def->system_family == NULL) &&
3125
 
        (def->system_uuid == NULL || skip_uuid))
3126
 
        return NULL;
3127
 
 
3128
 
    virBufferAddLit(&buf, "type=1");
3129
 
 
3130
 
    /* 1:Manufacturer */
3131
 
    if (def->system_manufacturer)
3132
 
        virBufferAsprintf(&buf, ",manufacturer=%s",
3133
 
                          def->system_manufacturer);
3134
 
     /* 1:Product Name */
3135
 
    if (def->system_product)
3136
 
        virBufferAsprintf(&buf, ",product=%s", def->system_product);
3137
 
    /* 1:Version */
3138
 
    if (def->system_version)
3139
 
        virBufferAsprintf(&buf, ",version=%s", def->system_version);
3140
 
    /* 1:Serial Number */
3141
 
    if (def->system_serial)
3142
 
        virBufferAsprintf(&buf, ",serial=%s", def->system_serial);
3143
 
    /* 1:UUID */
3144
 
    if (def->system_uuid && !skip_uuid)
3145
 
        virBufferAsprintf(&buf, ",uuid=%s", def->system_uuid);
3146
 
    /* 1:SKU Number */
3147
 
    if (def->system_sku)
3148
 
        virBufferAsprintf(&buf, ",sku=%s", def->system_sku);
3149
 
    /* 1:Family */
3150
 
    if (def->system_family)
3151
 
        virBufferAsprintf(&buf, ",family=%s", def->system_family);
3152
 
 
3153
 
    if (virBufferError(&buf)) {
3154
 
        virReportOOMError();
3155
 
        goto error;
3156
 
    }
3157
 
 
3158
 
    return virBufferContentAndReset(&buf);
3159
 
 
3160
 
error:
3161
 
    virBufferFreeAndReset(&buf);
3162
 
    return(NULL);
3163
 
}
3164
 
 
3165
 
static char *
3166
 
qemuBuildClockArgStr(virDomainClockDefPtr def)
3167
 
{
3168
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
3169
 
 
3170
 
    switch (def->offset) {
3171
 
    case VIR_DOMAIN_CLOCK_OFFSET_UTC:
3172
 
        virBufferAddLit(&buf, "base=utc");
3173
 
        break;
3174
 
 
3175
 
    case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME:
3176
 
    case VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE:
3177
 
        virBufferAddLit(&buf, "base=localtime");
3178
 
        break;
3179
 
 
3180
 
    case VIR_DOMAIN_CLOCK_OFFSET_VARIABLE: {
3181
 
        time_t now = time(NULL);
3182
 
        struct tm nowbits;
3183
 
 
3184
 
        now += def->data.adjustment;
3185
 
        gmtime_r(&now, &nowbits);
3186
 
 
3187
 
        virBufferAsprintf(&buf, "base=%d-%02d-%02dT%02d:%02d:%02d",
3188
 
                          nowbits.tm_year + 1900,
3189
 
                          nowbits.tm_mon + 1,
3190
 
                          nowbits.tm_mday,
3191
 
                          nowbits.tm_hour,
3192
 
                          nowbits.tm_min,
3193
 
                          nowbits.tm_sec);
3194
 
    }   break;
3195
 
 
3196
 
    default:
3197
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3198
 
                        _("unsupported clock offset '%s'"),
3199
 
                        virDomainClockOffsetTypeToString(def->offset));
3200
 
        goto error;
3201
 
    }
3202
 
 
3203
 
    /* Look for an 'rtc' timer element, and add in appropriate clock= and driftfix= */
3204
 
    int i;
3205
 
    for (i = 0; i < def->ntimers; i++) {
3206
 
        if (def->timers[i]->name == VIR_DOMAIN_TIMER_NAME_RTC) {
3207
 
            switch (def->timers[i]->track) {
3208
 
            case -1: /* unspecified - use hypervisor default */
3209
 
                break;
3210
 
            case VIR_DOMAIN_TIMER_TRACK_BOOT:
3211
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3212
 
                                _("unsupported rtc timer track '%s'"),
3213
 
                                virDomainTimerTrackTypeToString(def->timers[i]->track));
3214
 
                goto error;
3215
 
            case VIR_DOMAIN_TIMER_TRACK_GUEST:
3216
 
                virBufferAddLit(&buf, ",clock=vm");
3217
 
                break;
3218
 
            case VIR_DOMAIN_TIMER_TRACK_WALL:
3219
 
                virBufferAddLit(&buf, ",clock=host");
3220
 
                break;
3221
 
            }
3222
 
 
3223
 
            switch (def->timers[i]->tickpolicy) {
3224
 
            case -1:
3225
 
            case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY:
3226
 
                /* This is the default - missed ticks delivered when
3227
 
                   next scheduled, at normal rate */
3228
 
                break;
3229
 
            case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP:
3230
 
                /* deliver ticks at a faster rate until caught up */
3231
 
                virBufferAddLit(&buf, ",driftfix=slew");
3232
 
                break;
3233
 
            case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE:
3234
 
            case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD:
3235
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3236
 
                                _("unsupported rtc timer tickpolicy '%s'"),
3237
 
                                virDomainTimerTickpolicyTypeToString(def->timers[i]->tickpolicy));
3238
 
                goto error;
3239
 
            }
3240
 
            break; /* no need to check other timers - there is only one rtc */
3241
 
        }
3242
 
    }
3243
 
 
3244
 
    if (virBufferError(&buf)) {
3245
 
        virReportOOMError();
3246
 
        goto error;
3247
 
    }
3248
 
 
3249
 
    return virBufferContentAndReset(&buf);
3250
 
 
3251
 
error:
3252
 
    virBufferFreeAndReset(&buf);
3253
 
    return NULL;
3254
 
}
3255
 
 
3256
 
 
3257
 
static int
3258
 
qemuBuildCpuArgStr(const struct qemud_driver *driver,
3259
 
                   const virDomainDefPtr def,
3260
 
                   const char *emulator,
3261
 
                   virBitmapPtr qemuCaps,
3262
 
                   const struct utsname *ut,
3263
 
                   char **opt,
3264
 
                   bool *hasHwVirt)
3265
 
{
3266
 
    const virCPUDefPtr host = driver->caps->host.cpu;
3267
 
    virCPUDefPtr guest = NULL;
3268
 
    unsigned int ncpus = 0;
3269
 
    const char **cpus = NULL;
3270
 
    union cpuData *data = NULL;
3271
 
    int ret = -1;
3272
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
3273
 
    int i;
3274
 
 
3275
 
    *hasHwVirt = false;
3276
 
 
3277
 
    if (def->cpu && def->cpu->model) {
3278
 
        if (host &&
3279
 
            qemuCapsProbeCPUModels(emulator, qemuCaps, host->arch,
3280
 
                                   &ncpus, &cpus) < 0)
3281
 
            goto cleanup;
3282
 
 
3283
 
        if (!ncpus || !host) {
3284
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
3285
 
                            _("CPU specification not supported by hypervisor"));
3286
 
            goto cleanup;
3287
 
        }
3288
 
    }
3289
 
 
3290
 
    if (ncpus > 0 && host) {
3291
 
        virCPUCompareResult cmp;
3292
 
        const char *preferred;
3293
 
        int hasSVM;
3294
 
 
3295
 
        cmp = cpuGuestData(host, def->cpu, &data);
3296
 
        switch (cmp) {
3297
 
        case VIR_CPU_COMPARE_INCOMPATIBLE:
3298
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
3299
 
                            "%s", _("guest CPU is not compatible with host CPU"));
3300
 
            /* fall through */
3301
 
        case VIR_CPU_COMPARE_ERROR:
3302
 
            goto cleanup;
3303
 
 
3304
 
        default:
3305
 
            break;
3306
 
        }
3307
 
 
3308
 
        if (VIR_ALLOC(guest) < 0 || !(guest->arch = strdup(host->arch)))
3309
 
            goto no_memory;
3310
 
 
3311
 
        if (def->cpu->match == VIR_CPU_MATCH_MINIMUM)
3312
 
            preferred = host->model;
3313
 
        else
3314
 
            preferred = def->cpu->model;
3315
 
 
3316
 
        guest->type = VIR_CPU_TYPE_GUEST;
3317
 
        if (cpuDecode(guest, data, cpus, ncpus, preferred) < 0)
3318
 
            goto cleanup;
3319
 
 
3320
 
        /* Only 'svm' requires --enable-nesting. The nested
3321
 
         * 'vmx' patches now simply hook off the CPU features
3322
 
         */
3323
 
        hasSVM = cpuHasFeature(guest->arch, data, "svm");
3324
 
        if (hasSVM < 0)
3325
 
            goto cleanup;
3326
 
        *hasHwVirt = hasSVM > 0 ? true : false;
3327
 
 
3328
 
        virBufferAdd(&buf, guest->model, -1);
3329
 
        for (i = 0; i < guest->nfeatures; i++) {
3330
 
            char sign;
3331
 
            if (guest->features[i].policy == VIR_CPU_FEATURE_DISABLE)
3332
 
                sign = '-';
3333
 
            else
3334
 
                sign = '+';
3335
 
 
3336
 
            virBufferAsprintf(&buf, ",%c%s", sign, guest->features[i].name);
3337
 
        }
3338
 
    }
3339
 
    else {
3340
 
        /*
3341
 
         * Need to force a 32-bit guest CPU type if
3342
 
         *
3343
 
         *  1. guest OS is i686
3344
 
         *  2. host OS is x86_64
3345
 
         *  3. emulator is qemu-kvm or kvm
3346
 
         *
3347
 
         * Or
3348
 
         *
3349
 
         *  1. guest OS is i686
3350
 
         *  2. emulator is qemu-system-x86_64
3351
 
         */
3352
 
        if (STREQ(def->os.arch, "i686") &&
3353
 
            ((STREQ(ut->machine, "x86_64") &&
3354
 
              strstr(emulator, "kvm")) ||
3355
 
             strstr(emulator, "x86_64")))
3356
 
            virBufferAddLit(&buf, "qemu32");
3357
 
    }
3358
 
 
3359
 
    if (virBufferError(&buf))
3360
 
        goto no_memory;
3361
 
 
3362
 
    *opt = virBufferContentAndReset(&buf);
3363
 
 
3364
 
    ret = 0;
3365
 
 
3366
 
cleanup:
3367
 
    if (guest)
3368
 
        cpuDataFree(guest->arch, data);
3369
 
    virCPUDefFree(guest);
3370
 
 
3371
 
    if (cpus) {
3372
 
        for (i = 0; i < ncpus; i++)
3373
 
            VIR_FREE(cpus[i]);
3374
 
        VIR_FREE(cpus);
3375
 
    }
3376
 
 
3377
 
    return ret;
3378
 
 
3379
 
no_memory:
3380
 
    virReportOOMError();
3381
 
    goto cleanup;
3382
 
}
3383
 
 
3384
 
static char *
3385
 
qemuBuildSmpArgStr(const virDomainDefPtr def,
3386
 
                   virBitmapPtr qemuCaps)
3387
 
{
3388
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
3389
 
 
3390
 
    virBufferAsprintf(&buf, "%u", def->vcpus);
3391
 
 
3392
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_SMP_TOPOLOGY)) {
3393
 
        if (def->vcpus != def->maxvcpus)
3394
 
            virBufferAsprintf(&buf, ",maxcpus=%u", def->maxvcpus);
3395
 
        /* sockets, cores, and threads are either all zero
3396
 
         * or all non-zero, thus checking one of them is enough */
3397
 
        if (def->cpu && def->cpu->sockets) {
3398
 
            virBufferAsprintf(&buf, ",sockets=%u", def->cpu->sockets);
3399
 
            virBufferAsprintf(&buf, ",cores=%u", def->cpu->cores);
3400
 
            virBufferAsprintf(&buf, ",threads=%u", def->cpu->threads);
3401
 
        }
3402
 
        else {
3403
 
            virBufferAsprintf(&buf, ",sockets=%u", def->maxvcpus);
3404
 
            virBufferAsprintf(&buf, ",cores=%u", 1);
3405
 
            virBufferAsprintf(&buf, ",threads=%u", 1);
3406
 
        }
3407
 
    } else if (def->vcpus != def->maxvcpus) {
3408
 
        virBufferFreeAndReset(&buf);
3409
 
        /* FIXME - consider hot-unplugging cpus after boot for older qemu */
3410
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
3411
 
                        _("setting current vcpu count less than maximum is "
3412
 
                          "not supported with this QEMU binary"));
3413
 
        return NULL;
3414
 
    }
3415
 
 
3416
 
    if (virBufferError(&buf)) {
3417
 
        virBufferFreeAndReset(&buf);
3418
 
        virReportOOMError();
3419
 
        return NULL;
3420
 
    }
3421
 
 
3422
 
    return virBufferContentAndReset(&buf);
3423
 
}
3424
 
 
3425
 
static void
3426
 
qemuBuildNumaCPUArgStr(char *cpumask, virBufferPtr buf)
3427
 
{
3428
 
    int i, first, last;
3429
 
    int cpuSet = 0;
3430
 
 
3431
 
    first = last = 0;
3432
 
    for (i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
3433
 
        if (cpumask[i]) {
3434
 
            if (cpuSet) {
3435
 
                last = i;
3436
 
            } else {
3437
 
                first = last = i;
3438
 
                cpuSet = 1;
3439
 
            }
3440
 
        } else {
3441
 
            if (!cpuSet)
3442
 
                continue;
3443
 
            if (first == last)
3444
 
                virBufferAsprintf(buf, "%d,", first);
3445
 
            else
3446
 
                virBufferAsprintf(buf, "%d-%d,", first, last);
3447
 
            cpuSet = 0;
3448
 
        }
3449
 
    }
3450
 
 
3451
 
    if (cpuSet) {
3452
 
        if (first == last)
3453
 
            virBufferAsprintf(buf, "%d,", first);
3454
 
        else
3455
 
            virBufferAsprintf(buf, "%d-%d,", first, last);
3456
 
    }
3457
 
}
3458
 
 
3459
 
static int
3460
 
qemuBuildNumaArgStr(const virDomainDefPtr def, virCommandPtr cmd)
3461
 
{
3462
 
    int i;
3463
 
    virBuffer buf = VIR_BUFFER_INITIALIZER;
3464
 
 
3465
 
    for (i = 0; i < def->cpu->ncells; i++) {
3466
 
        virCommandAddArg(cmd, "-numa");
3467
 
        virBufferAsprintf(&buf, "node,nodeid=%d", def->cpu->cells[i].cellid);
3468
 
        virBufferAddLit(&buf, ",cpus=");
3469
 
        qemuBuildNumaCPUArgStr(def->cpu->cells[i].cpumask, &buf);
3470
 
        virBufferAsprintf(&buf, "mem=%d",
3471
 
            VIR_DIV_UP(def->cpu->cells[i].mem, 1024));
3472
 
 
3473
 
        if (virBufferError(&buf))
3474
 
            goto error;
3475
 
 
3476
 
        virCommandAddArgBuffer(cmd, &buf);
3477
 
    }
3478
 
    return 0;
3479
 
 
3480
 
error:
3481
 
    virBufferFreeAndReset(&buf);
3482
 
    virReportOOMError();
3483
 
    return -1;
3484
 
}
3485
 
 
3486
 
/*
3487
 
 * Constructs a argv suitable for launching qemu with config defined
3488
 
 * for a given virtual machine.
3489
 
 *
3490
 
 * XXX 'conn' is only required to resolve network -> bridge name
3491
 
 * figure out how to remove this requirement some day
3492
 
 */
3493
 
virCommandPtr
3494
 
qemuBuildCommandLine(virConnectPtr conn,
3495
 
                     struct qemud_driver *driver,
3496
 
                     virDomainDefPtr def,
3497
 
                     virDomainChrSourceDefPtr monitor_chr,
3498
 
                     bool monitor_json,
3499
 
                     virBitmapPtr qemuCaps,
3500
 
                     const char *migrateFrom,
3501
 
                     int migrateFd,
3502
 
                     virDomainSnapshotObjPtr snapshot,
3503
 
                     enum virNetDevVPortProfileOp vmop)
3504
 
{
3505
 
    int i;
3506
 
    struct utsname ut;
3507
 
    int disableKQEMU = 0;
3508
 
    int enableKQEMU = 0;
3509
 
    int disableKVM = 0;
3510
 
    int enableKVM = 0;
3511
 
    const char *emulator;
3512
 
    char uuid[VIR_UUID_STRING_BUFLEN];
3513
 
    char *cpu;
3514
 
    char *smp;
3515
 
    int last_good_net = -1;
3516
 
    bool hasHwVirt = false;
3517
 
    virCommandPtr cmd;
3518
 
    bool emitBootindex = false;
3519
 
    int usbcontroller = 0;
3520
 
    bool usblegacy = false;
3521
 
    uname_normalize(&ut);
3522
 
 
3523
 
    virUUIDFormat(def->uuid, uuid);
3524
 
 
3525
 
    emulator = def->emulator;
3526
 
 
3527
 
    /*
3528
 
     * do not use boot=on for drives when not using KVM since this
3529
 
     * is not supported at all in upstream QEmu.
3530
 
     */
3531
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_KVM) &&
3532
 
        (def->virtType == VIR_DOMAIN_VIRT_QEMU))
3533
 
        qemuCapsClear(qemuCaps, QEMU_CAPS_DRIVE_BOOT);
3534
 
 
3535
 
    switch (def->virtType) {
3536
 
    case VIR_DOMAIN_VIRT_QEMU:
3537
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_KQEMU))
3538
 
            disableKQEMU = 1;
3539
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_KVM))
3540
 
            disableKVM = 1;
3541
 
        break;
3542
 
 
3543
 
    case VIR_DOMAIN_VIRT_KQEMU:
3544
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_KVM))
3545
 
            disableKVM = 1;
3546
 
 
3547
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_ENABLE_KQEMU)) {
3548
 
            enableKQEMU = 1;
3549
 
        } else if (!qemuCapsGet(qemuCaps, QEMU_CAPS_KQEMU)) {
3550
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3551
 
                            _("the QEMU binary %s does not support kqemu"),
3552
 
                            emulator);
3553
 
        }
3554
 
        break;
3555
 
 
3556
 
    case VIR_DOMAIN_VIRT_KVM:
3557
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_KQEMU))
3558
 
            disableKQEMU = 1;
3559
 
 
3560
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_ENABLE_KVM)) {
3561
 
            enableKVM = 1;
3562
 
        } else if (!qemuCapsGet(qemuCaps, QEMU_CAPS_KVM)) {
3563
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3564
 
                            _("the QEMU binary %s does not support kvm"),
3565
 
                            emulator);
3566
 
        }
3567
 
        break;
3568
 
 
3569
 
    case VIR_DOMAIN_VIRT_XEN:
3570
 
        /* XXX better check for xenner */
3571
 
        break;
3572
 
 
3573
 
    default:
3574
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3575
 
                        _("the QEMU binary %s does not support %s"),
3576
 
                        emulator, virDomainVirtTypeToString(def->virtType));
3577
 
        break;
3578
 
    }
3579
 
 
3580
 
    cmd = virCommandNewArgList(emulator, "-S", NULL);
3581
 
 
3582
 
    virCommandAddEnvPassCommon(cmd);
3583
 
 
3584
 
    /* This should *never* be NULL, since we always provide
3585
 
     * a machine in the capabilities data for QEMU. So this
3586
 
     * check is just here as a safety in case the unexpected
3587
 
     * happens */
3588
 
    if (def->os.machine)
3589
 
        virCommandAddArgList(cmd, "-M", def->os.machine, NULL);
3590
 
 
3591
 
    if (qemuBuildCpuArgStr(driver, def, emulator, qemuCaps,
3592
 
                           &ut, &cpu, &hasHwVirt) < 0)
3593
 
        goto error;
3594
 
 
3595
 
    if (cpu) {
3596
 
        virCommandAddArgList(cmd, "-cpu", cpu, NULL);
3597
 
        VIR_FREE(cpu);
3598
 
 
3599
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_NESTING) &&
3600
 
            hasHwVirt)
3601
 
            virCommandAddArg(cmd, "-enable-nesting");
3602
 
    }
3603
 
 
3604
 
    if (disableKQEMU)
3605
 
        virCommandAddArg(cmd, "-no-kqemu");
3606
 
    else if (enableKQEMU)
3607
 
        virCommandAddArgList(cmd, "-enable-kqemu", "-kernel-kqemu", NULL);
3608
 
    if (disableKVM)
3609
 
        virCommandAddArg(cmd, "-no-kvm");
3610
 
    if (enableKVM)
3611
 
        virCommandAddArg(cmd, "-enable-kvm");
3612
 
 
3613
 
    /* Set '-m MB' based on maxmem, because the lower 'memory' limit
3614
 
     * is set post-startup using the balloon driver. If balloon driver
3615
 
     * is not supported, then they're out of luck anyway
3616
 
     */
3617
 
    virCommandAddArg(cmd, "-m");
3618
 
    virCommandAddArgFormat(cmd, "%lu", VIR_DIV_UP(def->mem.max_balloon, 1024));
3619
 
    if (def->mem.hugepage_backed) {
3620
 
        if (!driver->hugetlbfs_mount) {
3621
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
3622
 
                            "%s", _("hugetlbfs filesystem is not mounted"));
3623
 
            goto error;
3624
 
        }
3625
 
        if (!driver->hugepage_path) {
3626
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
3627
 
                            "%s", _("hugepages are disabled by administrator config"));
3628
 
            goto error;
3629
 
        }
3630
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_MEM_PATH)) {
3631
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
3632
 
                            _("hugepage backing not supported by '%s'"),
3633
 
                            def->emulator);
3634
 
            goto error;
3635
 
        }
3636
 
        virCommandAddArgList(cmd, "-mem-prealloc", "-mem-path",
3637
 
                             driver->hugepage_path, NULL);
3638
 
    }
3639
 
 
3640
 
    virCommandAddArg(cmd, "-smp");
3641
 
    if (!(smp = qemuBuildSmpArgStr(def, qemuCaps)))
3642
 
        goto error;
3643
 
    virCommandAddArg(cmd, smp);
3644
 
    VIR_FREE(smp);
3645
 
 
3646
 
    if (def->cpu && def->cpu->ncells)
3647
 
        if (qemuBuildNumaArgStr(def, cmd) < 0)
3648
 
            goto error;
3649
 
 
3650
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_NAME)) {
3651
 
        virCommandAddArg(cmd, "-name");
3652
 
        if (driver->setProcessName &&
3653
 
            qemuCapsGet(qemuCaps, QEMU_CAPS_NAME_PROCESS)) {
3654
 
            virCommandAddArgFormat(cmd, "%s,process=qemu:%s",
3655
 
                                   def->name, def->name);
3656
 
        } else {
3657
 
            virCommandAddArg(cmd, def->name);
3658
 
        }
3659
 
    }
3660
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_UUID))
3661
 
        virCommandAddArgList(cmd, "-uuid", uuid, NULL);
3662
 
    if (def->virtType == VIR_DOMAIN_VIRT_XEN ||
3663
 
        STREQ(def->os.type, "xen") ||
3664
 
        STREQ(def->os.type, "linux")) {
3665
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_DOMID)) {
3666
 
            virCommandAddArg(cmd, "-domid");
3667
 
            virCommandAddArgFormat(cmd, "%d", def->id);
3668
 
        } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_XEN_DOMID)) {
3669
 
            virCommandAddArg(cmd, "-xen-attach");
3670
 
            virCommandAddArg(cmd, "-xen-domid");
3671
 
            virCommandAddArgFormat(cmd, "%d", def->id);
3672
 
        } else {
3673
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
3674
 
                            _("qemu emulator '%s' does not support xen"),
3675
 
                            def->emulator);
3676
 
            goto error;
3677
 
        }
3678
 
    }
3679
 
 
3680
 
    if ((def->os.smbios_mode != VIR_DOMAIN_SMBIOS_NONE) &&
3681
 
        (def->os.smbios_mode != VIR_DOMAIN_SMBIOS_EMULATE)) {
3682
 
        virSysinfoDefPtr source = NULL;
3683
 
        bool skip_uuid = false;
3684
 
 
3685
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_SMBIOS_TYPE)) {
3686
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3687
 
                    _("the QEMU binary %s does not support smbios settings"),
3688
 
                            emulator);
3689
 
            goto error;
3690
 
        }
3691
 
 
3692
 
        /* should we really error out or just warn in those cases ? */
3693
 
        if (def->os.smbios_mode == VIR_DOMAIN_SMBIOS_HOST) {
3694
 
            if (driver->hostsysinfo == NULL) {
3695
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
3696
 
                            _("Host SMBIOS information is not available"));
3697
 
                goto error;
3698
 
            }
3699
 
            source = driver->hostsysinfo;
3700
 
            /* Host and guest uuid must differ, by definition of UUID. */
3701
 
            skip_uuid = true;
3702
 
        } else if (def->os.smbios_mode == VIR_DOMAIN_SMBIOS_SYSINFO) {
3703
 
            if (def->sysinfo == NULL) {
3704
 
                qemuReportError(VIR_ERR_XML_ERROR,
3705
 
                            _("Domain '%s' sysinfo are not available"),
3706
 
                               def->name);
3707
 
                goto error;
3708
 
            }
3709
 
            source = def->sysinfo;
3710
 
            /* domain_conf guaranteed that system_uuid matches guest uuid. */
3711
 
        }
3712
 
        if (source != NULL) {
3713
 
            char *smbioscmd;
3714
 
 
3715
 
            smbioscmd = qemuBuildSmbiosBiosStr(source);
3716
 
            if (smbioscmd != NULL) {
3717
 
                virCommandAddArgList(cmd, "-smbios", smbioscmd, NULL);
3718
 
                VIR_FREE(smbioscmd);
3719
 
            }
3720
 
            smbioscmd = qemuBuildSmbiosSystemStr(source, skip_uuid);
3721
 
            if (smbioscmd != NULL) {
3722
 
                virCommandAddArgList(cmd, "-smbios", smbioscmd, NULL);
3723
 
                VIR_FREE(smbioscmd);
3724
 
            }
3725
 
        }
3726
 
    }
3727
 
 
3728
 
    /*
3729
 
     * NB, -nographic *MUST* come before any serial, or monitor
3730
 
     * or parallel port flags due to QEMU craziness, where it
3731
 
     * decides to change the serial port & monitor to be on stdout
3732
 
     * if you ask for nographic. So we have to make sure we override
3733
 
     * these defaults ourselves...
3734
 
     */
3735
 
    if (!def->graphics)
3736
 
        virCommandAddArg(cmd, "-nographic");
3737
 
 
3738
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
3739
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_NODEFCONFIG))
3740
 
            virCommandAddArg(cmd,
3741
 
                             "-nodefconfig"); /* Disable global config files */
3742
 
        virCommandAddArg(cmd,
3743
 
                         "-nodefaults");  /* Disable default guest devices */
3744
 
    }
3745
 
 
3746
 
    /* Serial graphics adapter */
3747
 
    if (def->os.bios.useserial == VIR_DOMAIN_BIOS_USESERIAL_YES) {
3748
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
3749
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
3750
 
                            _("qemu does not support -device"));
3751
 
            goto error;
3752
 
        }
3753
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_SGA)) {
3754
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
3755
 
                            _("qemu does not support SGA"));
3756
 
            goto error;
3757
 
        }
3758
 
        if (!def->nserials) {
3759
 
            qemuReportError(VIR_ERR_XML_ERROR, "%s",
3760
 
                            _("need at least one serial port to use SGA"));
3761
 
            goto error;
3762
 
        }
3763
 
        virCommandAddArgList(cmd, "-device", "sga", NULL);
3764
 
    }
3765
 
 
3766
 
    if (monitor_chr) {
3767
 
        char *chrdev;
3768
 
        /* Use -chardev if it's available */
3769
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV)) {
3770
 
 
3771
 
            virCommandAddArg(cmd, "-chardev");
3772
 
            if (!(chrdev = qemuBuildChrChardevStr(monitor_chr, "monitor",
3773
 
                                                  qemuCaps)))
3774
 
                goto error;
3775
 
            virCommandAddArg(cmd, chrdev);
3776
 
            VIR_FREE(chrdev);
3777
 
 
3778
 
            virCommandAddArg(cmd, "-mon");
3779
 
            virCommandAddArgFormat(cmd,
3780
 
                                   "chardev=charmonitor,id=monitor,mode=%s",
3781
 
                                   monitor_json ? "control" : "readline");
3782
 
        } else {
3783
 
            const char *prefix = NULL;
3784
 
            if (monitor_json)
3785
 
                prefix = "control,";
3786
 
 
3787
 
            virCommandAddArg(cmd, "-monitor");
3788
 
            if (!(chrdev = qemuBuildChrArgStr(monitor_chr, prefix)))
3789
 
                goto error;
3790
 
            virCommandAddArg(cmd, chrdev);
3791
 
            VIR_FREE(chrdev);
3792
 
        }
3793
 
    }
3794
 
 
3795
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_RTC)) {
3796
 
        const char *rtcopt;
3797
 
        virCommandAddArg(cmd, "-rtc");
3798
 
        if (!(rtcopt = qemuBuildClockArgStr(&def->clock)))
3799
 
            goto error;
3800
 
        virCommandAddArg(cmd, rtcopt);
3801
 
        VIR_FREE(rtcopt);
3802
 
    } else {
3803
 
        switch (def->clock.offset) {
3804
 
        case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME:
3805
 
        case VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE:
3806
 
            virCommandAddArg(cmd, "-localtime");
3807
 
            break;
3808
 
 
3809
 
        case VIR_DOMAIN_CLOCK_OFFSET_UTC:
3810
 
            /* Nothing, its the default */
3811
 
            break;
3812
 
 
3813
 
        default:
3814
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3815
 
                            _("unsupported clock offset '%s'"),
3816
 
                            virDomainClockOffsetTypeToString(def->clock.offset));
3817
 
            goto error;
3818
 
        }
3819
 
    }
3820
 
    if (def->clock.offset == VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE &&
3821
 
        def->clock.data.timezone) {
3822
 
        virCommandAddEnvPair(cmd, "TZ", def->clock.data.timezone);
3823
 
    }
3824
 
 
3825
 
    for (i = 0; i < def->clock.ntimers; i++) {
3826
 
        switch (def->clock.timers[i]->name) {
3827
 
        default:
3828
 
        case VIR_DOMAIN_TIMER_NAME_PLATFORM:
3829
 
        case VIR_DOMAIN_TIMER_NAME_TSC:
3830
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3831
 
                            _("unsupported timer type (name) '%s'"),
3832
 
                            virDomainTimerNameTypeToString(def->clock.timers[i]->name));
3833
 
            goto error;
3834
 
 
3835
 
        case VIR_DOMAIN_TIMER_NAME_RTC:
3836
 
            /* This has already been taken care of (in qemuBuildClockArgStr)
3837
 
               if QEMU_CAPS_RTC is set (mutually exclusive with
3838
 
               QEMUD_FLAG_RTC_TD_HACK) */
3839
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_RTC_TD_HACK)) {
3840
 
                switch (def->clock.timers[i]->tickpolicy) {
3841
 
                case -1:
3842
 
                case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY:
3843
 
                    /* the default - do nothing */
3844
 
                    break;
3845
 
                case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP:
3846
 
                    virCommandAddArg(cmd, "-rtc-td-hack");
3847
 
                    break;
3848
 
                case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE:
3849
 
                case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD:
3850
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3851
 
                                    _("unsupported rtc tickpolicy '%s'"),
3852
 
                                    virDomainTimerTickpolicyTypeToString(def->clock.timers[i]->tickpolicy));
3853
 
                goto error;
3854
 
                }
3855
 
            } else if (!qemuCapsGet(qemuCaps, QEMU_CAPS_RTC)
3856
 
                       && (def->clock.timers[i]->tickpolicy
3857
 
                           != VIR_DOMAIN_TIMER_TICKPOLICY_DELAY)
3858
 
                       && (def->clock.timers[i]->tickpolicy != -1)) {
3859
 
                /* a non-default rtc policy was given, but there is no
3860
 
                   way to implement it in this version of qemu */
3861
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3862
 
                                _("unsupported rtc tickpolicy '%s'"),
3863
 
                                virDomainTimerTickpolicyTypeToString(def->clock.timers[i]->tickpolicy));
3864
 
                goto error;
3865
 
            }
3866
 
            break;
3867
 
 
3868
 
        case VIR_DOMAIN_TIMER_NAME_PIT:
3869
 
            switch (def->clock.timers[i]->tickpolicy) {
3870
 
            case -1:
3871
 
            case VIR_DOMAIN_TIMER_TICKPOLICY_DELAY:
3872
 
                /* delay is the default if we don't have kernel
3873
 
                   (-no-kvm-pit), otherwise, the default is catchup. */
3874
 
                if (qemuCapsGet(qemuCaps, QEMU_CAPS_NO_KVM_PIT))
3875
 
                    virCommandAddArg(cmd, "-no-kvm-pit-reinjection");
3876
 
                break;
3877
 
            case VIR_DOMAIN_TIMER_TICKPOLICY_CATCHUP:
3878
 
                if (qemuCapsGet(qemuCaps, QEMU_CAPS_NO_KVM_PIT)) {
3879
 
                    /* do nothing - this is default for kvm-pit */
3880
 
                } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_TDF)) {
3881
 
                    /* -tdf switches to 'catchup' with userspace pit. */
3882
 
                    virCommandAddArg(cmd, "-tdf");
3883
 
                } else {
3884
 
                    /* can't catchup if we have neither pit mode */
3885
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3886
 
                                    _("unsupported pit tickpolicy '%s'"),
3887
 
                                    virDomainTimerTickpolicyTypeToString(def->clock.timers[i]->tickpolicy));
3888
 
                    goto error;
3889
 
                }
3890
 
                break;
3891
 
            case VIR_DOMAIN_TIMER_TICKPOLICY_MERGE:
3892
 
            case VIR_DOMAIN_TIMER_TICKPOLICY_DISCARD:
3893
 
                /* no way to support these modes for pit in qemu */
3894
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3895
 
                                _("unsupported pit tickpolicy '%s'"),
3896
 
                                virDomainTimerTickpolicyTypeToString(def->clock.timers[i]->tickpolicy));
3897
 
                goto error;
3898
 
            }
3899
 
            break;
3900
 
 
3901
 
        case VIR_DOMAIN_TIMER_NAME_HPET:
3902
 
            /* the only meaningful attribute for hpet is "present". If
3903
 
             * present is -1, that means it wasn't specified, and
3904
 
             * should be left at the default for the
3905
 
             * hypervisor. "default" when -no-hpet exists is "yes",
3906
 
             * and when -no-hpet doesn't exist is "no". "confusing"?
3907
 
             * "yes"! */
3908
 
 
3909
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_NO_HPET)) {
3910
 
                if (def->clock.timers[i]->present == 0)
3911
 
                    virCommandAddArg(cmd, "-no-hpet");
3912
 
            } else {
3913
 
                /* no hpet timer available. The only possible action
3914
 
                   is to raise an error if present="yes" */
3915
 
                if (def->clock.timers[i]->present == 1) {
3916
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
3917
 
                                    "%s", _("pit timer is not supported"));
3918
 
                }
3919
 
            }
3920
 
            break;
3921
 
        }
3922
 
    }
3923
 
 
3924
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_NO_REBOOT) &&
3925
 
        def->onReboot != VIR_DOMAIN_LIFECYCLE_RESTART)
3926
 
        virCommandAddArg(cmd, "-no-reboot");
3927
 
 
3928
 
    /* If JSON monitor is enabled, we can receive an event
3929
 
     * when QEMU stops. If we use no-shutdown, then we can
3930
 
     * watch for this event and do a soft/warm reboot.
3931
 
     */
3932
 
    if (monitor_json && qemuCapsGet(qemuCaps, QEMU_CAPS_NO_SHUTDOWN))
3933
 
        virCommandAddArg(cmd, "-no-shutdown");
3934
 
 
3935
 
    if (!(def->features & (1 << VIR_DOMAIN_FEATURE_ACPI)))
3936
 
        virCommandAddArg(cmd, "-no-acpi");
3937
 
 
3938
 
    if (!def->os.bootloader) {
3939
 
        /*
3940
 
         * We prefer using explicit bootindex=N parameters for predictable
3941
 
         * results even though domain XML doesn't use per device boot elements.
3942
 
         * However, we can't use bootindex if boot menu was requested.
3943
 
         */
3944
 
        if (!def->os.nBootDevs) {
3945
 
            /* def->os.nBootDevs is guaranteed to be > 0 unless per-device boot
3946
 
             * configuration is used
3947
 
             */
3948
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX)) {
3949
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
3950
 
                                _("hypervisor lacks deviceboot feature"));
3951
 
                goto error;
3952
 
            }
3953
 
            emitBootindex = true;
3954
 
        } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX) &&
3955
 
                   (def->os.bootmenu != VIR_DOMAIN_BOOT_MENU_ENABLED ||
3956
 
                    !qemuCapsGet(qemuCaps, QEMU_CAPS_BOOT_MENU))) {
3957
 
            emitBootindex = true;
3958
 
        }
3959
 
 
3960
 
        if (!emitBootindex) {
3961
 
            virBuffer boot_buf = VIR_BUFFER_INITIALIZER;
3962
 
            char boot[VIR_DOMAIN_BOOT_LAST+1];
3963
 
 
3964
 
            for (i = 0 ; i < def->os.nBootDevs ; i++) {
3965
 
                switch (def->os.bootDevs[i]) {
3966
 
                case VIR_DOMAIN_BOOT_CDROM:
3967
 
                    boot[i] = 'd';
3968
 
                    break;
3969
 
                case VIR_DOMAIN_BOOT_FLOPPY:
3970
 
                    boot[i] = 'a';
3971
 
                    break;
3972
 
                case VIR_DOMAIN_BOOT_DISK:
3973
 
                    boot[i] = 'c';
3974
 
                    break;
3975
 
                case VIR_DOMAIN_BOOT_NET:
3976
 
                    boot[i] = 'n';
3977
 
                    break;
3978
 
                default:
3979
 
                    boot[i] = 'c';
3980
 
                    break;
3981
 
                }
3982
 
            }
3983
 
            boot[def->os.nBootDevs] = '\0';
3984
 
 
3985
 
            virCommandAddArg(cmd, "-boot");
3986
 
 
3987
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_BOOT_MENU) &&
3988
 
                def->os.bootmenu != VIR_DOMAIN_BOOT_MENU_DEFAULT) {
3989
 
                if (def->os.bootmenu == VIR_DOMAIN_BOOT_MENU_ENABLED)
3990
 
                    virBufferAsprintf(&boot_buf, "order=%s,menu=on", boot);
3991
 
                else if (def->os.bootmenu == VIR_DOMAIN_BOOT_MENU_DISABLED)
3992
 
                    virBufferAsprintf(&boot_buf, "order=%s,menu=off", boot);
3993
 
            } else {
3994
 
                virBufferAdd(&boot_buf, boot, -1);
3995
 
            }
3996
 
 
3997
 
            virCommandAddArgBuffer(cmd, &boot_buf);
3998
 
        }
3999
 
 
4000
 
        if (def->os.kernel)
4001
 
            virCommandAddArgList(cmd, "-kernel", def->os.kernel, NULL);
4002
 
        if (def->os.initrd)
4003
 
            virCommandAddArgList(cmd, "-initrd", def->os.initrd, NULL);
4004
 
        if (def->os.cmdline)
4005
 
            virCommandAddArgList(cmd, "-append", def->os.cmdline, NULL);
4006
 
    } else {
4007
 
        virCommandAddArgList(cmd, "-bootloader", def->os.bootloader, NULL);
4008
 
    }
4009
 
 
4010
 
    for (i = 0 ; i < def->ndisks ; i++) {
4011
 
        virDomainDiskDefPtr disk = def->disks[i];
4012
 
 
4013
 
        if (disk->driverName != NULL &&
4014
 
            !STREQ(disk->driverName, "qemu")) {
4015
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4016
 
                            _("unsupported driver name '%s' for disk '%s'"),
4017
 
                            disk->driverName, disk->src);
4018
 
            goto error;
4019
 
        }
4020
 
    }
4021
 
 
4022
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4023
 
        for (i = 0 ; i < def->ncontrollers ; i++) {
4024
 
            virDomainControllerDefPtr cont = def->controllers[i];
4025
 
 
4026
 
            /* We don't add an explicit IDE or FD controller because the
4027
 
             * provided PIIX4 device already includes one. It isn't possible to
4028
 
             * remove the PIIX4. */
4029
 
            if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE ||
4030
 
                cont->type == VIR_DOMAIN_CONTROLLER_TYPE_FDC)
4031
 
                continue;
4032
 
 
4033
 
            /* Only recent QEMU implements a SATA (AHCI) controller */
4034
 
            if (cont->type == VIR_DOMAIN_CONTROLLER_TYPE_SATA) {
4035
 
                if (!qemuCapsGet(qemuCaps, QEMU_CAPS_ICH9_AHCI)) {
4036
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4037
 
                                    "%s", _("SATA is not supported with this QEMU binary"));
4038
 
                    goto error;
4039
 
                } else {
4040
 
                    char *devstr;
4041
 
 
4042
 
                    virCommandAddArg(cmd, "-device");
4043
 
                    if (!(devstr = qemuBuildControllerDevStr(cont, qemuCaps, NULL)))
4044
 
                        goto error;
4045
 
 
4046
 
                    virCommandAddArg(cmd, devstr);
4047
 
                    VIR_FREE(devstr);
4048
 
                }
4049
 
            } else if (def->controllers[i]->type == VIR_DOMAIN_CONTROLLER_TYPE_USB &&
4050
 
                def->controllers[i]->model == -1 &&
4051
 
                !qemuCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI)) {
4052
 
                if (usblegacy) {
4053
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4054
 
                                    _("Multiple legacy USB controller not supported"));
4055
 
                    goto error;
4056
 
                }
4057
 
                usblegacy = true;
4058
 
            } else {
4059
 
                virCommandAddArg(cmd, "-device");
4060
 
 
4061
 
                char *devstr;
4062
 
                if (!(devstr = qemuBuildControllerDevStr(def->controllers[i], qemuCaps,
4063
 
                                                         &usbcontroller)))
4064
 
                    goto error;
4065
 
 
4066
 
                virCommandAddArg(cmd, devstr);
4067
 
                VIR_FREE(devstr);
4068
 
            }
4069
 
        }
4070
 
    }
4071
 
 
4072
 
    /* If QEMU supports -drive param instead of old -hda, -hdb, -cdrom .. */
4073
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE)) {
4074
 
        int bootCD = 0, bootFloppy = 0, bootDisk = 0;
4075
 
 
4076
 
        if ((qemuCapsGet(qemuCaps, QEMU_CAPS_DRIVE_BOOT) || emitBootindex) &&
4077
 
            !def->os.kernel) {
4078
 
            /* bootDevs will get translated into either bootindex=N or boot=on
4079
 
             * depending on what qemu supports */
4080
 
            for (i = 0 ; i < def->os.nBootDevs ; i++) {
4081
 
                switch (def->os.bootDevs[i]) {
4082
 
                case VIR_DOMAIN_BOOT_CDROM:
4083
 
                    bootCD = i + 1;
4084
 
                    break;
4085
 
                case VIR_DOMAIN_BOOT_FLOPPY:
4086
 
                    bootFloppy = i + 1;
4087
 
                    break;
4088
 
                case VIR_DOMAIN_BOOT_DISK:
4089
 
                    bootDisk = i + 1;
4090
 
                    break;
4091
 
                }
4092
 
            }
4093
 
        }
4094
 
 
4095
 
        for (i = 0 ; i < def->ndisks ; i++) {
4096
 
            char *optstr;
4097
 
            int bootindex = 0;
4098
 
            virDomainDiskDefPtr disk = def->disks[i];
4099
 
            int withDeviceArg = 0;
4100
 
            bool deviceFlagMasked = false;
4101
 
 
4102
 
            /* Unless we have -device, then USB disks need special
4103
 
               handling */
4104
 
            if ((disk->bus == VIR_DOMAIN_DISK_BUS_USB) &&
4105
 
                !qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4106
 
                if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
4107
 
                    virCommandAddArg(cmd, "-usbdevice");
4108
 
                    virCommandAddArgFormat(cmd, "disk:%s", disk->src);
4109
 
                } else {
4110
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR,
4111
 
                                    _("unsupported usb disk type for '%s'"),
4112
 
                                    disk->src);
4113
 
                    goto error;
4114
 
                }
4115
 
                continue;
4116
 
            }
4117
 
 
4118
 
            switch (disk->device) {
4119
 
            case VIR_DOMAIN_DISK_DEVICE_CDROM:
4120
 
                bootindex = bootCD;
4121
 
                bootCD = 0;
4122
 
                break;
4123
 
            case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
4124
 
                bootindex = bootFloppy;
4125
 
                bootFloppy = 0;
4126
 
                break;
4127
 
            case VIR_DOMAIN_DISK_DEVICE_DISK:
4128
 
                bootindex = bootDisk;
4129
 
                bootDisk = 0;
4130
 
                break;
4131
 
            }
4132
 
 
4133
 
            virCommandAddArg(cmd, "-drive");
4134
 
 
4135
 
            /* Unfortunately it is not possible to use
4136
 
               -device for floppies, or Xen paravirt
4137
 
               devices. Fortunately, those don't need
4138
 
               static PCI addresses, so we don't really
4139
 
               care that we can't use -device */
4140
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4141
 
                if (disk->bus != VIR_DOMAIN_DISK_BUS_XEN) {
4142
 
                    withDeviceArg = 1;
4143
 
                } else {
4144
 
                    qemuCapsClear(qemuCaps, QEMU_CAPS_DEVICE);
4145
 
                    deviceFlagMasked = true;
4146
 
                }
4147
 
            }
4148
 
            optstr = qemuBuildDriveStr(conn, disk,
4149
 
                                       emitBootindex ? false : !!bootindex,
4150
 
                                       qemuCaps);
4151
 
            if (deviceFlagMasked)
4152
 
                qemuCapsSet(qemuCaps, QEMU_CAPS_DEVICE);
4153
 
            if (!optstr)
4154
 
                goto error;
4155
 
            virCommandAddArg(cmd, optstr);
4156
 
            VIR_FREE(optstr);
4157
 
 
4158
 
            if (!emitBootindex)
4159
 
                bootindex = 0;
4160
 
            else if (disk->bootIndex)
4161
 
                bootindex = disk->bootIndex;
4162
 
 
4163
 
            if (withDeviceArg) {
4164
 
                if (disk->bus == VIR_DOMAIN_DISK_BUS_FDC) {
4165
 
                    virCommandAddArg(cmd, "-global");
4166
 
                    virCommandAddArgFormat(cmd, "isa-fdc.drive%c=drive-%s",
4167
 
                                           disk->info.addr.drive.unit
4168
 
                                           ? 'B' : 'A',
4169
 
                                           disk->info.alias);
4170
 
 
4171
 
                    if (bootindex) {
4172
 
                        virCommandAddArg(cmd, "-global");
4173
 
                        virCommandAddArgFormat(cmd, "isa-fdc.bootindex%c=%d",
4174
 
                                               disk->info.addr.drive.unit
4175
 
                                               ? 'B' : 'A',
4176
 
                                               bootindex);
4177
 
                    }
4178
 
                } else {
4179
 
                    virCommandAddArg(cmd, "-device");
4180
 
 
4181
 
                    if (!(optstr = qemuBuildDriveDevStr(disk, bootindex,
4182
 
                                                        qemuCaps)))
4183
 
                        goto error;
4184
 
                    virCommandAddArg(cmd, optstr);
4185
 
                    VIR_FREE(optstr);
4186
 
                }
4187
 
            }
4188
 
        }
4189
 
    } else {
4190
 
        for (i = 0 ; i < def->ndisks ; i++) {
4191
 
            char dev[NAME_MAX];
4192
 
            char *file;
4193
 
            const char *fmt;
4194
 
            virDomainDiskDefPtr disk = def->disks[i];
4195
 
 
4196
 
            if (disk->bus == VIR_DOMAIN_DISK_BUS_USB) {
4197
 
                if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
4198
 
                    virCommandAddArg(cmd, "-usbdevice");
4199
 
                    virCommandAddArgFormat(cmd, "disk:%s", disk->src);
4200
 
                } else {
4201
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR,
4202
 
                                    _("unsupported usb disk type for '%s'"),
4203
 
                                    disk->src);
4204
 
                    goto error;
4205
 
                }
4206
 
                continue;
4207
 
            }
4208
 
 
4209
 
            if (STREQ(disk->dst, "hdc") &&
4210
 
                disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) {
4211
 
                if (disk->src) {
4212
 
                    snprintf(dev, NAME_MAX, "-%s", "cdrom");
4213
 
                } else {
4214
 
                    continue;
4215
 
                }
4216
 
            } else {
4217
 
                if (STRPREFIX(disk->dst, "hd") ||
4218
 
                    STRPREFIX(disk->dst, "fd")) {
4219
 
                    snprintf(dev, NAME_MAX, "-%s", disk->dst);
4220
 
                } else {
4221
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR,
4222
 
                                    _("unsupported disk type '%s'"), disk->dst);
4223
 
                    goto error;
4224
 
                }
4225
 
            }
4226
 
 
4227
 
            if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) {
4228
 
                /* QEMU only supports magic FAT format for now */
4229
 
                if (disk->driverType &&
4230
 
                    STRNEQ(disk->driverType, "fat")) {
4231
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR,
4232
 
                                    _("unsupported disk driver type for '%s'"),
4233
 
                                    disk->driverType);
4234
 
                    goto error;
4235
 
                }
4236
 
                if (!disk->readonly) {
4237
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
4238
 
                                    _("cannot create virtual FAT disks in read-write mode"));
4239
 
                    goto error;
4240
 
                }
4241
 
                if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
4242
 
                    fmt = "fat:floppy:%s";
4243
 
                else
4244
 
                    fmt = "fat:%s";
4245
 
 
4246
 
                if (virAsprintf(&file, fmt, disk->src) < 0) {
4247
 
                    goto no_memory;
4248
 
                }
4249
 
            } else if (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK) {
4250
 
                switch (disk->protocol) {
4251
 
                case VIR_DOMAIN_DISK_PROTOCOL_NBD:
4252
 
                    if (disk->nhosts != 1) {
4253
 
                        qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
4254
 
                                        _("NBD accepts only one host"));
4255
 
                        goto error;
4256
 
                    }
4257
 
                    if (virAsprintf(&file, "nbd:%s:%s,", disk->hosts->name,
4258
 
                                    disk->hosts->port) < 0) {
4259
 
                        goto no_memory;
4260
 
                    }
4261
 
                    break;
4262
 
                case VIR_DOMAIN_DISK_PROTOCOL_RBD:
4263
 
                    {
4264
 
                        virBuffer opt = VIR_BUFFER_INITIALIZER;
4265
 
                        if (qemuBuildRBDString(conn, disk, &opt) < 0)
4266
 
                            goto error;
4267
 
                        if (virBufferError(&opt)) {
4268
 
                            virReportOOMError();
4269
 
                            goto error;
4270
 
                        }
4271
 
                        file = virBufferContentAndReset(&opt);
4272
 
                    }
4273
 
                    break;
4274
 
                case VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG:
4275
 
                    if (disk->nhosts == 0) {
4276
 
                        if (virAsprintf(&file, "sheepdog:%s,", disk->src) < 0) {
4277
 
                            goto no_memory;
4278
 
                        }
4279
 
                    } else {
4280
 
                        /* only one host is supported now */
4281
 
                        if (virAsprintf(&file, "sheepdog:%s:%s:%s,",
4282
 
                                        disk->hosts->name, disk->hosts->port,
4283
 
                                        disk->src) < 0) {
4284
 
                            goto no_memory;
4285
 
                        }
4286
 
                    }
4287
 
                    break;
4288
 
                }
4289
 
            } else {
4290
 
                if (!(file = strdup(disk->src))) {
4291
 
                    goto no_memory;
4292
 
                }
4293
 
            }
4294
 
 
4295
 
            virCommandAddArgList(cmd, dev, file, NULL);
4296
 
            VIR_FREE(file);
4297
 
        }
4298
 
    }
4299
 
 
4300
 
    if (qemuCapsGet(qemuCaps, QEMU_CAPS_FSDEV)) {
4301
 
        for (i = 0 ; i < def->nfss ; i++) {
4302
 
            char *optstr;
4303
 
            virDomainFSDefPtr fs = def->fss[i];
4304
 
 
4305
 
            virCommandAddArg(cmd, "-fsdev");
4306
 
            if (!(optstr = qemuBuildFSStr(fs, qemuCaps)))
4307
 
                goto error;
4308
 
            virCommandAddArg(cmd, optstr);
4309
 
            VIR_FREE(optstr);
4310
 
 
4311
 
            virCommandAddArg(cmd, "-device");
4312
 
            if (!(optstr = qemuBuildFSDevStr(fs, qemuCaps)))
4313
 
                goto error;
4314
 
            virCommandAddArg(cmd, optstr);
4315
 
            VIR_FREE(optstr);
4316
 
        }
4317
 
    } else {
4318
 
        if (def->nfss) {
4319
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4320
 
                            _("filesystem passthrough not supported by this QEMU"));
4321
 
            goto error;
4322
 
        }
4323
 
    }
4324
 
 
4325
 
    if (!def->nnets) {
4326
 
        /* If we have -device, then we set -nodefault already */
4327
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
4328
 
            virCommandAddArgList(cmd, "-net", "none", NULL);
4329
 
    } else {
4330
 
        int bootNet = 0;
4331
 
 
4332
 
        if (emitBootindex) {
4333
 
            /* convert <boot dev='network'/> to bootindex since we didn't emit
4334
 
             * -boot n
4335
 
             */
4336
 
            for (i = 0 ; i < def->os.nBootDevs ; i++) {
4337
 
                if (def->os.bootDevs[i] == VIR_DOMAIN_BOOT_NET) {
4338
 
                    bootNet = i + 1;
4339
 
                    break;
4340
 
                }
4341
 
            }
4342
 
        }
4343
 
 
4344
 
        for (i = 0 ; i < def->nnets ; i++) {
4345
 
            virDomainNetDefPtr net = def->nets[i];
4346
 
            char *nic, *host;
4347
 
            char tapfd_name[50];
4348
 
            char vhostfd_name[50] = "";
4349
 
            int vlan;
4350
 
            int bootindex = bootNet;
4351
 
            int actualType;
4352
 
 
4353
 
            bootNet = 0;
4354
 
            if (!bootindex)
4355
 
                bootindex = net->bootIndex;
4356
 
 
4357
 
            /* VLANs are not used with -netdev, so don't record them */
4358
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
4359
 
                qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
4360
 
                vlan = -1;
4361
 
            else
4362
 
                vlan = i;
4363
 
 
4364
 
            /* If appropriate, grab a physical device from the configured
4365
 
             * network's pool of devices, or resolve bridge device name
4366
 
             * to the one defined in the network definition.
4367
 
             */
4368
 
            if (networkAllocateActualDevice(net) < 0)
4369
 
               goto error;
4370
 
 
4371
 
            actualType = virDomainNetGetActualType(net);
4372
 
            if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
4373
 
                actualType == VIR_DOMAIN_NET_TYPE_BRIDGE) {
4374
 
                int tapfd = qemuNetworkIfaceConnect(def, conn, driver, net,
4375
 
                                                    qemuCaps);
4376
 
                if (tapfd < 0)
4377
 
                    goto error;
4378
 
 
4379
 
                last_good_net = i;
4380
 
                virCommandTransferFD(cmd, tapfd);
4381
 
 
4382
 
                if (snprintf(tapfd_name, sizeof(tapfd_name), "%d",
4383
 
                             tapfd) >= sizeof(tapfd_name))
4384
 
                    goto no_memory;
4385
 
            } else if (actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
4386
 
                int tapfd = qemuPhysIfaceConnect(def, driver, net,
4387
 
                                                 qemuCaps, vmop);
4388
 
                if (tapfd < 0)
4389
 
                    goto error;
4390
 
 
4391
 
                last_good_net = i;
4392
 
                virCommandTransferFD(cmd, tapfd);
4393
 
 
4394
 
                if (snprintf(tapfd_name, sizeof(tapfd_name), "%d",
4395
 
                             tapfd) >= sizeof(tapfd_name))
4396
 
                    goto no_memory;
4397
 
            }
4398
 
 
4399
 
            if (actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
4400
 
                actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
4401
 
                actualType == VIR_DOMAIN_NET_TYPE_DIRECT) {
4402
 
                /* Attempt to use vhost-net mode for these types of
4403
 
                   network device */
4404
 
                int vhostfd;
4405
 
 
4406
 
                if (qemuOpenVhostNet(def, net, qemuCaps, &vhostfd) < 0)
4407
 
                    goto error;
4408
 
                if (vhostfd >= 0) {
4409
 
                    virCommandTransferFD(cmd, vhostfd);
4410
 
 
4411
 
                    if (snprintf(vhostfd_name, sizeof(vhostfd_name), "%d",
4412
 
                                 vhostfd) >= sizeof(vhostfd_name))
4413
 
                        goto no_memory;
4414
 
                }
4415
 
            }
4416
 
            /* Possible combinations:
4417
 
             *
4418
 
             *  1. Old way:   -net nic,model=e1000,vlan=1 -net tap,vlan=1
4419
 
             *  2. Semi-new:  -device e1000,vlan=1        -net tap,vlan=1
4420
 
             *  3. Best way:  -netdev type=tap,id=netdev1 -device e1000,id=netdev1
4421
 
             *
4422
 
             * NB, no support for -netdev without use of -device
4423
 
             */
4424
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
4425
 
                qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4426
 
                virCommandAddArg(cmd, "-netdev");
4427
 
                if (!(host = qemuBuildHostNetStr(net, ',', vlan,
4428
 
                                                 tapfd_name, vhostfd_name)))
4429
 
                    goto error;
4430
 
                virCommandAddArg(cmd, host);
4431
 
                VIR_FREE(host);
4432
 
            }
4433
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4434
 
                virCommandAddArg(cmd, "-device");
4435
 
                nic = qemuBuildNicDevStr(net, vlan, bootindex, qemuCaps);
4436
 
                if (!nic)
4437
 
                    goto error;
4438
 
                virCommandAddArg(cmd, nic);
4439
 
                VIR_FREE(nic);
4440
 
            } else {
4441
 
                virCommandAddArg(cmd, "-net");
4442
 
                if (!(nic = qemuBuildNicStr(net, "nic,", vlan)))
4443
 
                    goto error;
4444
 
                virCommandAddArg(cmd, nic);
4445
 
                VIR_FREE(nic);
4446
 
            }
4447
 
            if (!(qemuCapsGet(qemuCaps, QEMU_CAPS_NETDEV) &&
4448
 
                  qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
4449
 
                virCommandAddArg(cmd, "-net");
4450
 
                if (!(host = qemuBuildHostNetStr(net, ',', vlan,
4451
 
                                                 tapfd_name, vhostfd_name)))
4452
 
                    goto error;
4453
 
                virCommandAddArg(cmd, host);
4454
 
                VIR_FREE(host);
4455
 
            }
4456
 
        }
4457
 
    }
4458
 
 
4459
 
    if (def->nsmartcards) {
4460
 
        /* -device usb-ccid was already emitted along with other
4461
 
         * controllers.  For now, qemu handles only one smartcard.  */
4462
 
        virDomainSmartcardDefPtr smartcard = def->smartcards[0];
4463
 
        char *devstr;
4464
 
        virBuffer opt = VIR_BUFFER_INITIALIZER;
4465
 
        int j;
4466
 
        const char *database;
4467
 
 
4468
 
        if (def->nsmartcards > 1 ||
4469
 
            smartcard->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCID ||
4470
 
            smartcard->info.addr.ccid.controller != 0 ||
4471
 
            smartcard->info.addr.ccid.slot != 0) {
4472
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4473
 
                            _("this QEMU binary lacks multiple smartcard "
4474
 
                              "support"));
4475
 
            virBufferFreeAndReset(&opt);
4476
 
            goto error;
4477
 
        }
4478
 
 
4479
 
        switch (smartcard->type) {
4480
 
        case VIR_DOMAIN_SMARTCARD_TYPE_HOST:
4481
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
4482
 
                !qemuCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) {
4483
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4484
 
                                _("this QEMU binary lacks smartcard host "
4485
 
                                  "mode support"));
4486
 
                goto error;
4487
 
            }
4488
 
 
4489
 
            virBufferAddLit(&opt, "ccid-card-emulated,backend=nss-emulated");
4490
 
            break;
4491
 
 
4492
 
        case VIR_DOMAIN_SMARTCARD_TYPE_HOST_CERTIFICATES:
4493
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
4494
 
                !qemuCapsGet(qemuCaps, QEMU_CAPS_CCID_EMULATED)) {
4495
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4496
 
                                _("this QEMU binary lacks smartcard host "
4497
 
                                  "mode support"));
4498
 
                goto error;
4499
 
            }
4500
 
 
4501
 
            virBufferAddLit(&opt, "ccid-card-emulated,backend=certificates");
4502
 
            for (j = 0; j < VIR_DOMAIN_SMARTCARD_NUM_CERTIFICATES; j++) {
4503
 
                if (strchr(smartcard->data.cert.file[j], ',')) {
4504
 
                    virBufferFreeAndReset(&opt);
4505
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4506
 
                                    _("invalid certificate name: %s"),
4507
 
                                    smartcard->data.cert.file[j]);
4508
 
                    goto error;
4509
 
                }
4510
 
                virBufferAsprintf(&opt, ",cert%d=%s", j + 1,
4511
 
                                  smartcard->data.cert.file[j]);
4512
 
            }
4513
 
            if (smartcard->data.cert.database) {
4514
 
                if (strchr(smartcard->data.cert.database, ',')) {
4515
 
                    virBufferFreeAndReset(&opt);
4516
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4517
 
                                    _("invalid database name: %s"),
4518
 
                                    smartcard->data.cert.database);
4519
 
                    goto error;
4520
 
                }
4521
 
                database = smartcard->data.cert.database;
4522
 
            } else {
4523
 
                database = VIR_DOMAIN_SMARTCARD_DEFAULT_DATABASE;
4524
 
            }
4525
 
            virBufferAsprintf(&opt, ",database=%s", database);
4526
 
            break;
4527
 
 
4528
 
        case VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH:
4529
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
4530
 
                !qemuCapsGet(qemuCaps, QEMU_CAPS_CCID_PASSTHRU)) {
4531
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4532
 
                                _("this QEMU binary lacks smartcard "
4533
 
                                  "passthrough mode support"));
4534
 
                goto error;
4535
 
            }
4536
 
 
4537
 
            virCommandAddArg(cmd, "-chardev");
4538
 
            if (!(devstr = qemuBuildChrChardevStr(&smartcard->data.passthru,
4539
 
                                                  smartcard->info.alias,
4540
 
                                                  qemuCaps))) {
4541
 
                virBufferFreeAndReset(&opt);
4542
 
                goto error;
4543
 
            }
4544
 
            virCommandAddArg(cmd, devstr);
4545
 
            VIR_FREE(devstr);
4546
 
 
4547
 
            virBufferAsprintf(&opt, "ccid-card-passthru,chardev=char%s",
4548
 
                              smartcard->info.alias);
4549
 
            break;
4550
 
 
4551
 
        default:
4552
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
4553
 
                            _("unexpected smartcard type %d"),
4554
 
                            smartcard->type);
4555
 
            virBufferFreeAndReset(&opt);
4556
 
            goto error;
4557
 
        }
4558
 
        virCommandAddArg(cmd, "-device");
4559
 
        virBufferAsprintf(&opt, ",id=%s,bus=ccid0.0", smartcard->info.alias);
4560
 
        virCommandAddArgBuffer(cmd, &opt);
4561
 
    }
4562
 
 
4563
 
    if (!def->nserials) {
4564
 
        /* If we have -device, then we set -nodefault already */
4565
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
4566
 
            virCommandAddArgList(cmd, "-serial", "none", NULL);
4567
 
    } else {
4568
 
        for (i = 0 ; i < def->nserials ; i++) {
4569
 
            virDomainChrDefPtr serial = def->serials[i];
4570
 
            char *devstr;
4571
 
 
4572
 
            /* Use -chardev with -device if they are available */
4573
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) &&
4574
 
                qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4575
 
                virCommandAddArg(cmd, "-chardev");
4576
 
                if (!(devstr = qemuBuildChrChardevStr(&serial->source,
4577
 
                                                      serial->info.alias,
4578
 
                                                      qemuCaps)))
4579
 
                    goto error;
4580
 
                virCommandAddArg(cmd, devstr);
4581
 
                VIR_FREE(devstr);
4582
 
 
4583
 
                virCommandAddArg(cmd, "-device");
4584
 
                virCommandAddArgFormat(cmd, "isa-serial,chardev=char%s,id=%s",
4585
 
                                       serial->info.alias, serial->info.alias);
4586
 
            } else {
4587
 
                virCommandAddArg(cmd, "-serial");
4588
 
                if (!(devstr = qemuBuildChrArgStr(&serial->source, NULL)))
4589
 
                    goto error;
4590
 
                virCommandAddArg(cmd, devstr);
4591
 
                VIR_FREE(devstr);
4592
 
            }
4593
 
        }
4594
 
    }
4595
 
 
4596
 
    if (!def->nparallels) {
4597
 
        /* If we have -device, then we set -nodefault already */
4598
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
4599
 
            virCommandAddArgList(cmd, "-parallel", "none", NULL);
4600
 
    } else {
4601
 
        for (i = 0 ; i < def->nparallels ; i++) {
4602
 
            virDomainChrDefPtr parallel = def->parallels[i];
4603
 
            char *devstr;
4604
 
 
4605
 
            /* Use -chardev with -device if they are available */
4606
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) &&
4607
 
                qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4608
 
                virCommandAddArg(cmd, "-chardev");
4609
 
                if (!(devstr = qemuBuildChrChardevStr(&parallel->source,
4610
 
                                                      parallel->info.alias,
4611
 
                                                      qemuCaps)))
4612
 
                    goto error;
4613
 
                virCommandAddArg(cmd, devstr);
4614
 
                VIR_FREE(devstr);
4615
 
 
4616
 
                virCommandAddArg(cmd, "-device");
4617
 
                virCommandAddArgFormat(cmd, "isa-parallel,chardev=char%s,id=%s",
4618
 
                                       parallel->info.alias,
4619
 
                                       parallel->info.alias);
4620
 
            } else {
4621
 
                virCommandAddArg(cmd, "-parallel");
4622
 
                if (!(devstr = qemuBuildChrArgStr(&parallel->source, NULL)))
4623
 
                      goto error;
4624
 
                virCommandAddArg(cmd, devstr);
4625
 
                VIR_FREE(devstr);
4626
 
            }
4627
 
        }
4628
 
    }
4629
 
 
4630
 
    for (i = 0 ; i < def->nchannels ; i++) {
4631
 
        virDomainChrDefPtr channel = def->channels[i];
4632
 
        char *devstr;
4633
 
        char *addr;
4634
 
        int port;
4635
 
 
4636
 
        switch(channel->targetType) {
4637
 
        case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD:
4638
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) ||
4639
 
                !qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4640
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4641
 
                                "%s", _("guestfwd requires QEMU to support -chardev & -device"));
4642
 
                goto error;
4643
 
            }
4644
 
 
4645
 
            virCommandAddArg(cmd, "-chardev");
4646
 
            if (!(devstr = qemuBuildChrChardevStr(&channel->source,
4647
 
                                                  channel->info.alias,
4648
 
                                                  qemuCaps)))
4649
 
                goto error;
4650
 
            virCommandAddArg(cmd, devstr);
4651
 
            VIR_FREE(devstr);
4652
 
 
4653
 
            addr = virSocketAddrFormat(channel->target.addr);
4654
 
            if (!addr)
4655
 
                goto error;
4656
 
            port = virSocketAddrGetPort(channel->target.addr);
4657
 
 
4658
 
            virCommandAddArg(cmd, "-netdev");
4659
 
            virCommandAddArgFormat(cmd,
4660
 
                                   "user,guestfwd=tcp:%s:%i,chardev=char%s,id=user-%s",
4661
 
                                   addr, port, channel->info.alias,
4662
 
                                   channel->info.alias);
4663
 
            VIR_FREE(addr);
4664
 
            break;
4665
 
 
4666
 
        case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO:
4667
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4668
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4669
 
                    _("virtio channel requires QEMU to support -device"));
4670
 
                goto error;
4671
 
            }
4672
 
 
4673
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE_SPICEVMC) &&
4674
 
                channel->source.type == VIR_DOMAIN_CHR_TYPE_SPICEVMC) {
4675
 
                /* spicevmc was originally introduced via a -device
4676
 
                 * with a backend internal to qemu; although we prefer
4677
 
                 * the newer -chardev interface.  */
4678
 
                ;
4679
 
            } else {
4680
 
                virCommandAddArg(cmd, "-chardev");
4681
 
                if (!(devstr = qemuBuildChrChardevStr(&channel->source,
4682
 
                                                      channel->info.alias,
4683
 
                                                      qemuCaps)))
4684
 
                    goto error;
4685
 
                virCommandAddArg(cmd, devstr);
4686
 
                VIR_FREE(devstr);
4687
 
            }
4688
 
 
4689
 
            virCommandAddArg(cmd, "-device");
4690
 
            if (!(devstr = qemuBuildVirtioSerialPortDevStr(channel,
4691
 
                                                           qemuCaps)))
4692
 
                goto error;
4693
 
            virCommandAddArg(cmd, devstr);
4694
 
            VIR_FREE(devstr);
4695
 
            break;
4696
 
        }
4697
 
    }
4698
 
 
4699
 
    /* Explicit console devices */
4700
 
    for (i = 0 ; i < def->nconsoles ; i++) {
4701
 
        virDomainChrDefPtr console = def->consoles[i];
4702
 
        char *devstr;
4703
 
 
4704
 
        switch(console->targetType) {
4705
 
        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO:
4706
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4707
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4708
 
                    _("virtio channel requires QEMU to support -device"));
4709
 
                goto error;
4710
 
            }
4711
 
 
4712
 
            virCommandAddArg(cmd, "-chardev");
4713
 
            if (!(devstr = qemuBuildChrChardevStr(&console->source,
4714
 
                                                  console->info.alias,
4715
 
                                                  qemuCaps)))
4716
 
                goto error;
4717
 
            virCommandAddArg(cmd, devstr);
4718
 
            VIR_FREE(devstr);
4719
 
 
4720
 
            virCommandAddArg(cmd, "-device");
4721
 
            if (!(devstr = qemuBuildVirtioSerialPortDevStr(console,
4722
 
                                                           qemuCaps)))
4723
 
                goto error;
4724
 
            virCommandAddArg(cmd, devstr);
4725
 
            VIR_FREE(devstr);
4726
 
            break;
4727
 
 
4728
 
        case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL:
4729
 
            break;
4730
 
 
4731
 
        default:
4732
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4733
 
                            _("unsupported console target type %s"),
4734
 
                            NULLSTR(virDomainChrConsoleTargetTypeToString(console->targetType)));
4735
 
            goto error;
4736
 
        }
4737
 
    }
4738
 
 
4739
 
    if (usbcontroller == 0)
4740
 
        virCommandAddArg(cmd, "-usb");
4741
 
 
4742
 
    for (i = 0 ; i < def->nhubs ; i++) {
4743
 
        virDomainHubDefPtr hub = def->hubs[i];
4744
 
        char *optstr;
4745
 
 
4746
 
        virCommandAddArg(cmd, "-device");
4747
 
        if (!(optstr = qemuBuildHubDevStr(hub, qemuCaps)))
4748
 
            goto error;
4749
 
        virCommandAddArg(cmd, optstr);
4750
 
        VIR_FREE(optstr);
4751
 
    }
4752
 
 
4753
 
    for (i = 0 ; i < def->ninputs ; i++) {
4754
 
        virDomainInputDefPtr input = def->inputs[i];
4755
 
 
4756
 
        if (input->bus == VIR_DOMAIN_INPUT_BUS_USB) {
4757
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
4758
 
                char *optstr;
4759
 
                virCommandAddArg(cmd, "-device");
4760
 
                if (!(optstr = qemuBuildUSBInputDevStr(input, qemuCaps)))
4761
 
                    goto error;
4762
 
                virCommandAddArg(cmd, optstr);
4763
 
                VIR_FREE(optstr);
4764
 
            } else {
4765
 
                virCommandAddArgList(cmd, "-usbdevice",
4766
 
                                     input->type == VIR_DOMAIN_INPUT_TYPE_MOUSE
4767
 
                                     ? "mouse" : "tablet", NULL);
4768
 
            }
4769
 
        }
4770
 
    }
4771
 
 
4772
 
    if (def->ngraphics > 1) {
4773
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
4774
 
                        "%s", _("only 1 graphics device is supported"));
4775
 
        goto error;
4776
 
    }
4777
 
 
4778
 
    if ((def->ngraphics == 1) &&
4779
 
        def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC) {
4780
 
        virBuffer opt = VIR_BUFFER_INITIALIZER;
4781
 
 
4782
 
        if (def->graphics[0]->data.vnc.socket ||
4783
 
            driver->vncAutoUnixSocket) {
4784
 
 
4785
 
            if (!def->graphics[0]->data.vnc.socket &&
4786
 
                virAsprintf(&def->graphics[0]->data.vnc.socket,
4787
 
                            "%s/%s.vnc", driver->libDir, def->name) == -1) {
4788
 
                goto no_memory;
4789
 
            }
4790
 
 
4791
 
            virBufferAsprintf(&opt, "unix:%s",
4792
 
                              def->graphics[0]->data.vnc.socket);
4793
 
 
4794
 
        } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_VNC_COLON)) {
4795
 
            const char *listenNetwork;
4796
 
            const char *listenAddr = NULL;
4797
 
            char *netAddr = NULL;
4798
 
            bool escapeAddr;
4799
 
            int ret;
4800
 
 
4801
 
            switch (virDomainGraphicsListenGetType(def->graphics[0], 0)) {
4802
 
            case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
4803
 
                listenAddr = virDomainGraphicsListenGetAddress(def->graphics[0], 0);
4804
 
                break;
4805
 
 
4806
 
            case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
4807
 
                listenNetwork = virDomainGraphicsListenGetNetwork(def->graphics[0], 0);
4808
 
                if (!listenNetwork)
4809
 
                    break;
4810
 
                ret = networkGetNetworkAddress(listenNetwork, &netAddr);
4811
 
                if (ret <= -2) {
4812
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4813
 
                                    "%s", _("network-based listen not possible, "
4814
 
                                            "network driver not present"));
4815
 
                    goto error;
4816
 
                }
4817
 
                if (ret < 0) {
4818
 
                    qemuReportError(VIR_ERR_XML_ERROR,
4819
 
                                    _("listen network '%s' had no usable address"),
4820
 
                                    listenNetwork);
4821
 
                    goto error;
4822
 
                }
4823
 
                listenAddr = netAddr;
4824
 
                /* store the address we found in the <graphics> element so it will
4825
 
                 * show up in status. */
4826
 
                if (virDomainGraphicsListenSetAddress(def->graphics[0], 0,
4827
 
                                                      listenAddr, -1, false) < 0)
4828
 
                   goto error;
4829
 
                break;
4830
 
            }
4831
 
 
4832
 
            if (!listenAddr)
4833
 
                listenAddr = driver->vncListen;
4834
 
 
4835
 
            escapeAddr = strchr(listenAddr, ':') != NULL;
4836
 
            if (escapeAddr)
4837
 
                virBufferAsprintf(&opt, "[%s]", listenAddr);
4838
 
            else
4839
 
                virBufferAdd(&opt, listenAddr, -1);
4840
 
            virBufferAsprintf(&opt, ":%d",
4841
 
                              def->graphics[0]->data.vnc.port - 5900);
4842
 
 
4843
 
            VIR_FREE(netAddr);
4844
 
        } else {
4845
 
            virBufferAsprintf(&opt, "%d",
4846
 
                              def->graphics[0]->data.vnc.port - 5900);
4847
 
        }
4848
 
 
4849
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_VNC_COLON)) {
4850
 
            if (def->graphics[0]->data.vnc.auth.passwd ||
4851
 
                driver->vncPassword)
4852
 
                virBufferAddLit(&opt, ",password");
4853
 
 
4854
 
            if (driver->vncTLS) {
4855
 
                virBufferAddLit(&opt, ",tls");
4856
 
                if (driver->vncTLSx509verify) {
4857
 
                    virBufferAsprintf(&opt, ",x509verify=%s",
4858
 
                                      driver->vncTLSx509certdir);
4859
 
                } else {
4860
 
                    virBufferAsprintf(&opt, ",x509=%s",
4861
 
                                      driver->vncTLSx509certdir);
4862
 
                }
4863
 
            }
4864
 
 
4865
 
            if (driver->vncSASL) {
4866
 
                virBufferAddLit(&opt, ",sasl");
4867
 
 
4868
 
                if (driver->vncSASLdir)
4869
 
                    virCommandAddEnvPair(cmd, "SASL_CONF_DIR",
4870
 
                                         driver->vncSASLdir);
4871
 
 
4872
 
                /* TODO: Support ACLs later */
4873
 
            }
4874
 
        }
4875
 
 
4876
 
        virCommandAddArg(cmd, "-vnc");
4877
 
        virCommandAddArgBuffer(cmd, &opt);
4878
 
        if (def->graphics[0]->data.vnc.keymap) {
4879
 
            virCommandAddArgList(cmd, "-k", def->graphics[0]->data.vnc.keymap,
4880
 
                                 NULL);
4881
 
        }
4882
 
 
4883
 
        /* Unless user requested it, set the audio backend to none, to
4884
 
         * prevent it opening the host OS audio devices, since that causes
4885
 
         * security issues and might not work when using VNC.
4886
 
         */
4887
 
        if (driver->vncAllowHostAudio) {
4888
 
            virCommandAddEnvPass(cmd, "QEMU_AUDIO_DRV");
4889
 
        } else {
4890
 
            virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=none");
4891
 
        }
4892
 
    } else if ((def->ngraphics == 1) &&
4893
 
               def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) {
4894
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_0_10) &&
4895
 
            !qemuCapsGet(qemuCaps, QEMU_CAPS_SDL)) {
4896
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4897
 
                            _("sdl not supported by '%s'"),
4898
 
                            def->emulator);
4899
 
            goto error;
4900
 
        }
4901
 
 
4902
 
        if (def->graphics[0]->data.sdl.xauth)
4903
 
            virCommandAddEnvPair(cmd, "XAUTHORITY",
4904
 
                                 def->graphics[0]->data.sdl.xauth);
4905
 
        if (def->graphics[0]->data.sdl.display)
4906
 
            virCommandAddEnvPair(cmd, "DISPLAY",
4907
 
                                 def->graphics[0]->data.sdl.display);
4908
 
        if (def->graphics[0]->data.sdl.fullscreen)
4909
 
            virCommandAddArg(cmd, "-full-screen");
4910
 
 
4911
 
        /* If using SDL for video, then we should just let it
4912
 
         * use QEMU's host audio drivers, possibly SDL too
4913
 
         * User can set these two before starting libvirtd
4914
 
         */
4915
 
        virCommandAddEnvPass(cmd, "QEMU_AUDIO_DRV");
4916
 
        virCommandAddEnvPass(cmd, "SDL_AUDIODRIVER");
4917
 
 
4918
 
        /* New QEMU has this flag to let us explicitly ask for
4919
 
         * SDL graphics. This is better than relying on the
4920
 
         * default, since the default changes :-( */
4921
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_SDL))
4922
 
            virCommandAddArg(cmd, "-sdl");
4923
 
 
4924
 
    } else if ((def->ngraphics == 1) &&
4925
 
               def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SPICE) {
4926
 
        virBuffer opt = VIR_BUFFER_INITIALIZER;
4927
 
        const char *listenNetwork;
4928
 
        const char *listenAddr = NULL;
4929
 
        char *netAddr = NULL;
4930
 
        int ret;
4931
 
 
4932
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_SPICE)) {
4933
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
4934
 
                            _("spice graphics are not supported with this QEMU"));
4935
 
            goto error;
4936
 
        }
4937
 
 
4938
 
        virBufferAsprintf(&opt, "port=%u", def->graphics[0]->data.spice.port);
4939
 
 
4940
 
        if (driver->spiceTLS && def->graphics[0]->data.spice.tlsPort != -1)
4941
 
            virBufferAsprintf(&opt, ",tls-port=%u", def->graphics[0]->data.spice.tlsPort);
4942
 
 
4943
 
        switch (virDomainGraphicsListenGetType(def->graphics[0], 0)) {
4944
 
        case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS:
4945
 
            listenAddr = virDomainGraphicsListenGetAddress(def->graphics[0], 0);
4946
 
            break;
4947
 
 
4948
 
        case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK:
4949
 
            listenNetwork = virDomainGraphicsListenGetNetwork(def->graphics[0], 0);
4950
 
            if (!listenNetwork)
4951
 
                break;
4952
 
            ret = networkGetNetworkAddress(listenNetwork, &netAddr);
4953
 
            if (ret <= -2) {
4954
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
4955
 
                                "%s", _("network-based listen not possible, "
4956
 
                                        "network driver not present"));
4957
 
                goto error;
4958
 
            }
4959
 
            if (ret < 0) {
4960
 
                qemuReportError(VIR_ERR_XML_ERROR,
4961
 
                                _("listen network '%s' had no usable address"),
4962
 
                                listenNetwork);
4963
 
                goto error;
4964
 
            }
4965
 
            listenAddr = netAddr;
4966
 
            /* store the address we found in the <graphics> element so it will
4967
 
             * show up in status. */
4968
 
            if (virDomainGraphicsListenSetAddress(def->graphics[0], 0,
4969
 
                                                  listenAddr, -1, false) < 0)
4970
 
               goto error;
4971
 
            break;
4972
 
        }
4973
 
 
4974
 
        if (!listenAddr)
4975
 
            listenAddr = driver->spiceListen;
4976
 
        if (listenAddr)
4977
 
            virBufferAsprintf(&opt, ",addr=%s", listenAddr);
4978
 
 
4979
 
        VIR_FREE(netAddr);
4980
 
 
4981
 
        /* In the password case we set it via monitor command, to avoid
4982
 
         * making it visible on CLI, so there's no use of password=XXX
4983
 
         * in this bit of the code */
4984
 
        if (!def->graphics[0]->data.spice.auth.passwd &&
4985
 
            !driver->spicePassword)
4986
 
            virBufferAddLit(&opt, ",disable-ticketing");
4987
 
 
4988
 
        if (driver->spiceTLS)
4989
 
            virBufferAsprintf(&opt, ",x509-dir=%s",
4990
 
                              driver->spiceTLSx509certdir);
4991
 
 
4992
 
        for (i = 0 ; i < VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST ; i++) {
4993
 
            int mode = def->graphics[0]->data.spice.channels[i];
4994
 
            switch (mode) {
4995
 
            case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_SECURE:
4996
 
                virBufferAsprintf(&opt, ",tls-channel=%s",
4997
 
                                  virDomainGraphicsSpiceChannelNameTypeToString(i));
4998
 
                break;
4999
 
            case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_INSECURE:
5000
 
                virBufferAsprintf(&opt, ",plaintext-channel=%s",
5001
 
                                  virDomainGraphicsSpiceChannelNameTypeToString(i));
5002
 
                break;
5003
 
            }
5004
 
        }
5005
 
        if (def->graphics[0]->data.spice.image)
5006
 
            virBufferAsprintf(&opt, ",image-compression=%s",
5007
 
                              virDomainGraphicsSpiceImageCompressionTypeToString(def->graphics[0]->data.spice.image));
5008
 
        if (def->graphics[0]->data.spice.jpeg)
5009
 
            virBufferAsprintf(&opt, ",jpeg-wan-compression=%s",
5010
 
                              virDomainGraphicsSpiceJpegCompressionTypeToString(def->graphics[0]->data.spice.jpeg));
5011
 
        if (def->graphics[0]->data.spice.zlib)
5012
 
            virBufferAsprintf(&opt, ",zlib-glz-wan-compression=%s",
5013
 
                              virDomainGraphicsSpiceZlibCompressionTypeToString(def->graphics[0]->data.spice.zlib));
5014
 
        if (def->graphics[0]->data.spice.playback)
5015
 
            virBufferAsprintf(&opt, ",playback-compression=%s",
5016
 
                              virDomainGraphicsSpicePlaybackCompressionTypeToString(def->graphics[0]->data.spice.playback));
5017
 
        if (def->graphics[0]->data.spice.streaming)
5018
 
            virBufferAsprintf(&opt, ",streaming-video=%s",
5019
 
                              virDomainGraphicsSpiceStreamingModeTypeToString(def->graphics[0]->data.spice.streaming));
5020
 
        if (def->graphics[0]->data.spice.copypaste == VIR_DOMAIN_GRAPHICS_SPICE_CLIPBOARD_COPYPASTE_NO)
5021
 
            virBufferAddLit(&opt, ",disable-copy-paste");
5022
 
 
5023
 
        virCommandAddArg(cmd, "-spice");
5024
 
        virCommandAddArgBuffer(cmd, &opt);
5025
 
        if (def->graphics[0]->data.spice.keymap)
5026
 
            virCommandAddArgList(cmd, "-k",
5027
 
                                 def->graphics[0]->data.spice.keymap, NULL);
5028
 
        /* SPICE includes native support for tunnelling audio, so we
5029
 
         * set the audio backend to point at SPICE's own driver
5030
 
         */
5031
 
        virCommandAddEnvString(cmd, "QEMU_AUDIO_DRV=spice");
5032
 
 
5033
 
    } else if ((def->ngraphics == 1)) {
5034
 
        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5035
 
                        _("unsupported graphics type '%s'"),
5036
 
                        virDomainGraphicsTypeToString(def->graphics[0]->type));
5037
 
        goto error;
5038
 
    }
5039
 
 
5040
 
    if (def->nvideos > 0) {
5041
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_VGA)) {
5042
 
            if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_XEN) {
5043
 
                /* nothing - vga has no effect on Xen pvfb */
5044
 
            } else {
5045
 
                if ((def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_QXL) &&
5046
 
                    !qemuCapsGet(qemuCaps, QEMU_CAPS_VGA_QXL)) {
5047
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
5048
 
                                    _("This QEMU does not support QXL graphics adapters"));
5049
 
                    goto error;
5050
 
                }
5051
 
 
5052
 
                const char *vgastr = qemuVideoTypeToString(def->videos[0]->type);
5053
 
                if (!vgastr || STREQ(vgastr, "")) {
5054
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5055
 
                                    _("video type %s is not supported with QEMU"),
5056
 
                                    virDomainVideoTypeToString(def->videos[0]->type));
5057
 
                    goto error;
5058
 
                }
5059
 
 
5060
 
                virCommandAddArgList(cmd, "-vga", vgastr, NULL);
5061
 
 
5062
 
                if (def->videos[0]->type == VIR_DOMAIN_VIDEO_TYPE_QXL) {
5063
 
                    if (def->videos[0]->vram &&
5064
 
                        qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
5065
 
                        if (def->videos[0]->vram > (UINT_MAX / 1024)) {
5066
 
                            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5067
 
                                            _("value for 'vram' must be less than '%u'"),
5068
 
                                            UINT_MAX / 1024);
5069
 
                            goto error;
5070
 
                        }
5071
 
 
5072
 
                        virCommandAddArg(cmd, "-global");
5073
 
 
5074
 
                        if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QXL_VGA))
5075
 
                            virCommandAddArgFormat(cmd, "qxl-vga.vram_size=%u",
5076
 
                                                   def->videos[0]->vram * 1024);
5077
 
                        else
5078
 
                            virCommandAddArgFormat(cmd, "qxl.vram_size=%u",
5079
 
                                                   def->videos[0]->vram * 1024);
5080
 
                    }
5081
 
                }
5082
 
            }
5083
 
        } else {
5084
 
 
5085
 
            switch (def->videos[0]->type) {
5086
 
            case VIR_DOMAIN_VIDEO_TYPE_VGA:
5087
 
                virCommandAddArg(cmd, "-std-vga");
5088
 
                break;
5089
 
 
5090
 
            case VIR_DOMAIN_VIDEO_TYPE_VMVGA:
5091
 
                virCommandAddArg(cmd, "-vmwarevga");
5092
 
                break;
5093
 
 
5094
 
            case VIR_DOMAIN_VIDEO_TYPE_XEN:
5095
 
            case VIR_DOMAIN_VIDEO_TYPE_CIRRUS:
5096
 
                /* No special args - this is the default */
5097
 
                break;
5098
 
 
5099
 
            default:
5100
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5101
 
                                _("video type %s is not supported with this QEMU"),
5102
 
                                virDomainVideoTypeToString(def->videos[0]->type));
5103
 
                goto error;
5104
 
            }
5105
 
        }
5106
 
 
5107
 
        if (def->nvideos > 1) {
5108
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
5109
 
                for (i = 1 ; i < def->nvideos ; i++) {
5110
 
                    char *str;
5111
 
                    if (def->videos[i]->type != VIR_DOMAIN_VIDEO_TYPE_QXL) {
5112
 
                        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5113
 
                                        _("video type %s is only valid as primary video card"),
5114
 
                                        virDomainVideoTypeToString(def->videos[0]->type));
5115
 
                        goto error;
5116
 
                    }
5117
 
 
5118
 
                    virCommandAddArg(cmd, "-device");
5119
 
 
5120
 
                    if (!(str = qemuBuildVideoDevStr(def->videos[i], qemuCaps)))
5121
 
                        goto error;
5122
 
 
5123
 
                    virCommandAddArg(cmd, str);
5124
 
                    VIR_FREE(str);
5125
 
                }
5126
 
            } else {
5127
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5128
 
                                "%s", _("only one video card is currently supported"));
5129
 
                goto error;
5130
 
            }
5131
 
        }
5132
 
 
5133
 
    } else {
5134
 
        /* If we have -device, then we set -nodefault already */
5135
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE) &&
5136
 
            qemuCapsGet(qemuCaps, QEMU_CAPS_VGA) &&
5137
 
            qemuCapsGet(qemuCaps, QEMU_CAPS_VGA_NONE))
5138
 
            virCommandAddArgList(cmd, "-vga", "none", NULL);
5139
 
    }
5140
 
 
5141
 
    /* Add sound hardware */
5142
 
    if (def->nsounds) {
5143
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
5144
 
            for (i = 0 ; i < def->nsounds ; i++) {
5145
 
                virDomainSoundDefPtr sound = def->sounds[i];
5146
 
                char *str = NULL;
5147
 
 
5148
 
                /* Sadly pcspk device doesn't use -device syntax. Fortunately
5149
 
                 * we don't need to set any PCI address on it, so we don't
5150
 
                 * mind too much */
5151
 
                if (sound->model == VIR_DOMAIN_SOUND_MODEL_PCSPK) {
5152
 
                    virCommandAddArgList(cmd, "-soundhw", "pcspk", NULL);
5153
 
                } else {
5154
 
                    virCommandAddArg(cmd, "-device");
5155
 
                    if (!(str = qemuBuildSoundDevStr(sound, qemuCaps)))
5156
 
                        goto error;
5157
 
 
5158
 
                    virCommandAddArg(cmd, str);
5159
 
 
5160
 
                    if (sound->model == VIR_DOMAIN_SOUND_MODEL_ICH6) {
5161
 
                        char *codecstr = NULL;
5162
 
                        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_HDA_DUPLEX)) {
5163
 
                            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
5164
 
                                    _("this QEMU binary lacks hda support"));
5165
 
                            goto error;
5166
 
                        }
5167
 
 
5168
 
                        virCommandAddArg(cmd, "-device");
5169
 
                        if (!(codecstr = qemuBuildSoundCodecStr(sound,
5170
 
                                                            "hda-duplex"))) {
5171
 
                            goto error;
5172
 
                        }
5173
 
 
5174
 
                        virCommandAddArg(cmd, codecstr);
5175
 
                        VIR_FREE(codecstr);
5176
 
                    }
5177
 
 
5178
 
                    VIR_FREE(str);
5179
 
                }
5180
 
            }
5181
 
        } else {
5182
 
            int size = 100;
5183
 
            char *modstr;
5184
 
            if (VIR_ALLOC_N(modstr, size+1) < 0)
5185
 
                goto no_memory;
5186
 
 
5187
 
            for (i = 0 ; i < def->nsounds && size > 0 ; i++) {
5188
 
                virDomainSoundDefPtr sound = def->sounds[i];
5189
 
                const char *model = virDomainSoundModelTypeToString(sound->model);
5190
 
                if (!model) {
5191
 
                    VIR_FREE(modstr);
5192
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR,
5193
 
                                    "%s", _("invalid sound model"));
5194
 
                    goto error;
5195
 
                }
5196
 
 
5197
 
                if (sound->model == VIR_DOMAIN_SOUND_MODEL_ICH6) {
5198
 
                    VIR_FREE(modstr);
5199
 
                    qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
5200
 
                                    _("this QEMU binary lacks hda support"));
5201
 
                    goto error;
5202
 
                }
5203
 
 
5204
 
                strncat(modstr, model, size);
5205
 
                size -= strlen(model);
5206
 
                if (i < (def->nsounds - 1))
5207
 
                    strncat(modstr, ",", size--);
5208
 
            }
5209
 
            virCommandAddArgList(cmd, "-soundhw", modstr, NULL);
5210
 
            VIR_FREE(modstr);
5211
 
        }
5212
 
    }
5213
 
 
5214
 
    /* Add watchdog hardware */
5215
 
    if (def->watchdog) {
5216
 
        virDomainWatchdogDefPtr watchdog = def->watchdog;
5217
 
        char *optstr;
5218
 
 
5219
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
5220
 
            virCommandAddArg(cmd, "-device");
5221
 
 
5222
 
            optstr = qemuBuildWatchdogDevStr(watchdog, qemuCaps);
5223
 
            if (!optstr)
5224
 
                goto error;
5225
 
        } else {
5226
 
            virCommandAddArg(cmd, "-watchdog");
5227
 
 
5228
 
            const char *model = virDomainWatchdogModelTypeToString(watchdog->model);
5229
 
            if (!model) {
5230
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
5231
 
                                "%s", _("missing watchdog model"));
5232
 
                goto error;
5233
 
            }
5234
 
 
5235
 
            if (!(optstr = strdup(model)))
5236
 
                goto no_memory;
5237
 
        }
5238
 
        virCommandAddArg(cmd, optstr);
5239
 
        VIR_FREE(optstr);
5240
 
 
5241
 
        int act = watchdog->action;
5242
 
        if (act == VIR_DOMAIN_WATCHDOG_ACTION_DUMP)
5243
 
            act = VIR_DOMAIN_WATCHDOG_ACTION_PAUSE;
5244
 
        const char *action = virDomainWatchdogActionTypeToString(act);
5245
 
        if (!action) {
5246
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
5247
 
                            "%s", _("invalid watchdog action"));
5248
 
            goto error;
5249
 
        }
5250
 
        virCommandAddArgList(cmd, "-watchdog-action", action, NULL);
5251
 
    }
5252
 
 
5253
 
    /* Add redirected devices */
5254
 
    for (i = 0 ; i < def->nredirdevs ; i++) {
5255
 
        virDomainRedirdevDefPtr redirdev = def->redirdevs[i];
5256
 
        char *devstr;
5257
 
 
5258
 
        virCommandAddArg(cmd, "-chardev");
5259
 
        if (!(devstr = qemuBuildChrChardevStr(&redirdev->source.chr,
5260
 
                                              redirdev->info.alias,
5261
 
                                              qemuCaps))) {
5262
 
            goto error;
5263
 
        }
5264
 
 
5265
 
        virCommandAddArg(cmd, devstr);
5266
 
        VIR_FREE(devstr);
5267
 
 
5268
 
        if (!qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
5269
 
            goto error;
5270
 
 
5271
 
        virCommandAddArg(cmd, "-device");
5272
 
        if (!(devstr = qemuBuildRedirdevDevStr(redirdev, qemuCaps)))
5273
 
            goto error;
5274
 
        virCommandAddArg(cmd, devstr);
5275
 
        VIR_FREE(devstr);
5276
 
    }
5277
 
 
5278
 
 
5279
 
    /* Add host passthrough hardware */
5280
 
    for (i = 0 ; i < def->nhostdevs ; i++) {
5281
 
        virDomainHostdevDefPtr hostdev = def->hostdevs[i];
5282
 
        char *devstr;
5283
 
 
5284
 
        if (hostdev->bootIndex) {
5285
 
            if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
5286
 
                hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
5287
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
5288
 
                                _("booting from assigned devices is only"
5289
 
                                  " supported for PCI devices"));
5290
 
                goto error;
5291
 
            } else if (!qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_BOOTINDEX)) {
5292
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
5293
 
                                _("booting from assigned PCI devices is not"
5294
 
                                  " supported with this version of qemu"));
5295
 
                goto error;
5296
 
            }
5297
 
        }
5298
 
 
5299
 
        /* USB */
5300
 
        if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
5301
 
            hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
5302
 
 
5303
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
5304
 
                virCommandAddArg(cmd, "-device");
5305
 
                if (!(devstr = qemuBuildUSBHostdevDevStr(hostdev, qemuCaps)))
5306
 
                    goto error;
5307
 
                virCommandAddArg(cmd, devstr);
5308
 
                VIR_FREE(devstr);
5309
 
            } else {
5310
 
                virCommandAddArg(cmd, "-usbdevice");
5311
 
                if (!(devstr = qemuBuildUSBHostdevUsbDevStr(hostdev)))
5312
 
                    goto error;
5313
 
                virCommandAddArg(cmd, devstr);
5314
 
                VIR_FREE(devstr);
5315
 
            }
5316
 
        }
5317
 
 
5318
 
        /* PCI */
5319
 
        if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
5320
 
            hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
5321
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
5322
 
                char *configfd_name = NULL;
5323
 
                if (qemuCapsGet(qemuCaps, QEMU_CAPS_PCI_CONFIGFD)) {
5324
 
                    int configfd = qemuOpenPCIConfig(hostdev);
5325
 
 
5326
 
                    if (configfd >= 0) {
5327
 
                        if (virAsprintf(&configfd_name, "%d", configfd) < 0) {
5328
 
                            VIR_FORCE_CLOSE(configfd);
5329
 
                            goto no_memory;
5330
 
                        }
5331
 
 
5332
 
                        virCommandTransferFD(cmd, configfd);
5333
 
                    }
5334
 
                }
5335
 
                virCommandAddArg(cmd, "-device");
5336
 
                devstr = qemuBuildPCIHostdevDevStr(hostdev, configfd_name, qemuCaps);
5337
 
                VIR_FREE(configfd_name);
5338
 
                if (!devstr)
5339
 
                    goto error;
5340
 
                virCommandAddArg(cmd, devstr);
5341
 
                VIR_FREE(devstr);
5342
 
            } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_PCIDEVICE)) {
5343
 
                virCommandAddArg(cmd, "-pcidevice");
5344
 
                if (!(devstr = qemuBuildPCIHostdevPCIDevStr(hostdev)))
5345
 
                    goto error;
5346
 
                virCommandAddArg(cmd, devstr);
5347
 
                VIR_FREE(devstr);
5348
 
            } else {
5349
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
5350
 
                                _("PCI device assignment is not supported by this version of qemu"));
5351
 
                goto error;
5352
 
            }
5353
 
        }
5354
 
    }
5355
 
 
5356
 
    /* Migration is very annoying due to wildly varying syntax &
5357
 
     * capabilities over time of KVM / QEMU codebases.
5358
 
     */
5359
 
    if (migrateFrom) {
5360
 
        virCommandAddArg(cmd, "-incoming");
5361
 
        if (STRPREFIX(migrateFrom, "tcp")) {
5362
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_QEMU_TCP)) {
5363
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5364
 
                                "%s", _("TCP migration is not supported with "
5365
 
                                        "this QEMU binary"));
5366
 
                goto error;
5367
 
            }
5368
 
            virCommandAddArg(cmd, migrateFrom);
5369
 
        } else if (STREQ(migrateFrom, "stdio")) {
5370
 
            if (qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD)) {
5371
 
                virCommandAddArgFormat(cmd, "fd:%d", migrateFd);
5372
 
                virCommandPreserveFD(cmd, migrateFd);
5373
 
            } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_QEMU_EXEC)) {
5374
 
                virCommandAddArg(cmd, "exec:cat");
5375
 
                virCommandSetInputFD(cmd, migrateFd);
5376
 
            } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_KVM_STDIO)) {
5377
 
                virCommandAddArg(cmd, migrateFrom);
5378
 
                virCommandSetInputFD(cmd, migrateFd);
5379
 
            } else {
5380
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5381
 
                                "%s", _("STDIO migration is not supported "
5382
 
                                        "with this QEMU binary"));
5383
 
                goto error;
5384
 
            }
5385
 
        } else if (STRPREFIX(migrateFrom, "exec")) {
5386
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_QEMU_EXEC)) {
5387
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5388
 
                                "%s", _("EXEC migration is not supported "
5389
 
                                        "with this QEMU binary"));
5390
 
                goto error;
5391
 
            }
5392
 
            virCommandAddArg(cmd, migrateFrom);
5393
 
        } else if (STRPREFIX(migrateFrom, "fd")) {
5394
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD)) {
5395
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5396
 
                                "%s", _("FD migration is not supported "
5397
 
                                        "with this QEMU binary"));
5398
 
                goto error;
5399
 
            }
5400
 
            virCommandAddArg(cmd, migrateFrom);
5401
 
            virCommandPreserveFD(cmd, migrateFd);
5402
 
        } else if (STRPREFIX(migrateFrom, "unix")) {
5403
 
            if (!qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_QEMU_UNIX)) {
5404
 
                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5405
 
                                "%s", _("UNIX migration is not supported "
5406
 
                                        "with this QEMU binary"));
5407
 
                goto error;
5408
 
            }
5409
 
            virCommandAddArg(cmd, migrateFrom);
5410
 
        } else {
5411
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
5412
 
                            "%s", _("unknown migration protocol"));
5413
 
            goto error;
5414
 
        }
5415
 
    }
5416
 
 
5417
 
    /* QEMU changed its default behavior to not include the virtio balloon
5418
 
     * device.  Explicitly request it to ensure it will be present.
5419
 
     *
5420
 
     * NB: Earlier we declared that VirtIO balloon will always be in
5421
 
     * slot 0x3 on bus 0x0
5422
 
     */
5423
 
    if ((def->memballoon) &&
5424
 
        (def->memballoon->model != VIR_DOMAIN_MEMBALLOON_MODEL_NONE)) {
5425
 
        if (def->memballoon->model != VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO) {
5426
 
            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
5427
 
                            _("Memory balloon device type '%s' is not supported by this version of qemu"),
5428
 
                            virDomainMemballoonModelTypeToString(def->memballoon->model));
5429
 
            goto error;
5430
 
        }
5431
 
        if (qemuCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) {
5432
 
            char *optstr;
5433
 
            virCommandAddArg(cmd, "-device");
5434
 
 
5435
 
            optstr = qemuBuildMemballoonDevStr(def->memballoon, qemuCaps);
5436
 
            if (!optstr)
5437
 
                goto error;
5438
 
            virCommandAddArg(cmd, optstr);
5439
 
            VIR_FREE(optstr);
5440
 
        } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_BALLOON)) {
5441
 
            virCommandAddArgList(cmd, "-balloon", "virtio", NULL);
5442
 
        }
5443
 
    }
5444
 
 
5445
 
    if (snapshot)
5446
 
        virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL);
5447
 
 
5448
 
    if (def->namespaceData) {
5449
 
        qemuDomainCmdlineDefPtr qemucmd;
5450
 
 
5451
 
        qemucmd = def->namespaceData;
5452
 
        for (i = 0; i < qemucmd->num_args; i++)
5453
 
            virCommandAddArg(cmd, qemucmd->args[i]);
5454
 
        for (i = 0; i < qemucmd->num_env; i++)
5455
 
            virCommandAddEnvPair(cmd, qemucmd->env_name[i],
5456
 
                                 qemucmd->env_value[i]
5457
 
                                 ? qemucmd->env_value[i] : "");
5458
 
    }
5459
 
 
5460
 
    return cmd;
5461
 
 
5462
 
 no_memory:
5463
 
    virReportOOMError();
5464
 
 error:
5465
 
    /* free up any resources in the network driver */
5466
 
    for (i = 0; i <= last_good_net; i++)
5467
 
        virDomainConfNWFilterTeardown(def->nets[i]);
5468
 
    virCommandFree(cmd);
5469
 
    return NULL;
5470
 
}
5471
 
 
5472
 
 
5473
 
/*
5474
 
 * This method takes a string representing a QEMU command line ARGV set
5475
 
 * optionally prefixed by a list of environment variables. It then tries
5476
 
 * to split it up into a NULL terminated list of env & argv, splitting
5477
 
 * on space
5478
 
 */
5479
 
static int qemuStringToArgvEnv(const char *args,
5480
 
                               const char ***retenv,
5481
 
                               const char ***retargv)
5482
 
{
5483
 
    char **arglist = NULL;
5484
 
    int argcount = 0;
5485
 
    int argalloc = 0;
5486
 
    int envend;
5487
 
    int i;
5488
 
    const char *curr = args;
5489
 
    const char *start;
5490
 
    const char **progenv = NULL;
5491
 
    const char **progargv = NULL;
5492
 
 
5493
 
    /* Iterate over string, splitting on sequences of ' ' */
5494
 
    while (curr && *curr != '\0') {
5495
 
        char *arg;
5496
 
        const char *next;
5497
 
 
5498
 
        start = curr;
5499
 
        /* accept a space in CEPH_ARGS */
5500
 
        if (STRPREFIX(curr, "CEPH_ARGS=-m ")) {
5501
 
            start += strlen("CEPH_ARGS=-m ");
5502
 
        }
5503
 
        if (*start == '\'') {
5504
 
            if (start == curr)
5505
 
                curr++;
5506
 
            next = strchr(start + 1, '\'');
5507
 
        } else if (*start == '"') {
5508
 
            if (start == curr)
5509
 
                curr++;
5510
 
            next = strchr(start + 1, '"');
5511
 
        } else {
5512
 
            next = strchr(start, ' ');
5513
 
        }
5514
 
        if (!next)
5515
 
            next = strchr(curr, '\n');
5516
 
 
5517
 
        if (next) {
5518
 
            arg = strndup(curr, next-curr);
5519
 
            if (*next == '\'' ||
5520
 
                *next == '"')
5521
 
                next++;
5522
 
        } else {
5523
 
            arg = strdup(curr);
5524
 
        }
5525
 
 
5526
 
        if (!arg)
5527
 
            goto no_memory;
5528
 
 
5529
 
        if (argalloc == argcount) {
5530
 
            if (VIR_REALLOC_N(arglist, argalloc+10) < 0) {
5531
 
                VIR_FREE(arg);
5532
 
                goto no_memory;
5533
 
            }
5534
 
            argalloc+=10;
5535
 
        }
5536
 
 
5537
 
        arglist[argcount++] = arg;
5538
 
 
5539
 
        while (next && c_isspace(*next))
5540
 
            next++;
5541
 
 
5542
 
        curr = next;
5543
 
    }
5544
 
 
5545
 
    /* Iterate over list of args, finding first arg not containing
5546
 
     * the '=' character (eg, skip over env vars FOO=bar) */
5547
 
    for (envend = 0 ; ((envend < argcount) &&
5548
 
                       (strchr(arglist[envend], '=') != NULL));
5549
 
         envend++)
5550
 
        ; /* nada */
5551
 
 
5552
 
    /* Copy the list of env vars */
5553
 
    if (envend > 0) {
5554
 
        if (VIR_REALLOC_N(progenv, envend+1) < 0)
5555
 
            goto no_memory;
5556
 
        for (i = 0 ; i < envend ; i++) {
5557
 
            progenv[i] = arglist[i];
5558
 
            arglist[i] = NULL;
5559
 
        }
5560
 
        progenv[i] = NULL;
5561
 
    }
5562
 
 
5563
 
    /* Copy the list of argv */
5564
 
    if (VIR_REALLOC_N(progargv, argcount-envend + 1) < 0)
5565
 
        goto no_memory;
5566
 
    for (i = envend ; i < argcount ; i++)
5567
 
        progargv[i-envend] = arglist[i];
5568
 
    progargv[i-envend] = NULL;
5569
 
 
5570
 
    VIR_FREE(arglist);
5571
 
 
5572
 
    *retenv = progenv;
5573
 
    *retargv = progargv;
5574
 
 
5575
 
    return 0;
5576
 
 
5577
 
no_memory:
5578
 
    for (i = 0 ; progenv && progenv[i] ; i++)
5579
 
        VIR_FREE(progenv[i]);
5580
 
    VIR_FREE(progenv);
5581
 
    for (i = 0 ; i < argcount ; i++)
5582
 
        VIR_FREE(arglist[i]);
5583
 
    VIR_FREE(arglist);
5584
 
    virReportOOMError();
5585
 
    return -1;
5586
 
}
5587
 
 
5588
 
 
5589
 
/*
5590
 
 * Search for a named env variable, and return the value part
5591
 
 */
5592
 
static const char *qemuFindEnv(const char **progenv,
5593
 
                               const char *name)
5594
 
{
5595
 
    int i;
5596
 
    int len = strlen(name);
5597
 
 
5598
 
    for (i = 0 ; progenv && progenv[i] ; i++) {
5599
 
        if (STREQLEN(progenv[i], name, len) &&
5600
 
            progenv[i][len] == '=')
5601
 
            return progenv[i] + len + 1;
5602
 
    }
5603
 
    return NULL;
5604
 
}
5605
 
 
5606
 
/*
5607
 
 * Takes a string containing a set of key=value,key=value,key...
5608
 
 * parameters and splits them up, returning two arrays with
5609
 
 * the individual keys and values. If allowEmptyValue is nonzero,
5610
 
 * the "=value" part is optional and if a key with no value is found,
5611
 
 * NULL is be placed into corresponding place in retvalues.
5612
 
 */
5613
 
int
5614
 
qemuParseKeywords(const char *str,
5615
 
                  char ***retkeywords,
5616
 
                  char ***retvalues,
5617
 
                  int allowEmptyValue)
5618
 
{
5619
 
    int keywordCount = 0;
5620
 
    int keywordAlloc = 0;
5621
 
    char **keywords = NULL;
5622
 
    char **values = NULL;
5623
 
    const char *start = str;
5624
 
    const char *end;
5625
 
    int i;
5626
 
 
5627
 
    *retkeywords = NULL;
5628
 
    *retvalues = NULL;
5629
 
    end = start + strlen(str);
5630
 
 
5631
 
    while (start) {
5632
 
        const char *separator;
5633
 
        const char *endmark;
5634
 
        char *keyword;
5635
 
        char *value = NULL;
5636
 
 
5637
 
        if (!(endmark = strchr(start, ',')))
5638
 
            endmark = end;
5639
 
        if (!(separator = strchr(start, '=')))
5640
 
            separator = end;
5641
 
 
5642
 
        if (separator >= endmark) {
5643
 
            if (!allowEmptyValue) {
5644
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
5645
 
                                _("malformed keyword arguments in '%s'"), str);
5646
 
                goto error;
5647
 
            }
5648
 
            separator = endmark;
5649
 
        }
5650
 
 
5651
 
        if (!(keyword = strndup(start, separator - start)))
5652
 
            goto no_memory;
5653
 
 
5654
 
        if (separator < endmark) {
5655
 
            separator++;
5656
 
            if (!(value = strndup(separator, endmark - separator))) {
5657
 
                VIR_FREE(keyword);
5658
 
                goto no_memory;
5659
 
            }
5660
 
        }
5661
 
 
5662
 
        if (keywordAlloc == keywordCount) {
5663
 
            if (VIR_REALLOC_N(keywords, keywordAlloc + 10) < 0 ||
5664
 
                VIR_REALLOC_N(values, keywordAlloc + 10) < 0) {
5665
 
                VIR_FREE(keyword);
5666
 
                VIR_FREE(value);
5667
 
                goto no_memory;
5668
 
            }
5669
 
            keywordAlloc += 10;
5670
 
        }
5671
 
 
5672
 
        keywords[keywordCount] = keyword;
5673
 
        values[keywordCount] = value;
5674
 
        keywordCount++;
5675
 
 
5676
 
        start = endmark < end ? endmark + 1 : NULL;
5677
 
    }
5678
 
 
5679
 
    *retkeywords = keywords;
5680
 
    *retvalues = values;
5681
 
 
5682
 
    return keywordCount;
5683
 
 
5684
 
no_memory:
5685
 
    virReportOOMError();
5686
 
error:
5687
 
    for (i = 0 ; i < keywordCount ; i++) {
5688
 
        VIR_FREE(keywords[i]);
5689
 
        VIR_FREE(values[i]);
5690
 
    }
5691
 
    VIR_FREE(keywords);
5692
 
    VIR_FREE(values);
5693
 
    return -1;
5694
 
}
5695
 
 
5696
 
/*
5697
 
 * Tries to parse new style QEMU -drive  args.
5698
 
 *
5699
 
 * eg -drive file=/dev/HostVG/VirtData1,if=ide,index=1
5700
 
 *
5701
 
 * Will fail if not using the 'index' keyword
5702
 
 */
5703
 
static virDomainDiskDefPtr
5704
 
qemuParseCommandLineDisk(virCapsPtr caps,
5705
 
                         const char *val,
5706
 
                         int nvirtiodisk,
5707
 
                         bool old_style_ceph_args)
5708
 
{
5709
 
    virDomainDiskDefPtr def = NULL;
5710
 
    char **keywords;
5711
 
    char **values;
5712
 
    int nkeywords;
5713
 
    int i;
5714
 
    int idx = -1;
5715
 
    int busid = -1;
5716
 
    int unitid = -1;
5717
 
 
5718
 
    if ((nkeywords = qemuParseKeywords(val,
5719
 
                                       &keywords,
5720
 
                                       &values, 0)) < 0)
5721
 
        return NULL;
5722
 
 
5723
 
    if (VIR_ALLOC(def) < 0) {
5724
 
        virReportOOMError();
5725
 
        goto cleanup;
5726
 
    }
5727
 
 
5728
 
    def->bus = VIR_DOMAIN_DISK_BUS_IDE;
5729
 
    def->device = VIR_DOMAIN_DISK_DEVICE_DISK;
5730
 
    def->type = VIR_DOMAIN_DISK_TYPE_FILE;
5731
 
 
5732
 
    for (i = 0 ; i < nkeywords ; i++) {
5733
 
        if (STREQ(keywords[i], "file")) {
5734
 
            if (values[i] && STRNEQ(values[i], "")) {
5735
 
                def->src = values[i];
5736
 
                values[i] = NULL;
5737
 
                if (STRPREFIX(def->src, "/dev/"))
5738
 
                    def->type = VIR_DOMAIN_DISK_TYPE_BLOCK;
5739
 
                else if (STRPREFIX(def->src, "nbd:")) {
5740
 
                    char *host, *port;
5741
 
 
5742
 
                    def->type = VIR_DOMAIN_DISK_TYPE_NETWORK;
5743
 
                    def->protocol = VIR_DOMAIN_DISK_PROTOCOL_NBD;
5744
 
                    host = def->src + strlen("nbd:");
5745
 
                    port = strchr(host, ':');
5746
 
                    if (!port) {
5747
 
                        qemuReportError(VIR_ERR_INTERNAL_ERROR,
5748
 
                                        _("cannot parse nbd filename '%s'"),
5749
 
                                        def->src);
5750
 
                        def = NULL;
5751
 
                        goto cleanup;
5752
 
                    }
5753
 
                    *port++ = '\0';
5754
 
                    if (VIR_ALLOC(def->hosts) < 0) {
5755
 
                        virReportOOMError();
5756
 
                        goto cleanup;
5757
 
                    }
5758
 
                    def->nhosts = 1;
5759
 
                    def->hosts->name = strdup(host);
5760
 
                    if (!def->hosts->name) {
5761
 
                        virReportOOMError();
5762
 
                        goto cleanup;
5763
 
                    }
5764
 
                    def->hosts->port = strdup(port);
5765
 
                    if (!def->hosts->port) {
5766
 
                        virReportOOMError();
5767
 
                        goto cleanup;
5768
 
                    }
5769
 
 
5770
 
                    VIR_FREE(def->src);
5771
 
                    def->src = NULL;
5772
 
                } else if (STRPREFIX(def->src, "rbd:")) {
5773
 
                    char *p = def->src;
5774
 
 
5775
 
                    def->type = VIR_DOMAIN_DISK_TYPE_NETWORK;
5776
 
                    def->protocol = VIR_DOMAIN_DISK_PROTOCOL_RBD;
5777
 
                    def->src = strdup(p + strlen("rbd:"));
5778
 
                    if (!def->src) {
5779
 
                        virReportOOMError();
5780
 
                        goto cleanup;
5781
 
                    }
5782
 
                    /* old-style CEPH_ARGS env variable is parsed later */
5783
 
                    if (!old_style_ceph_args && qemuParseRBDString(def) < 0)
5784
 
                        goto cleanup;
5785
 
 
5786
 
                    VIR_FREE(p);
5787
 
                } else if (STRPREFIX(def->src, "sheepdog:")) {
5788
 
                    char *p = def->src;
5789
 
                    char *port, *vdi;
5790
 
 
5791
 
                    def->type = VIR_DOMAIN_DISK_TYPE_NETWORK;
5792
 
                    def->protocol = VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG;
5793
 
                    def->src = strdup(p + strlen("sheepdog:"));
5794
 
                    if (!def->src) {
5795
 
                        virReportOOMError();
5796
 
                        goto cleanup;
5797
 
                    }
5798
 
 
5799
 
                    /* def->src must be [vdiname] or [host]:[port]:[vdiname] */
5800
 
                    port = strchr(def->src, ':');
5801
 
                    if (port) {
5802
 
                        *port++ = '\0';
5803
 
                        vdi = strchr(port, ':');
5804
 
                        if (!vdi) {
5805
 
                            def = NULL;
5806
 
                            qemuReportError(VIR_ERR_INTERNAL_ERROR,
5807
 
                                            _("cannot parse sheepdog filename '%s'"), p);
5808
 
                            goto cleanup;
5809
 
                        }
5810
 
                        *vdi++ = '\0';
5811
 
                        if (VIR_ALLOC(def->hosts) < 0) {
5812
 
                            virReportOOMError();
5813
 
                            goto cleanup;
5814
 
                        }
5815
 
                        def->nhosts = 1;
5816
 
                        def->hosts->name = def->src;
5817
 
                        def->hosts->port = strdup(port);
5818
 
                        if (!def->hosts->port) {
5819
 
                            virReportOOMError();
5820
 
                            goto cleanup;
5821
 
                        }
5822
 
                        def->src = strdup(vdi);
5823
 
                        if (!def->src) {
5824
 
                            virReportOOMError();
5825
 
                            goto cleanup;
5826
 
                        }
5827
 
                    }
5828
 
 
5829
 
                    VIR_FREE(p);
5830
 
                } else
5831
 
                    def->type = VIR_DOMAIN_DISK_TYPE_FILE;
5832
 
            } else {
5833
 
                def->type = VIR_DOMAIN_DISK_TYPE_FILE;
5834
 
            }
5835
 
        } else if (STREQ(keywords[i], "if")) {
5836
 
            if (STREQ(values[i], "ide"))
5837
 
                def->bus = VIR_DOMAIN_DISK_BUS_IDE;
5838
 
            else if (STREQ(values[i], "scsi"))
5839
 
                def->bus = VIR_DOMAIN_DISK_BUS_SCSI;
5840
 
            else if (STREQ(values[i], "virtio"))
5841
 
                def->bus = VIR_DOMAIN_DISK_BUS_VIRTIO;
5842
 
            else if (STREQ(values[i], "xen"))
5843
 
                def->bus = VIR_DOMAIN_DISK_BUS_XEN;
5844
 
        } else if (STREQ(keywords[i], "media")) {
5845
 
            if (STREQ(values[i], "cdrom")) {
5846
 
                def->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
5847
 
                def->readonly = 1;
5848
 
            } else if (STREQ(values[i], "floppy"))
5849
 
                def->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
5850
 
        } else if (STREQ(keywords[i], "format")) {
5851
 
            def->driverName = strdup("qemu");
5852
 
            if (!def->driverName) {
5853
 
                virDomainDiskDefFree(def);
5854
 
                def = NULL;
5855
 
                virReportOOMError();
5856
 
                goto cleanup;
5857
 
            }
5858
 
            def->driverType = values[i];
5859
 
            values[i] = NULL;
5860
 
        } else if (STREQ(keywords[i], "cache")) {
5861
 
            if (STREQ(values[i], "off") ||
5862
 
                STREQ(values[i], "none"))
5863
 
                def->cachemode = VIR_DOMAIN_DISK_CACHE_DISABLE;
5864
 
            else if (STREQ(values[i], "writeback") ||
5865
 
                     STREQ(values[i], "on"))
5866
 
                def->cachemode = VIR_DOMAIN_DISK_CACHE_WRITEBACK;
5867
 
            else if (STREQ(values[i], "writethrough"))
5868
 
                def->cachemode = VIR_DOMAIN_DISK_CACHE_WRITETHRU;
5869
 
            else if (STREQ(values[i], "directsync"))
5870
 
                def->cachemode = VIR_DOMAIN_DISK_CACHE_DIRECTSYNC;
5871
 
            else if (STREQ(values[i], "unsafe"))
5872
 
                def->cachemode = VIR_DOMAIN_DISK_CACHE_UNSAFE;
5873
 
        } else if (STREQ(keywords[i], "werror")) {
5874
 
            if (STREQ(values[i], "stop"))
5875
 
                def->error_policy = VIR_DOMAIN_DISK_ERROR_POLICY_STOP;
5876
 
            else if (STREQ(values[i], "report"))
5877
 
                def->error_policy = VIR_DOMAIN_DISK_ERROR_POLICY_REPORT;
5878
 
            else if (STREQ(values[i], "ignore"))
5879
 
                def->error_policy = VIR_DOMAIN_DISK_ERROR_POLICY_IGNORE;
5880
 
            else if (STREQ(values[i], "enospc"))
5881
 
                def->error_policy = VIR_DOMAIN_DISK_ERROR_POLICY_ENOSPACE;
5882
 
        } else if (STREQ(keywords[i], "rerror")) {
5883
 
            if (STREQ(values[i], "stop"))
5884
 
                def->rerror_policy = VIR_DOMAIN_DISK_ERROR_POLICY_STOP;
5885
 
            else if (STREQ(values[i], "report"))
5886
 
                def->rerror_policy = VIR_DOMAIN_DISK_ERROR_POLICY_REPORT;
5887
 
            else if (STREQ(values[i], "ignore"))
5888
 
                def->rerror_policy = VIR_DOMAIN_DISK_ERROR_POLICY_IGNORE;
5889
 
        } else if (STREQ(keywords[i], "index")) {
5890
 
            if (virStrToLong_i(values[i], NULL, 10, &idx) < 0) {
5891
 
                virDomainDiskDefFree(def);
5892
 
                def = NULL;
5893
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
5894
 
                                _("cannot parse drive index '%s'"), val);
5895
 
                goto cleanup;
5896
 
            }
5897
 
        } else if (STREQ(keywords[i], "bus")) {
5898
 
            if (virStrToLong_i(values[i], NULL, 10, &busid) < 0) {
5899
 
                virDomainDiskDefFree(def);
5900
 
                def = NULL;
5901
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
5902
 
                                _("cannot parse drive bus '%s'"), val);
5903
 
                goto cleanup;
5904
 
            }
5905
 
        } else if (STREQ(keywords[i], "unit")) {
5906
 
            if (virStrToLong_i(values[i], NULL, 10, &unitid) < 0) {
5907
 
                virDomainDiskDefFree(def);
5908
 
                def = NULL;
5909
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
5910
 
                                _("cannot parse drive unit '%s'"), val);
5911
 
                goto cleanup;
5912
 
            }
5913
 
        } else if (STREQ(keywords[i], "readonly")) {
5914
 
            if ((values[i] == NULL) || STREQ(values[i], "on"))
5915
 
                def->readonly = 1;
5916
 
        } else if (STREQ(keywords[i], "aio")) {
5917
 
            if ((def->iomode = virDomainDiskIoTypeFromString(values[i])) < 0) {
5918
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
5919
 
                                _("cannot parse io mode '%s'"), values[i]);
5920
 
            }
5921
 
        }
5922
 
    }
5923
 
 
5924
 
    if (def->rerror_policy == def->error_policy)
5925
 
        def->rerror_policy = 0;
5926
 
 
5927
 
    if (!def->src &&
5928
 
        def->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
5929
 
        def->type != VIR_DOMAIN_DISK_TYPE_NETWORK) {
5930
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
5931
 
                        _("missing file parameter in drive '%s'"), val);
5932
 
        virDomainDiskDefFree(def);
5933
 
        def = NULL;
5934
 
        goto cleanup;
5935
 
    }
5936
 
    if (idx == -1 &&
5937
 
        def->bus == VIR_DOMAIN_DISK_BUS_VIRTIO)
5938
 
        idx = nvirtiodisk;
5939
 
 
5940
 
    if (idx == -1 &&
5941
 
        unitid == -1 &&
5942
 
        busid == -1) {
5943
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
5944
 
                        _("missing index/unit/bus parameter in drive '%s'"), val);
5945
 
        virDomainDiskDefFree(def);
5946
 
        def = NULL;
5947
 
        goto cleanup;
5948
 
    }
5949
 
 
5950
 
    if (idx == -1) {
5951
 
        if (unitid == -1)
5952
 
            unitid = 0;
5953
 
        if (busid == -1)
5954
 
            busid = 0;
5955
 
        switch (def->bus) {
5956
 
        case VIR_DOMAIN_DISK_BUS_IDE:
5957
 
            idx = (busid * 2) + unitid;
5958
 
            break;
5959
 
        case VIR_DOMAIN_DISK_BUS_SCSI:
5960
 
            idx = (busid * 7) + unitid;
5961
 
            break;
5962
 
        default:
5963
 
            idx = unitid;
5964
 
            break;
5965
 
        }
5966
 
    }
5967
 
 
5968
 
    if (def->bus == VIR_DOMAIN_DISK_BUS_IDE) {
5969
 
        def->dst = strdup("hda");
5970
 
    } else if (def->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
5971
 
        def->dst = strdup("sda");
5972
 
    } else if (def->bus == VIR_DOMAIN_DISK_BUS_VIRTIO) {
5973
 
        def->dst = strdup("vda");
5974
 
    } else if (def->bus == VIR_DOMAIN_DISK_BUS_XEN) {
5975
 
        def->dst = strdup("xvda");
5976
 
    } else {
5977
 
        def->dst = strdup("hda");
5978
 
    }
5979
 
 
5980
 
    if (!def->dst) {
5981
 
        virDomainDiskDefFree(def);
5982
 
        def = NULL;
5983
 
        virReportOOMError();
5984
 
        goto cleanup;
5985
 
    }
5986
 
    if (STREQ(def->dst, "xvda"))
5987
 
        def->dst[3] = 'a' + idx;
5988
 
    else
5989
 
        def->dst[2] = 'a' + idx;
5990
 
 
5991
 
    if (virDomainDiskDefAssignAddress(caps, def) < 0) {
5992
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
5993
 
                        _("invalid device name '%s'"), def->dst);
5994
 
        virDomainDiskDefFree(def);
5995
 
        def = NULL;
5996
 
        /* fall through to "cleanup" */
5997
 
    }
5998
 
 
5999
 
cleanup:
6000
 
    for (i = 0 ; i < nkeywords ; i++) {
6001
 
        VIR_FREE(keywords[i]);
6002
 
        VIR_FREE(values[i]);
6003
 
    }
6004
 
    VIR_FREE(keywords);
6005
 
    VIR_FREE(values);
6006
 
    return def;
6007
 
}
6008
 
 
6009
 
/*
6010
 
 * Tries to find a NIC definition matching a vlan we want
6011
 
 */
6012
 
static const char *
6013
 
qemuFindNICForVLAN(int nnics,
6014
 
                   const char **nics,
6015
 
                   int wantvlan)
6016
 
{
6017
 
    int i;
6018
 
    for (i = 0 ; i < nnics ; i++) {
6019
 
        int gotvlan;
6020
 
        const char *tmp = strstr(nics[i], "vlan=");
6021
 
        char *end;
6022
 
        if (!tmp)
6023
 
            continue;
6024
 
 
6025
 
        tmp += strlen("vlan=");
6026
 
 
6027
 
        if (virStrToLong_i(tmp, &end, 10, &gotvlan) < 0) {
6028
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
6029
 
                            _("cannot parse NIC vlan in '%s'"), nics[i]);
6030
 
            return NULL;
6031
 
        }
6032
 
 
6033
 
        if (gotvlan == wantvlan)
6034
 
            return nics[i];
6035
 
    }
6036
 
 
6037
 
    if (wantvlan == 0 && nnics > 0)
6038
 
        return nics[0];
6039
 
 
6040
 
    qemuReportError(VIR_ERR_INTERNAL_ERROR,
6041
 
                    _("cannot find NIC definition for vlan %d"), wantvlan);
6042
 
    return NULL;
6043
 
}
6044
 
 
6045
 
 
6046
 
/*
6047
 
 * Tries to parse a QEMU -net backend argument. Gets given
6048
 
 * a list of all known -net frontend arguments to try and
6049
 
 * match up against. Horribly complicated stuff
6050
 
 */
6051
 
static virDomainNetDefPtr
6052
 
qemuParseCommandLineNet(virCapsPtr caps,
6053
 
                        const char *val,
6054
 
                        int nnics,
6055
 
                        const char **nics)
6056
 
{
6057
 
    virDomainNetDefPtr def = NULL;
6058
 
    char **keywords = NULL;
6059
 
    char **values = NULL;
6060
 
    int nkeywords;
6061
 
    const char *nic;
6062
 
    int wantvlan = 0;
6063
 
    const char *tmp;
6064
 
    int genmac = 1;
6065
 
    int i;
6066
 
 
6067
 
    tmp = strchr(val, ',');
6068
 
 
6069
 
    if (tmp) {
6070
 
        if ((nkeywords = qemuParseKeywords(tmp+1,
6071
 
                                           &keywords,
6072
 
                                           &values, 0)) < 0)
6073
 
            return NULL;
6074
 
    } else {
6075
 
        nkeywords = 0;
6076
 
    }
6077
 
 
6078
 
    if (VIR_ALLOC(def) < 0) {
6079
 
        virReportOOMError();
6080
 
        goto cleanup;
6081
 
    }
6082
 
 
6083
 
    /* 'tap' could turn into libvirt type=ethernet, type=bridge or
6084
 
     * type=network, but we can't tell, so use the generic config */
6085
 
    if (STRPREFIX(val, "tap,"))
6086
 
        def->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
6087
 
    else if (STRPREFIX(val, "socket"))
6088
 
        def->type = VIR_DOMAIN_NET_TYPE_CLIENT;
6089
 
    else if (STRPREFIX(val, "user"))
6090
 
        def->type = VIR_DOMAIN_NET_TYPE_USER;
6091
 
    else
6092
 
        def->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
6093
 
 
6094
 
    for (i = 0 ; i < nkeywords ; i++) {
6095
 
        if (STREQ(keywords[i], "vlan")) {
6096
 
            if (virStrToLong_i(values[i], NULL, 10, &wantvlan) < 0) {
6097
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
6098
 
                                _("cannot parse vlan in '%s'"), val);
6099
 
                virDomainNetDefFree(def);
6100
 
                def = NULL;
6101
 
                goto cleanup;
6102
 
            }
6103
 
        } else if (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
6104
 
                   STREQ(keywords[i], "script") && STRNEQ(values[i], "")) {
6105
 
            def->data.ethernet.script = values[i];
6106
 
            values[i] = NULL;
6107
 
        } else if (def->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
6108
 
                   STREQ(keywords[i], "ifname")) {
6109
 
            def->ifname = values[i];
6110
 
            values[i] = NULL;
6111
 
        }
6112
 
    }
6113
 
 
6114
 
 
6115
 
    /* Done parsing the nic backend. Now to try and find corresponding
6116
 
     * frontend, based off vlan number. NB this assumes a 1-1 mapping
6117
 
     */
6118
 
 
6119
 
    nic = qemuFindNICForVLAN(nnics, nics, wantvlan);
6120
 
    if (!nic) {
6121
 
        virDomainNetDefFree(def);
6122
 
        def = NULL;
6123
 
        goto cleanup;
6124
 
    }
6125
 
 
6126
 
    if (!STRPREFIX(nic, "nic")) {
6127
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
6128
 
                        _("cannot parse NIC definition '%s'"), nic);
6129
 
        virDomainNetDefFree(def);
6130
 
        def = NULL;
6131
 
        goto cleanup;
6132
 
    }
6133
 
 
6134
 
    for (i = 0 ; i < nkeywords ; i++) {
6135
 
        VIR_FREE(keywords[i]);
6136
 
        VIR_FREE(values[i]);
6137
 
    }
6138
 
    VIR_FREE(keywords);
6139
 
    VIR_FREE(values);
6140
 
 
6141
 
    if (STRPREFIX(nic, "nic,")) {
6142
 
        if ((nkeywords = qemuParseKeywords(nic + strlen("nic,"),
6143
 
                                           &keywords,
6144
 
                                           &values, 0)) < 0) {
6145
 
            virDomainNetDefFree(def);
6146
 
            def = NULL;
6147
 
            goto cleanup;
6148
 
        }
6149
 
    } else {
6150
 
        nkeywords = 0;
6151
 
    }
6152
 
 
6153
 
    for (i = 0 ; i < nkeywords ; i++) {
6154
 
        if (STREQ(keywords[i], "macaddr")) {
6155
 
            genmac = 0;
6156
 
            if (virParseMacAddr(values[i], def->mac) < 0) {
6157
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
6158
 
                                _("unable to parse mac address '%s'"),
6159
 
                                values[i]);
6160
 
                virDomainNetDefFree(def);
6161
 
                def = NULL;
6162
 
                goto cleanup;
6163
 
            }
6164
 
        } else if (STREQ(keywords[i], "model")) {
6165
 
            def->model = values[i];
6166
 
            values[i] = NULL;
6167
 
        } else if (STREQ(keywords[i], "vhost")) {
6168
 
            if ((values[i] == NULL) || STREQ(values[i], "on")) {
6169
 
                def->driver.virtio.name = VIR_DOMAIN_NET_BACKEND_TYPE_VHOST;
6170
 
            } else if (STREQ(keywords[i], "off")) {
6171
 
                def->driver.virtio.name = VIR_DOMAIN_NET_BACKEND_TYPE_QEMU;
6172
 
            }
6173
 
        } else if (STREQ(keywords[i], "sndbuf") && values[i]) {
6174
 
            if (virStrToLong_ul(values[i], NULL, 10, &def->tune.sndbuf) < 0) {
6175
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR,
6176
 
                                _("cannot parse sndbuf size in '%s'"), val);
6177
 
                virDomainNetDefFree(def);
6178
 
                def = NULL;
6179
 
                goto cleanup;
6180
 
            }
6181
 
            def->tune.sndbuf_specified = true;
6182
 
        }
6183
 
    }
6184
 
 
6185
 
    if (genmac)
6186
 
        virCapabilitiesGenerateMac(caps, def->mac);
6187
 
 
6188
 
cleanup:
6189
 
    for (i = 0 ; i < nkeywords ; i++) {
6190
 
        VIR_FREE(keywords[i]);
6191
 
        VIR_FREE(values[i]);
6192
 
    }
6193
 
    VIR_FREE(keywords);
6194
 
    VIR_FREE(values);
6195
 
    return def;
6196
 
}
6197
 
 
6198
 
 
6199
 
/*
6200
 
 * Tries to parse a QEMU PCI device
6201
 
 */
6202
 
static virDomainHostdevDefPtr
6203
 
qemuParseCommandLinePCI(const char *val)
6204
 
{
6205
 
    virDomainHostdevDefPtr def = NULL;
6206
 
    int bus = 0, slot = 0, func = 0;
6207
 
    const char *start;
6208
 
    char *end;
6209
 
 
6210
 
    if (!STRPREFIX(val, "host=")) {
6211
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
6212
 
                        _("unknown PCI device syntax '%s'"), val);
6213
 
        VIR_FREE(def);
6214
 
        goto cleanup;
6215
 
    }
6216
 
 
6217
 
    start = val + strlen("host=");
6218
 
    if (virStrToLong_i(start, &end, 16, &bus) < 0 || *end != ':') {
6219
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
6220
 
                        _("cannot extract PCI device bus '%s'"), val);
6221
 
        VIR_FREE(def);
6222
 
        goto cleanup;
6223
 
    }
6224
 
    start = end + 1;
6225
 
    if (virStrToLong_i(start, &end, 16, &slot) < 0 || *end != '.') {
6226
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
6227
 
                        _("cannot extract PCI device slot '%s'"), val);
6228
 
        VIR_FREE(def);
6229
 
        goto cleanup;
6230
 
    }
6231
 
    start = end + 1;
6232
 
    if (virStrToLong_i(start, NULL, 16, &func) < 0) {
6233
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
6234
 
                        _("cannot extract PCI device function '%s'"), val);
6235
 
        VIR_FREE(def);
6236
 
        goto cleanup;
6237
 
    }
6238
 
 
6239
 
    if (VIR_ALLOC(def) < 0) {
6240
 
        virReportOOMError();
6241
 
        goto cleanup;
6242
 
    }
6243
 
 
6244
 
    def->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
6245
 
    def->managed = 1;
6246
 
    def->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI;
6247
 
    def->source.subsys.u.pci.bus = bus;
6248
 
    def->source.subsys.u.pci.slot = slot;
6249
 
    def->source.subsys.u.pci.function = func;
6250
 
 
6251
 
cleanup:
6252
 
    return def;
6253
 
}
6254
 
 
6255
 
 
6256
 
/*
6257
 
 * Tries to parse a QEMU USB device
6258
 
 */
6259
 
static virDomainHostdevDefPtr
6260
 
qemuParseCommandLineUSB(const char *val)
6261
 
{
6262
 
    virDomainHostdevDefPtr def = NULL;
6263
 
    int first = 0, second = 0;
6264
 
    const char *start;
6265
 
    char *end;
6266
 
 
6267
 
    if (!STRPREFIX(val, "host:")) {
6268
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
6269
 
                        _("unknown USB device syntax '%s'"), val);
6270
 
        VIR_FREE(def);
6271
 
        goto cleanup;
6272
 
    }
6273
 
 
6274
 
    start = val + strlen("host:");
6275
 
    if (strchr(start, ':')) {
6276
 
        if (virStrToLong_i(start, &end, 16, &first) < 0 || *end != ':') {
6277
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
6278
 
                            _("cannot extract USB device vendor '%s'"), val);
6279
 
            VIR_FREE(def);
6280
 
            goto cleanup;
6281
 
        }
6282
 
        start = end + 1;
6283
 
        if (virStrToLong_i(start, NULL, 16, &second) < 0) {
6284
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
6285
 
                            _("cannot extract USB device product '%s'"), val);
6286
 
            VIR_FREE(def);
6287
 
            goto cleanup;
6288
 
        }
6289
 
    } else {
6290
 
        if (virStrToLong_i(start, &end, 10, &first) < 0 || *end != '.') {
6291
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
6292
 
                             _("cannot extract USB device bus '%s'"), val);
6293
 
            VIR_FREE(def);
6294
 
            goto cleanup;
6295
 
        }
6296
 
        start = end + 1;
6297
 
        if (virStrToLong_i(start, NULL, 10, &second) < 0) {
6298
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
6299
 
                            _("cannot extract USB device address '%s'"), val);
6300
 
            VIR_FREE(def);
6301
 
            goto cleanup;
6302
 
        }
6303
 
    }
6304
 
 
6305
 
    if (VIR_ALLOC(def) < 0) {
6306
 
        virReportOOMError();
6307
 
        goto cleanup;
6308
 
    }
6309
 
 
6310
 
    def->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
6311
 
    def->managed = 0;
6312
 
    def->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB;
6313
 
    if (*end == '.') {
6314
 
        def->source.subsys.u.usb.bus = first;
6315
 
        def->source.subsys.u.usb.device = second;
6316
 
    } else {
6317
 
        def->source.subsys.u.usb.vendor = first;
6318
 
        def->source.subsys.u.usb.product = second;
6319
 
    }
6320
 
 
6321
 
cleanup:
6322
 
    return def;
6323
 
}
6324
 
 
6325
 
 
6326
 
/*
6327
 
 * Tries to parse a QEMU serial/parallel device
6328
 
 */
6329
 
static int
6330
 
qemuParseCommandLineChr(virDomainChrSourceDefPtr source,
6331
 
                        const char *val)
6332
 
{
6333
 
    if (STREQ(val, "null")) {
6334
 
        source->type = VIR_DOMAIN_CHR_TYPE_NULL;
6335
 
    } else if (STREQ(val, "vc")) {
6336
 
        source->type = VIR_DOMAIN_CHR_TYPE_VC;
6337
 
    } else if (STREQ(val, "pty")) {
6338
 
        source->type = VIR_DOMAIN_CHR_TYPE_PTY;
6339
 
    } else if (STRPREFIX(val, "file:")) {
6340
 
        source->type = VIR_DOMAIN_CHR_TYPE_FILE;
6341
 
        source->data.file.path = strdup(val+strlen("file:"));
6342
 
        if (!source->data.file.path)
6343
 
            goto no_memory;
6344
 
    } else if (STRPREFIX(val, "pipe:")) {
6345
 
        source->type = VIR_DOMAIN_CHR_TYPE_PIPE;
6346
 
        source->data.file.path = strdup(val+strlen("pipe:"));
6347
 
        if (!source->data.file.path)
6348
 
            goto no_memory;
6349
 
    } else if (STREQ(val, "stdio")) {
6350
 
        source->type = VIR_DOMAIN_CHR_TYPE_STDIO;
6351
 
    } else if (STRPREFIX(val, "udp:")) {
6352
 
        const char *svc1, *host2, *svc2;
6353
 
        source->type = VIR_DOMAIN_CHR_TYPE_UDP;
6354
 
        val += strlen("udp:");
6355
 
        svc1 = strchr(val, ':');
6356
 
        host2 = svc1 ? strchr(svc1, '@') : NULL;
6357
 
        svc2 = host2 ? strchr(host2, ':') : NULL;
6358
 
 
6359
 
        if (svc1 && (svc1 != val)) {
6360
 
            source->data.udp.connectHost = strndup(val, svc1-val);
6361
 
 
6362
 
            if (!source->data.udp.connectHost)
6363
 
                goto no_memory;
6364
 
        }
6365
 
 
6366
 
        if (svc1) {
6367
 
            svc1++;
6368
 
            if (host2)
6369
 
                source->data.udp.connectService = strndup(svc1, host2-svc1);
6370
 
            else
6371
 
                source->data.udp.connectService = strdup(svc1);
6372
 
 
6373
 
            if (!source->data.udp.connectService)
6374
 
                goto no_memory;
6375
 
        }
6376
 
 
6377
 
        if (host2) {
6378
 
            host2++;
6379
 
            if (svc2 && (svc2 != host2)) {
6380
 
                source->data.udp.bindHost = strndup(host2, svc2-host2);
6381
 
 
6382
 
                if (!source->data.udp.bindHost)
6383
 
                    goto no_memory;
6384
 
            }
6385
 
        }
6386
 
 
6387
 
        if (svc2) {
6388
 
            svc2++;
6389
 
            if (STRNEQ(svc2, "0")) {
6390
 
                source->data.udp.bindService = strdup(svc2);
6391
 
                if (!source->data.udp.bindService)
6392
 
                    goto no_memory;
6393
 
            }
6394
 
        }
6395
 
    } else if (STRPREFIX(val, "tcp:") ||
6396
 
               STRPREFIX(val, "telnet:")) {
6397
 
        const char *opt, *svc;
6398
 
        source->type = VIR_DOMAIN_CHR_TYPE_TCP;
6399
 
        if (STRPREFIX(val, "tcp:")) {
6400
 
            val += strlen("tcp:");
6401
 
        } else {
6402
 
            val += strlen("telnet:");
6403
 
            source->data.tcp.protocol = VIR_DOMAIN_CHR_TCP_PROTOCOL_TELNET;
6404
 
        }
6405
 
        svc = strchr(val, ':');
6406
 
        if (!svc) {
6407
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
6408
 
                            _("cannot find port number in character device %s"), val);
6409
 
            goto error;
6410
 
        }
6411
 
        opt = strchr(svc, ',');
6412
 
        if (opt && strstr(opt, "server"))
6413
 
            source->data.tcp.listen = true;
6414
 
 
6415
 
        source->data.tcp.host = strndup(val, svc-val);
6416
 
        if (!source->data.tcp.host)
6417
 
            goto no_memory;
6418
 
        svc++;
6419
 
        if (opt) {
6420
 
            source->data.tcp.service = strndup(svc, opt-svc);
6421
 
        } else {
6422
 
            source->data.tcp.service = strdup(svc);
6423
 
        }
6424
 
        if (!source->data.tcp.service)
6425
 
            goto no_memory;
6426
 
    } else if (STRPREFIX(val, "unix:")) {
6427
 
        const char *opt;
6428
 
        val += strlen("unix:");
6429
 
        opt = strchr(val, ',');
6430
 
        source->type = VIR_DOMAIN_CHR_TYPE_UNIX;
6431
 
        if (opt) {
6432
 
            if (strstr(opt, "listen"))
6433
 
                source->data.nix.listen = true;
6434
 
            source->data.nix.path = strndup(val, opt-val);
6435
 
        } else {
6436
 
            source->data.nix.path = strdup(val);
6437
 
        }
6438
 
        if (!source->data.nix.path)
6439
 
            goto no_memory;
6440
 
 
6441
 
    } else if (STRPREFIX(val, "/dev")) {
6442
 
        source->type = VIR_DOMAIN_CHR_TYPE_DEV;
6443
 
        source->data.file.path = strdup(val);
6444
 
        if (!source->data.file.path)
6445
 
            goto no_memory;
6446
 
    } else {
6447
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
6448
 
                        _("unknown character device syntax %s"), val);
6449
 
        goto error;
6450
 
    }
6451
 
 
6452
 
    return 0;
6453
 
 
6454
 
no_memory:
6455
 
    virReportOOMError();
6456
 
error:
6457
 
    return -1;
6458
 
}
6459
 
 
6460
 
 
6461
 
static virCPUDefPtr
6462
 
qemuInitGuestCPU(virDomainDefPtr dom)
6463
 
{
6464
 
    if (!dom->cpu) {
6465
 
        virCPUDefPtr cpu;
6466
 
 
6467
 
        if (VIR_ALLOC(cpu) < 0) {
6468
 
            virReportOOMError();
6469
 
            return NULL;
6470
 
        }
6471
 
 
6472
 
        cpu->type = VIR_CPU_TYPE_GUEST;
6473
 
        cpu->match = VIR_CPU_MATCH_EXACT;
6474
 
        dom->cpu = cpu;
6475
 
    }
6476
 
 
6477
 
    return dom->cpu;
6478
 
}
6479
 
 
6480
 
 
6481
 
static int
6482
 
qemuParseCommandLineCPU(virDomainDefPtr dom,
6483
 
                        const char *val)
6484
 
{
6485
 
    virCPUDefPtr cpu;
6486
 
    const char *p = val;
6487
 
    const char *next;
6488
 
 
6489
 
    if (!(cpu = qemuInitGuestCPU(dom)))
6490
 
        goto error;
6491
 
 
6492
 
    do {
6493
 
        if (*p == '\0' || *p == ',')
6494
 
            goto syntax;
6495
 
 
6496
 
        if ((next = strchr(p, ',')))
6497
 
            next++;
6498
 
 
6499
 
        if (!cpu->model) {
6500
 
            if (next)
6501
 
                cpu->model = strndup(p, next - p - 1);
6502
 
            else
6503
 
                cpu->model = strdup(p);
6504
 
 
6505
 
            if (!cpu->model)
6506
 
                goto no_memory;
6507
 
        }
6508
 
        else if (*p == '+' || *p == '-') {
6509
 
            char *feature;
6510
 
            int policy;
6511
 
            int ret;
6512
 
 
6513
 
            if (*p == '+')
6514
 
                policy = VIR_CPU_FEATURE_REQUIRE;
6515
 
            else
6516
 
                policy = VIR_CPU_FEATURE_DISABLE;
6517
 
 
6518
 
            p++;
6519
 
            if (*p == '\0' || *p == ',')
6520
 
                goto syntax;
6521
 
 
6522
 
            if (next)
6523
 
                feature = strndup(p, next - p - 1);
6524
 
            else
6525
 
                feature = strdup(p);
6526
 
 
6527
 
            if (!feature)
6528
 
                goto no_memory;
6529
 
 
6530
 
            ret = virCPUDefAddFeature(cpu, feature, policy);
6531
 
            VIR_FREE(feature);
6532
 
            if (ret < 0)
6533
 
                goto error;
6534
 
        }
6535
 
    } while ((p = next));
6536
 
 
6537
 
    return 0;
6538
 
 
6539
 
syntax:
6540
 
    qemuReportError(VIR_ERR_INTERNAL_ERROR,
6541
 
                    _("unknown CPU syntax '%s'"), val);
6542
 
    goto error;
6543
 
 
6544
 
no_memory:
6545
 
    virReportOOMError();
6546
 
error:
6547
 
    return -1;
6548
 
}
6549
 
 
6550
 
 
6551
 
static int
6552
 
qemuParseCommandLineSmp(virDomainDefPtr dom,
6553
 
                        const char *val)
6554
 
{
6555
 
    unsigned int sockets = 0;
6556
 
    unsigned int cores = 0;
6557
 
    unsigned int threads = 0;
6558
 
    unsigned int maxcpus = 0;
6559
 
    int i;
6560
 
    int nkws;
6561
 
    char **kws;
6562
 
    char **vals;
6563
 
    int n;
6564
 
    char *end;
6565
 
    int ret;
6566
 
 
6567
 
    nkws = qemuParseKeywords(val, &kws, &vals, 1);
6568
 
    if (nkws < 0)
6569
 
        return -1;
6570
 
 
6571
 
    for (i = 0; i < nkws; i++) {
6572
 
        if (vals[i] == NULL) {
6573
 
            if (i > 0 ||
6574
 
                virStrToLong_i(kws[i], &end, 10, &n) < 0 || *end != '\0')
6575
 
                goto syntax;
6576
 
            dom->vcpus = n;
6577
 
        } else {
6578
 
            if (virStrToLong_i(vals[i], &end, 10, &n) < 0 || *end != '\0')
6579
 
                goto syntax;
6580
 
            if (STREQ(kws[i], "sockets"))
6581
 
                sockets = n;
6582
 
            else if (STREQ(kws[i], "cores"))
6583
 
                cores = n;
6584
 
            else if (STREQ(kws[i], "threads"))
6585
 
                threads = n;
6586
 
            else if (STREQ(kws[i], "maxcpus"))
6587
 
                maxcpus = n;
6588
 
            else
6589
 
                goto syntax;
6590
 
        }
6591
 
    }
6592
 
 
6593
 
    dom->maxvcpus = maxcpus ? maxcpus : dom->vcpus;
6594
 
 
6595
 
    if (sockets && cores && threads) {
6596
 
        virCPUDefPtr cpu;
6597
 
 
6598
 
        if (!(cpu = qemuInitGuestCPU(dom)))
6599
 
            goto error;
6600
 
        cpu->sockets = sockets;
6601
 
        cpu->cores = cores;
6602
 
        cpu->threads = threads;
6603
 
    } else if (sockets || cores || threads)
6604
 
        goto syntax;
6605
 
 
6606
 
    ret = 0;
6607
 
 
6608
 
cleanup:
6609
 
    for (i = 0; i < nkws; i++) {
6610
 
        VIR_FREE(kws[i]);
6611
 
        VIR_FREE(vals[i]);
6612
 
    }
6613
 
    VIR_FREE(kws);
6614
 
    VIR_FREE(vals);
6615
 
 
6616
 
    return ret;
6617
 
 
6618
 
syntax:
6619
 
    qemuReportError(VIR_ERR_INTERNAL_ERROR,
6620
 
                    _("cannot parse CPU topology '%s'"), val);
6621
 
error:
6622
 
    ret = -1;
6623
 
    goto cleanup;
6624
 
}
6625
 
 
6626
 
 
6627
 
/*
6628
 
 * Analyse the env and argv settings and reconstruct a
6629
 
 * virDomainDefPtr representing these settings as closely
6630
 
 * as is practical. This is not an exact science....
6631
 
 */
6632
 
virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
6633
 
                                     const char **progenv,
6634
 
                                     const char **progargv,
6635
 
                                     char **pidfile,
6636
 
                                     virDomainChrSourceDefPtr *monConfig,
6637
 
                                     bool *monJSON)
6638
 
{
6639
 
    virDomainDefPtr def;
6640
 
    int i;
6641
 
    int nographics = 0;
6642
 
    int fullscreen = 0;
6643
 
    char *path;
6644
 
    int nnics = 0;
6645
 
    const char **nics = NULL;
6646
 
    int video = VIR_DOMAIN_VIDEO_TYPE_CIRRUS;
6647
 
    int nvirtiodisk = 0;
6648
 
    qemuDomainCmdlineDefPtr cmd = NULL;
6649
 
    virDomainDiskDefPtr disk = NULL;
6650
 
    const char *ceph_args = qemuFindEnv(progenv, "CEPH_ARGS");
6651
 
 
6652
 
    if (pidfile)
6653
 
        *pidfile = NULL;
6654
 
    if (monConfig)
6655
 
        *monConfig = NULL;
6656
 
    if (monJSON)
6657
 
        *monJSON = false;
6658
 
 
6659
 
    if (!progargv[0]) {
6660
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,
6661
 
                        "%s", _("no emulator path found"));
6662
 
        return NULL;
6663
 
    }
6664
 
 
6665
 
    if (VIR_ALLOC(def) < 0)
6666
 
        goto no_memory;
6667
 
 
6668
 
    /* allocate the cmdlinedef up-front; if it's unused, we'll free it later */
6669
 
    if (VIR_ALLOC(cmd) < 0)
6670
 
        goto no_memory;
6671
 
 
6672
 
    if (virUUIDGenerate(def->uuid) < 0) {
6673
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
6674
 
                        _("failed to generate uuid"));
6675
 
        goto error;
6676
 
    }
6677
 
 
6678
 
    def->id = -1;
6679
 
    def->mem.cur_balloon = def->mem.max_balloon = 64 * 1024;
6680
 
    def->maxvcpus = 1;
6681
 
    def->vcpus = 1;
6682
 
    def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
6683
 
    def->features = (1 << VIR_DOMAIN_FEATURE_ACPI)
6684
 
        /*| (1 << VIR_DOMAIN_FEATURE_APIC)*/;
6685
 
    def->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART;
6686
 
    def->onCrash = VIR_DOMAIN_LIFECYCLE_DESTROY;
6687
 
    def->onPoweroff = VIR_DOMAIN_LIFECYCLE_DESTROY;
6688
 
    def->virtType = VIR_DOMAIN_VIRT_QEMU;
6689
 
    if (!(def->emulator = strdup(progargv[0])))
6690
 
        goto no_memory;
6691
 
 
6692
 
    if (strstr(def->emulator, "kvm")) {
6693
 
        def->virtType = VIR_DOMAIN_VIRT_KVM;
6694
 
        def->features |= (1 << VIR_DOMAIN_FEATURE_PAE);
6695
 
    }
6696
 
 
6697
 
 
6698
 
    if (strstr(def->emulator, "xenner")) {
6699
 
        def->virtType = VIR_DOMAIN_VIRT_KVM;
6700
 
        def->os.type = strdup("xen");
6701
 
    } else {
6702
 
        def->os.type = strdup("hvm");
6703
 
    }
6704
 
    if (!def->os.type)
6705
 
        goto no_memory;
6706
 
 
6707
 
    if (STRPREFIX(def->emulator, "qemu"))
6708
 
        path = def->emulator;
6709
 
    else
6710
 
        path = strstr(def->emulator, "qemu");
6711
 
    if (path &&
6712
 
        STRPREFIX(path, "qemu-system-"))
6713
 
        def->os.arch = strdup(path + strlen("qemu-system-"));
6714
 
    else
6715
 
        def->os.arch = strdup("i686");
6716
 
    if (!def->os.arch)
6717
 
        goto no_memory;
6718
 
 
6719
 
#define WANT_VALUE()                                                   \
6720
 
    const char *val = progargv[++i];                                   \
6721
 
    if (!val) {                                                        \
6722
 
        qemuReportError(VIR_ERR_INTERNAL_ERROR,                        \
6723
 
                        _("missing value for %s argument"), arg);      \
6724
 
        goto error;                                                    \
6725
 
    }
6726
 
 
6727
 
    /* One initial loop to get list of NICs, so we
6728
 
     * can correlate them later */
6729
 
    for (i = 1 ; progargv[i] ; i++) {
6730
 
        const char *arg = progargv[i];
6731
 
        /* Make sure we have a single - for all options to
6732
 
           simplify next logic */
6733
 
        if (STRPREFIX(arg, "--"))
6734
 
            arg++;
6735
 
 
6736
 
        if (STREQ(arg, "-net")) {
6737
 
            WANT_VALUE();
6738
 
            if (STRPREFIX(val, "nic")) {
6739
 
                if (VIR_REALLOC_N(nics, nnics+1) < 0)
6740
 
                    goto no_memory;
6741
 
                nics[nnics++] = val;
6742
 
            }
6743
 
        }
6744
 
    }
6745
 
 
6746
 
    /* Now the real processing loop */
6747
 
    for (i = 1 ; progargv[i] ; i++) {
6748
 
        const char *arg = progargv[i];
6749
 
        /* Make sure we have a single - for all options to
6750
 
           simplify next logic */
6751
 
        if (STRPREFIX(arg, "--"))
6752
 
            arg++;
6753
 
 
6754
 
        if (STREQ(arg, "-vnc")) {
6755
 
            virDomainGraphicsDefPtr vnc;
6756
 
            char *tmp;
6757
 
            WANT_VALUE();
6758
 
            if (VIR_ALLOC(vnc) < 0)
6759
 
                goto no_memory;
6760
 
            vnc->type = VIR_DOMAIN_GRAPHICS_TYPE_VNC;
6761
 
 
6762
 
            if (STRPREFIX(val, "unix:")) {
6763
 
                /* -vnc unix:/some/big/path */
6764
 
                vnc->data.vnc.socket = strdup(val + 5);
6765
 
                if (!vnc->data.vnc.socket) {
6766
 
                    virDomainGraphicsDefFree(vnc);
6767
 
                    goto no_memory;
6768
 
                }
6769
 
            } else {
6770
 
                /*
6771
 
                 * -vnc 127.0.0.1:4
6772
 
                 * -vnc [2001:1:2:3:4:5:1234:1234]:4
6773
 
                 * -vnc some.host.name:4
6774
 
                 */
6775
 
                char *opts;
6776
 
                const char *sep = ":";
6777
 
                if (val[0] == '[')
6778
 
                    sep = "]:";
6779
 
                tmp = strstr(val, sep);
6780
 
                if (!tmp) {
6781
 
                    virDomainGraphicsDefFree(vnc);
6782
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR,
6783
 
                                    _("missing VNC port number in '%s'"), val);
6784
 
                    goto error;
6785
 
                }
6786
 
                if (virStrToLong_i(tmp+strlen(sep), &opts, 10,
6787
 
                                   &vnc->data.vnc.port) < 0) {
6788
 
                    virDomainGraphicsDefFree(vnc);
6789
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR,
6790
 
                                    _("cannot parse VNC port '%s'"), tmp+1);
6791
 
                    goto error;
6792
 
                }
6793
 
                if (val[0] == '[')
6794
 
                    virDomainGraphicsListenSetAddress(vnc, 0,
6795
 
                                                      val+1, tmp-(val+1), true);
6796
 
                else
6797
 
                    virDomainGraphicsListenSetAddress(vnc, 0,
6798
 
                                                      val, tmp-val, true);
6799
 
                if (!virDomainGraphicsListenGetAddress(vnc, 0)) {
6800
 
                    virDomainGraphicsDefFree(vnc);
6801
 
                    goto no_memory;
6802
 
                }
6803
 
                vnc->data.vnc.port += 5900;
6804
 
                vnc->data.vnc.autoport = 0;
6805
 
            }
6806
 
 
6807
 
            if (VIR_REALLOC_N(def->graphics, def->ngraphics+1) < 0) {
6808
 
                virDomainGraphicsDefFree(vnc);
6809
 
                goto no_memory;
6810
 
            }
6811
 
            def->graphics[def->ngraphics++] = vnc;
6812
 
        } else if (STREQ(arg, "-m")) {
6813
 
            int mem;
6814
 
            WANT_VALUE();
6815
 
            if (virStrToLong_i(val, NULL, 10, &mem) < 0) {
6816
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR, \
6817
 
                                _("cannot parse memory level '%s'"), val);
6818
 
                goto error;
6819
 
            }
6820
 
            def->mem.cur_balloon = def->mem.max_balloon = mem * 1024;
6821
 
        } else if (STREQ(arg, "-smp")) {
6822
 
            WANT_VALUE();
6823
 
            if (qemuParseCommandLineSmp(def, val) < 0)
6824
 
                goto error;
6825
 
        } else if (STREQ(arg, "-uuid")) {
6826
 
            WANT_VALUE();
6827
 
            if (virUUIDParse(val, def->uuid) < 0) {
6828
 
                qemuReportError(VIR_ERR_INTERNAL_ERROR, \
6829
 
                                _("cannot parse UUID '%s'"), val);
6830
 
                goto error;
6831
 
            }
6832
 
        } else if (STRPREFIX(arg, "-hd") ||
6833
 
                   STRPREFIX(arg, "-sd") ||
6834
 
                   STRPREFIX(arg, "-fd") ||
6835
 
                   STREQ(arg, "-cdrom")) {
6836
 
            WANT_VALUE();
6837
 
            if (VIR_ALLOC(disk) < 0)
6838
 
                goto no_memory;
6839
 
 
6840
 
            if (STRPREFIX(val, "/dev/"))
6841
 
                disk->type = VIR_DOMAIN_DISK_TYPE_BLOCK;
6842
 
            else if (STRPREFIX(val, "nbd:")) {
6843
 
                disk->type = VIR_DOMAIN_DISK_TYPE_NETWORK;
6844
 
                disk->protocol = VIR_DOMAIN_DISK_PROTOCOL_NBD;
6845
 
                val += strlen("nbd:");
6846
 
            } else if (STRPREFIX(val, "rbd:")) {
6847
 
                disk->type = VIR_DOMAIN_DISK_TYPE_NETWORK;
6848
 
                disk->protocol = VIR_DOMAIN_DISK_PROTOCOL_RBD;
6849
 
                val += strlen("rbd:");
6850
 
            } else if (STRPREFIX(val, "sheepdog:")) {
6851
 
                disk->type = VIR_DOMAIN_DISK_TYPE_NETWORK;
6852
 
                disk->protocol = VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG;
6853
 
                val += strlen("sheepdog:");
6854
 
            } else
6855
 
                disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
6856
 
            if (STREQ(arg, "-cdrom")) {
6857
 
                disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
6858
 
                disk->dst = strdup("hdc");
6859
 
                if (!disk->dst)
6860
 
                    goto no_memory;
6861
 
                disk->readonly = 1;
6862
 
            } else {
6863
 
                if (STRPREFIX(arg, "-fd")) {
6864
 
                    disk->device = VIR_DOMAIN_DISK_DEVICE_FLOPPY;
6865
 
                    disk->bus = VIR_DOMAIN_DISK_BUS_FDC;
6866
 
                } else {
6867
 
                    disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
6868
 
                    if (STRPREFIX(arg, "-hd"))
6869
 
                        disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
6870
 
                    else
6871
 
                        disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
6872
 
                }
6873
 
                disk->dst = strdup(arg + 1);
6874
 
                if (!disk->dst)
6875
 
                    goto no_memory;
6876
 
            }
6877
 
            disk->src = strdup(val);
6878
 
            if (!disk->src)
6879
 
                goto no_memory;
6880
 
 
6881
 
            if (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK) {
6882
 
                char *host, *port;
6883
 
 
6884
 
                switch (disk->protocol) {
6885
 
                case VIR_DOMAIN_DISK_PROTOCOL_NBD:
6886
 
                    host = disk->src;
6887
 
                    port = strchr(host, ':');
6888
 
                    if (!port) {
6889
 
                        qemuReportError(VIR_ERR_INTERNAL_ERROR,
6890
 
                                        _("cannot parse nbd filename '%s'"), disk->src);
6891
 
                        goto error;
6892
 
                    }
6893
 
                    *port++ = '\0';
6894
 
                    if (VIR_ALLOC(disk->hosts) < 0)
6895
 
                        goto no_memory;
6896
 
                    disk->nhosts = 1;
6897
 
                    disk->hosts->name = host;
6898
 
                    disk->hosts->port = strdup(port);
6899
 
                    if (!disk->hosts->port)
6900
 
                        goto no_memory;
6901
 
                    VIR_FREE(disk->src);
6902
 
                    disk->src = NULL;
6903
 
                    break;
6904
 
                case VIR_DOMAIN_DISK_PROTOCOL_RBD:
6905
 
                    /* old-style CEPH_ARGS env variable is parsed later */
6906
 
                    if (!ceph_args && qemuParseRBDString(disk) < 0)
6907
 
                        goto error;
6908
 
                    break;
6909
 
                case VIR_DOMAIN_DISK_PROTOCOL_SHEEPDOG:
6910
 
                    /* disk->src must be [vdiname] or [host]:[port]:[vdiname] */
6911
 
                    port = strchr(disk->src, ':');
6912
 
                    if (port) {
6913
 
                        char *vdi;
6914
 
 
6915
 
                        *port++ = '\0';
6916
 
                        vdi = strchr(port, ':');
6917
 
                        if (!vdi) {
6918
 
                            qemuReportError(VIR_ERR_INTERNAL_ERROR,
6919
 
                                            _("cannot parse sheepdog filename '%s'"), val);
6920
 
                            goto error;
6921
 
                        }
6922
 
                        *vdi++ = '\0';
6923
 
                        if (VIR_ALLOC(disk->hosts) < 0)
6924
 
                            goto no_memory;
6925
 
                        disk->nhosts = 1;
6926
 
                        disk->hosts->name = disk->src;
6927
 
                        disk->hosts->port = strdup(port);
6928
 
                        if (!disk->hosts->port)
6929
 
                            goto no_memory;
6930
 
                        disk->src = strdup(vdi);
6931
 
                        if (!disk->src)
6932
 
                            goto no_memory;
6933
 
                    }
6934
 
                    break;
6935
 
                }
6936
 
            }
6937
 
 
6938
 
            if (!(disk->src || disk->nhosts > 0) ||
6939
 
                !disk->dst)
6940
 
                goto no_memory;
6941
 
 
6942
 
            if (virDomainDiskDefAssignAddress(caps, disk) < 0)
6943
 
                goto error;
6944
 
 
6945
 
            if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
6946
 
                goto no_memory;
6947
 
            def->disks[def->ndisks++] = disk;
6948
 
            disk = NULL;
6949
 
        } else if (STREQ(arg, "-no-acpi")) {
6950
 
            def->features &= ~(1 << VIR_DOMAIN_FEATURE_ACPI);
6951
 
        } else if (STREQ(arg, "-no-reboot")) {
6952
 
            def->onReboot = VIR_DOMAIN_LIFECYCLE_DESTROY;
6953
 
        } else if (STREQ(arg, "-no-kvm")) {
6954
 
            def->virtType = VIR_DOMAIN_VIRT_QEMU;
6955
 
        } else if (STREQ(arg, "-nographic")) {
6956
 
            nographics = 1;
6957
 
        } else if (STREQ(arg, "-full-screen")) {
6958
 
            fullscreen = 1;
6959
 
        } else if (STREQ(arg, "-localtime")) {
6960
 
            def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME;
6961
 
        } else if (STREQ(arg, "-kernel")) {
6962
 
            WANT_VALUE();
6963
 
            if (!(def->os.kernel = strdup(val)))
6964
 
                goto no_memory;
6965
 
        } else if (STREQ(arg, "-initrd")) {
6966
 
            WANT_VALUE();
6967
 
            if (!(def->os.initrd = strdup(val)))
6968
 
                goto no_memory;
6969
 
        } else if (STREQ(arg, "-append")) {
6970
 
            WANT_VALUE();
6971
 
            if (!(def->os.cmdline = strdup(val)))
6972
 
                goto no_memory;
6973
 
        } else if (STREQ(arg, "-boot")) {
6974
 
            int n, b = 0;
6975
 
            WANT_VALUE();
6976
 
            for (n = 0 ; val[n] && b < VIR_DOMAIN_BOOT_LAST ; n++) {
6977
 
                if (val[n] == 'a')
6978
 
                    def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_FLOPPY;
6979
 
                else if (val[n] == 'c')
6980
 
                    def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_DISK;
6981
 
                else if (val[n] == 'd')
6982
 
                    def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_CDROM;
6983
 
                else if (val[n] == 'n')
6984
 
                    def->os.bootDevs[b++] = VIR_DOMAIN_BOOT_NET;
6985
 
                else if (val[n] == ',')
6986
 
                    break;
6987
 
            }
6988
 
            def->os.nBootDevs = b;
6989
 
 
6990
 
            if (strstr(val, "menu=on"))
6991
 
                def->os.bootmenu = 1;
6992
 
        } else if (STREQ(arg, "-name")) {
6993
 
            char *process;
6994
 
            WANT_VALUE();
6995
 
            process = strstr(val, ",process=");
6996
 
            if (process == NULL) {
6997
 
                if (!(def->name = strdup(val)))
6998
 
                    goto no_memory;
6999
 
            } else {
7000
 
                if (!(def->name = strndup(val, process - val)))
7001
 
                    goto no_memory;
7002
 
            }
7003
 
            if (STREQ(def->name, ""))
7004
 
                VIR_FREE(def->name);
7005
 
        } else if (STREQ(arg, "-M")) {
7006
 
            WANT_VALUE();
7007
 
            if (!(def->os.machine = strdup(val)))
7008
 
                goto no_memory;
7009
 
        } else if (STREQ(arg, "-serial")) {
7010
 
            WANT_VALUE();
7011
 
            if (STRNEQ(val, "none")) {
7012
 
                virDomainChrDefPtr chr;
7013
 
 
7014
 
                if (!(chr = virDomainChrDefNew()))
7015
 
                    goto error;
7016
 
 
7017
 
                if (qemuParseCommandLineChr(&chr->source, val) < 0) {
7018
 
                    virDomainChrDefFree(chr);
7019
 
                    goto error;
7020
 
                }
7021
 
                if (VIR_REALLOC_N(def->serials, def->nserials+1) < 0) {
7022
 
                    virDomainChrDefFree(chr);
7023
 
                    goto no_memory;
7024
 
                }
7025
 
                chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
7026
 
                chr->target.port = def->nserials;
7027
 
                def->serials[def->nserials++] = chr;
7028
 
            }
7029
 
        } else if (STREQ(arg, "-parallel")) {
7030
 
            WANT_VALUE();
7031
 
            if (STRNEQ(val, "none")) {
7032
 
                virDomainChrDefPtr chr;
7033
 
 
7034
 
                if (!(chr = virDomainChrDefNew()))
7035
 
                    goto error;
7036
 
 
7037
 
                if (qemuParseCommandLineChr(&chr->source, val) < 0) {
7038
 
                    virDomainChrDefFree(chr);
7039
 
                    goto error;
7040
 
                }
7041
 
                if (VIR_REALLOC_N(def->parallels, def->nparallels+1) < 0) {
7042
 
                    virDomainChrDefFree(chr);
7043
 
                    goto no_memory;
7044
 
                }
7045
 
                chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL;
7046
 
                chr->target.port = def->nparallels;
7047
 
                def->parallels[def->nparallels++] = chr;
7048
 
            }
7049
 
        } else if (STREQ(arg, "-usbdevice")) {
7050
 
            WANT_VALUE();
7051
 
            if (STREQ(val, "tablet") ||
7052
 
                STREQ(val, "mouse")) {
7053
 
                virDomainInputDefPtr input;
7054
 
                if (VIR_ALLOC(input) < 0)
7055
 
                    goto no_memory;
7056
 
                input->bus = VIR_DOMAIN_INPUT_BUS_USB;
7057
 
                if (STREQ(val, "tablet"))
7058
 
                    input->type = VIR_DOMAIN_INPUT_TYPE_TABLET;
7059
 
                else
7060
 
                    input->type = VIR_DOMAIN_INPUT_TYPE_MOUSE;
7061
 
                if (VIR_REALLOC_N(def->inputs, def->ninputs+1) < 0) {
7062
 
                    virDomainInputDefFree(input);
7063
 
                    goto no_memory;
7064
 
                }
7065
 
                def->inputs[def->ninputs++] = input;
7066
 
            } else if (STRPREFIX(val, "disk:")) {
7067
 
                if (VIR_ALLOC(disk) < 0)
7068
 
                    goto no_memory;
7069
 
                disk->src = strdup(val + strlen("disk:"));
7070
 
                if (!disk->src)
7071
 
                    goto no_memory;
7072
 
                if (STRPREFIX(disk->src, "/dev/"))
7073
 
                    disk->type = VIR_DOMAIN_DISK_TYPE_BLOCK;
7074
 
                else
7075
 
                    disk->type = VIR_DOMAIN_DISK_TYPE_FILE;
7076
 
                disk->device = VIR_DOMAIN_DISK_DEVICE_DISK;
7077
 
                disk->bus = VIR_DOMAIN_DISK_BUS_USB;
7078
 
                if (!(disk->dst = strdup("sda")) ||
7079
 
                    VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
7080
 
                    goto no_memory;
7081
 
                def->disks[def->ndisks++] = disk;
7082
 
                disk = NULL;
7083
 
            } else {
7084
 
                virDomainHostdevDefPtr hostdev;
7085
 
                if (!(hostdev = qemuParseCommandLineUSB(val)))
7086
 
                    goto error;
7087
 
                if (VIR_REALLOC_N(def->hostdevs, def->nhostdevs+1) < 0) {
7088
 
                    virDomainHostdevDefFree(hostdev);
7089
 
                    goto no_memory;
7090
 
                }
7091
 
                def->hostdevs[def->nhostdevs++] = hostdev;
7092
 
            }
7093
 
        } else if (STREQ(arg, "-net")) {
7094
 
            WANT_VALUE();
7095
 
            if (!STRPREFIX(val, "nic") && STRNEQ(val, "none")) {
7096
 
                virDomainNetDefPtr net;
7097
 
                if (!(net = qemuParseCommandLineNet(caps, val, nnics, nics)))
7098
 
                    goto error;
7099
 
                if (VIR_REALLOC_N(def->nets, def->nnets+1) < 0) {
7100
 
                    virDomainNetDefFree(net);
7101
 
                    goto no_memory;
7102
 
                }
7103
 
                def->nets[def->nnets++] = net;
7104
 
            }
7105
 
        } else if (STREQ(arg, "-drive")) {
7106
 
            WANT_VALUE();
7107
 
            if (!(disk = qemuParseCommandLineDisk(caps, val, nvirtiodisk,
7108
 
                                                  ceph_args != NULL)))
7109
 
                goto error;
7110
 
            if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
7111
 
                goto no_memory;
7112
 
            if (disk->bus == VIR_DOMAIN_DISK_BUS_VIRTIO)
7113
 
                nvirtiodisk++;
7114
 
 
7115
 
            def->disks[def->ndisks++] = disk;
7116
 
            disk = NULL;
7117
 
        } else if (STREQ(arg, "-pcidevice")) {
7118
 
            virDomainHostdevDefPtr hostdev;
7119
 
            WANT_VALUE();
7120
 
            if (!(hostdev = qemuParseCommandLinePCI(val)))
7121
 
                goto error;
7122
 
            if (VIR_REALLOC_N(def->hostdevs, def->nhostdevs+1) < 0) {
7123
 
                virDomainHostdevDefFree(hostdev);
7124
 
                goto no_memory;
7125
 
            }
7126
 
            def->hostdevs[def->nhostdevs++] = hostdev;
7127
 
        } else if (STREQ(arg, "-soundhw")) {
7128
 
            const char *start;
7129
 
            WANT_VALUE();
7130
 
            start = val;
7131
 
            while (start) {
7132
 
                const char *tmp = strchr(start, ',');
7133
 
                int type = -1;
7134
 
                if (STRPREFIX(start, "pcspk")) {
7135
 
                    type = VIR_DOMAIN_SOUND_MODEL_PCSPK;
7136
 
                } else if (STRPREFIX(start, "sb16")) {
7137
 
                    type = VIR_DOMAIN_SOUND_MODEL_SB16;
7138
 
                } else if (STRPREFIX(start, "es1370")) {
7139
 
                    type = VIR_DOMAIN_SOUND_MODEL_ES1370;
7140
 
                } else if (STRPREFIX(start, "ac97")) {
7141
 
                    type = VIR_DOMAIN_SOUND_MODEL_AC97;
7142
 
                } else if (STRPREFIX(start, "hda")) {
7143
 
                    type = VIR_DOMAIN_SOUND_MODEL_ICH6;
7144
 
                }
7145
 
 
7146
 
                if (type != -1) {
7147
 
                    virDomainSoundDefPtr snd;
7148
 
                    if (VIR_ALLOC(snd) < 0)
7149
 
                        goto no_memory;
7150
 
                    snd->model = type;
7151
 
                    if (VIR_REALLOC_N(def->sounds, def->nsounds+1) < 0) {
7152
 
                        VIR_FREE(snd);
7153
 
                        goto no_memory;
7154
 
                    }
7155
 
                    def->sounds[def->nsounds++] = snd;
7156
 
                }
7157
 
 
7158
 
                start = tmp ? tmp + 1 : NULL;
7159
 
            }
7160
 
        } else if (STREQ(arg, "-watchdog")) {
7161
 
            WANT_VALUE();
7162
 
            int model = virDomainWatchdogModelTypeFromString (val);
7163
 
 
7164
 
            if (model != -1) {
7165
 
                virDomainWatchdogDefPtr wd;
7166
 
                if (VIR_ALLOC(wd) < 0)
7167
 
                    goto no_memory;
7168
 
                wd->model = model;
7169
 
                wd->action = VIR_DOMAIN_WATCHDOG_ACTION_RESET;
7170
 
                def->watchdog = wd;
7171
 
            }
7172
 
        } else if (STREQ(arg, "-watchdog-action") && def->watchdog) {
7173
 
            WANT_VALUE();
7174
 
            int action = virDomainWatchdogActionTypeFromString (val);
7175
 
 
7176
 
            if (action != -1)
7177
 
                def->watchdog->action = action;
7178
 
        } else if (STREQ(arg, "-bootloader")) {
7179
 
            WANT_VALUE();
7180
 
            def->os.bootloader = strdup(val);
7181
 
            if (!def->os.bootloader)
7182
 
                goto no_memory;
7183
 
        } else if (STREQ(arg, "-vmwarevga")) {
7184
 
            video = VIR_DOMAIN_VIDEO_TYPE_VMVGA;
7185
 
        } else if (STREQ(arg, "-std-vga")) {
7186
 
            video = VIR_DOMAIN_VIDEO_TYPE_VGA;
7187
 
        } else if (STREQ(arg, "-vga")) {
7188
 
            WANT_VALUE();
7189
 
            if (STRNEQ(val, "none")) {
7190
 
                video = qemuVideoTypeFromString(val);
7191
 
                if (video < 0) {
7192
 
                    qemuReportError(VIR_ERR_INTERNAL_ERROR,
7193
 
                                    _("unknown video adapter type '%s'"), val);
7194
 
                    goto error;
7195
 
                }
7196
 
            }
7197
 
        } else if (STREQ(arg, "-cpu")) {
7198
 
            WANT_VALUE();
7199
 
            if (qemuParseCommandLineCPU(def, val) < 0)
7200
 
                goto error;
7201
 
        } else if (STREQ(arg, "-domid")) {
7202
 
            WANT_VALUE();
7203
 
            /* ignore, generted on the fly */
7204
 
        } else if (STREQ(arg, "-usb")) {
7205
 
            /* ignore, always added by libvirt */
7206
 
        } else if (STREQ(arg, "-pidfile")) {
7207
 
            WANT_VALUE();
7208
 
            if (pidfile)
7209
 
                if (!(*pidfile = strdup(val)))
7210
 
                    goto no_memory;
7211
 
        } else if (STREQ(arg, "-incoming")) {
7212
 
            WANT_VALUE();
7213
 
            /* ignore, used via restore/migrate APIs */
7214
 
        } else if (STREQ(arg, "-monitor")) {
7215
 
            WANT_VALUE();
7216
 
            if (monConfig) {
7217
 
                virDomainChrSourceDefPtr chr;
7218
 
 
7219
 
                if (VIR_ALLOC(chr) < 0)
7220
 
                    goto no_memory;
7221
 
 
7222
 
                if (qemuParseCommandLineChr(chr, val) < 0) {
7223
 
                    virDomainChrSourceDefFree(chr);
7224
 
                    goto error;
7225
 
                }
7226
 
 
7227
 
                *monConfig = chr;
7228
 
            }
7229
 
        } else if (STREQ(arg, "-S")) {
7230
 
            /* ignore, always added by libvirt */
7231
 
        } else {
7232
 
            /* something we can't yet parse.  Add it to the qemu namespace
7233
 
             * cmdline/environment advanced options and hope for the best
7234
 
             */
7235
 
            VIR_WARN("unknown QEMU argument '%s', adding to the qemu namespace",
7236
 
                     arg);
7237
 
            if (VIR_REALLOC_N(cmd->args, cmd->num_args+1) < 0)
7238
 
                goto no_memory;
7239
 
            cmd->args[cmd->num_args] = strdup(arg);
7240
 
            if (cmd->args[cmd->num_args] == NULL)
7241
 
                goto no_memory;
7242
 
            cmd->num_args++;
7243
 
        }
7244
 
    }
7245
 
 
7246
 
#undef WANT_VALUE
7247
 
    if (def->ndisks > 0 && ceph_args) {
7248
 
        char *hosts, *port, *saveptr = NULL, *token;
7249
 
        virDomainDiskDefPtr first_rbd_disk = NULL;
7250
 
        for (i = 0 ; i < def->ndisks ; i++) {
7251
 
            if (def->disks[i]->type == VIR_DOMAIN_DISK_TYPE_NETWORK &&
7252
 
                def->disks[i]->protocol == VIR_DOMAIN_DISK_PROTOCOL_RBD) {
7253
 
                first_rbd_disk = def->disks[i];
7254
 
                break;
7255
 
            }
7256
 
        }
7257
 
 
7258
 
        if (!first_rbd_disk) {
7259
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
7260
 
                            _("CEPH_ARGS was set without an rbd disk"));
7261
 
            goto error;
7262
 
        }
7263
 
 
7264
 
        /* CEPH_ARGS should be: -m host1[:port1][,host2[:port2]]... */
7265
 
        if (!STRPREFIX(ceph_args, "-m ")) {
7266
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
7267
 
                            _("could not parse CEPH_ARGS '%s'"), ceph_args);
7268
 
            goto error;
7269
 
        }
7270
 
        hosts = strdup(strchr(ceph_args, ' ') + 1);
7271
 
        if (!hosts)
7272
 
            goto no_memory;
7273
 
        first_rbd_disk->nhosts = 0;
7274
 
        token = strtok_r(hosts, ",", &saveptr);
7275
 
        while (token != NULL) {
7276
 
            if (VIR_REALLOC_N(first_rbd_disk->hosts, first_rbd_disk->nhosts + 1) < 0) {
7277
 
                VIR_FREE(hosts);
7278
 
                goto no_memory;
7279
 
            }
7280
 
            port = strchr(token, ':');
7281
 
            if (port) {
7282
 
                *port++ = '\0';
7283
 
                port = strdup(port);
7284
 
                if (!port) {
7285
 
                    VIR_FREE(hosts);
7286
 
                    goto no_memory;
7287
 
                }
7288
 
            }
7289
 
            first_rbd_disk->hosts[first_rbd_disk->nhosts].port = port;
7290
 
            first_rbd_disk->hosts[first_rbd_disk->nhosts].name = strdup(token);
7291
 
            if (!first_rbd_disk->hosts[first_rbd_disk->nhosts].name) {
7292
 
                VIR_FREE(hosts);
7293
 
                goto no_memory;
7294
 
            }
7295
 
            first_rbd_disk->nhosts++;
7296
 
            token = strtok_r(NULL, ",", &saveptr);
7297
 
        }
7298
 
        VIR_FREE(hosts);
7299
 
 
7300
 
        if (first_rbd_disk->nhosts == 0) {
7301
 
            qemuReportError(VIR_ERR_INTERNAL_ERROR,
7302
 
                            _("found no rbd hosts in CEPH_ARGS '%s'"), ceph_args);
7303
 
            goto error;
7304
 
        }
7305
 
    }
7306
 
 
7307
 
    if (!nographics && def->ngraphics == 0) {
7308
 
        virDomainGraphicsDefPtr sdl;
7309
 
        const char *display = qemuFindEnv(progenv, "DISPLAY");
7310
 
        const char *xauth = qemuFindEnv(progenv, "XAUTHORITY");
7311
 
        if (VIR_ALLOC(sdl) < 0)
7312
 
            goto no_memory;
7313
 
        sdl->type = VIR_DOMAIN_GRAPHICS_TYPE_SDL;
7314
 
        sdl->data.sdl.fullscreen = fullscreen;
7315
 
        if (display &&
7316
 
            !(sdl->data.sdl.display = strdup(display))) {
7317
 
            VIR_FREE(sdl);
7318
 
            goto no_memory;
7319
 
        }
7320
 
        if (xauth &&
7321
 
            !(sdl->data.sdl.xauth = strdup(xauth))) {
7322
 
            VIR_FREE(sdl);
7323
 
            goto no_memory;
7324
 
        }
7325
 
 
7326
 
        if (VIR_REALLOC_N(def->graphics, def->ngraphics+1) < 0) {
7327
 
            virDomainGraphicsDefFree(sdl);
7328
 
            goto no_memory;
7329
 
        }
7330
 
        def->graphics[def->ngraphics++] = sdl;
7331
 
    }
7332
 
 
7333
 
    if (def->ngraphics) {
7334
 
        virDomainVideoDefPtr vid;
7335
 
        if (VIR_ALLOC(vid) < 0)
7336
 
            goto no_memory;
7337
 
        if (def->virtType == VIR_DOMAIN_VIRT_XEN)
7338
 
            vid->type = VIR_DOMAIN_VIDEO_TYPE_XEN;
7339
 
        else
7340
 
            vid->type = video;
7341
 
        vid->vram = virDomainVideoDefaultRAM(def, vid->type);
7342
 
        vid->heads = 1;
7343
 
 
7344
 
        if (VIR_REALLOC_N(def->videos, def->nvideos+1) < 0) {
7345
 
            virDomainVideoDefFree(vid);
7346
 
            goto no_memory;
7347
 
        }
7348
 
        def->videos[def->nvideos++] = vid;
7349
 
    }
7350
 
 
7351
 
    /*
7352
 
     * having a balloon is the default, define one with type="none" to avoid it
7353
 
     */
7354
 
    if (!def->memballoon) {
7355
 
        virDomainMemballoonDefPtr memballoon;
7356
 
        if (VIR_ALLOC(memballoon) < 0)
7357
 
            goto no_memory;
7358
 
        memballoon->model = VIR_DOMAIN_MEMBALLOON_MODEL_VIRTIO;
7359
 
 
7360
 
        def->memballoon = memballoon;
7361
 
    }
7362
 
 
7363
 
    VIR_FREE(nics);
7364
 
 
7365
 
    if (virDomainDefAddImplicitControllers(def) < 0)
7366
 
        goto error;
7367
 
 
7368
 
    if (cmd->num_args || cmd->num_env) {
7369
 
        def->ns = caps->ns;
7370
 
        def->namespaceData = cmd;
7371
 
    }
7372
 
    else
7373
 
        VIR_FREE(cmd);
7374
 
 
7375
 
    return def;
7376
 
 
7377
 
no_memory:
7378
 
    virReportOOMError();
7379
 
error:
7380
 
    virDomainDiskDefFree(disk);
7381
 
    VIR_FREE(cmd);
7382
 
    virDomainDefFree(def);
7383
 
    VIR_FREE(nics);
7384
 
    if (monConfig) {
7385
 
        virDomainChrSourceDefFree(*monConfig);
7386
 
        *monConfig = NULL;
7387
 
    }
7388
 
    if (pidfile)
7389
 
        VIR_FREE(*pidfile);
7390
 
    return NULL;
7391
 
}
7392
 
 
7393
 
 
7394
 
virDomainDefPtr qemuParseCommandLineString(virCapsPtr caps,
7395
 
                                           const char *args,
7396
 
                                           char **pidfile,
7397
 
                                           virDomainChrSourceDefPtr *monConfig,
7398
 
                                           bool *monJSON)
7399
 
{
7400
 
    const char **progenv = NULL;
7401
 
    const char **progargv = NULL;
7402
 
    virDomainDefPtr def = NULL;
7403
 
    int i;
7404
 
 
7405
 
    if (qemuStringToArgvEnv(args, &progenv, &progargv) < 0)
7406
 
        goto cleanup;
7407
 
 
7408
 
    def = qemuParseCommandLine(caps, progenv, progargv,
7409
 
                               pidfile, monConfig, monJSON);
7410
 
 
7411
 
cleanup:
7412
 
    for (i = 0 ; progargv && progargv[i] ; i++)
7413
 
        VIR_FREE(progargv[i]);
7414
 
    VIR_FREE(progargv);
7415
 
 
7416
 
    for (i = 0 ; progenv && progenv[i] ; i++)
7417
 
        VIR_FREE(progenv[i]);
7418
 
    VIR_FREE(progenv);
7419
 
 
7420
 
    return def;
7421
 
}
7422
 
 
7423
 
 
7424
 
static int qemuParseProcFileStrings(unsigned int pid,
7425
 
                                    const char *name,
7426
 
                                    const char ***list)
7427
 
{
7428
 
    char *path = NULL;
7429
 
    int ret = -1;
7430
 
    char *data = NULL;
7431
 
    ssize_t len;
7432
 
    char *tmp;
7433
 
    size_t nstr = 0;
7434
 
    const char **str = NULL;
7435
 
    int i;
7436
 
 
7437
 
    if (virAsprintf(&path, "/proc/%u/%s", pid, name) < 0) {
7438
 
        virReportOOMError();
7439
 
        goto cleanup;
7440
 
    }
7441
 
 
7442
 
    if ((len = virFileReadAll(path, 1024*128, &data)) < 0)
7443
 
        goto cleanup;
7444
 
 
7445
 
    tmp = data;
7446
 
    while (tmp < (data + len)) {
7447
 
        if (VIR_EXPAND_N(str, nstr, 1) < 0) {
7448
 
            virReportOOMError();
7449
 
            goto cleanup;
7450
 
        }
7451
 
 
7452
 
        if (!(str[nstr-1] = strdup(tmp))) {
7453
 
            virReportOOMError();
7454
 
            goto cleanup;
7455
 
        }
7456
 
        /* Skip arg */
7457
 
        tmp += strlen(tmp);
7458
 
        /* Skip \0 separator */
7459
 
        tmp++;
7460
 
    }
7461
 
 
7462
 
    if (VIR_EXPAND_N(str, nstr, 1) < 0) {
7463
 
        virReportOOMError();
7464
 
        goto cleanup;
7465
 
    }
7466
 
 
7467
 
    str[nstr-1] = NULL;
7468
 
 
7469
 
    ret = nstr-1;
7470
 
    *list = str;
7471
 
 
7472
 
cleanup:
7473
 
    if (ret < 0) {
7474
 
        for (i = 0 ; str && str[i] ; i++)
7475
 
            VIR_FREE(str[i]);
7476
 
        VIR_FREE(str);
7477
 
    }
7478
 
    VIR_FREE(data);
7479
 
    VIR_FREE(path);
7480
 
    return ret;
7481
 
}
7482
 
 
7483
 
virDomainDefPtr qemuParseCommandLinePid(virCapsPtr caps,
7484
 
                                        unsigned int pid,
7485
 
                                        char **pidfile,
7486
 
                                        virDomainChrSourceDefPtr *monConfig,
7487
 
                                        bool *monJSON)
7488
 
{
7489
 
    virDomainDefPtr def = NULL;
7490
 
    const char **progargv = NULL;
7491
 
    const char **progenv = NULL;
7492
 
    char *exepath = NULL;
7493
 
    char *emulator;
7494
 
    int i;
7495
 
 
7496
 
    if (qemuParseProcFileStrings(pid, "cmdline", &progargv) < 0 ||
7497
 
        qemuParseProcFileStrings(pid, "environ", &progenv) < 0)
7498
 
        goto cleanup;
7499
 
 
7500
 
    if (!(def = qemuParseCommandLine(caps, progenv, progargv,
7501
 
                                     pidfile, monConfig, monJSON)))
7502
 
        goto cleanup;
7503
 
 
7504
 
    if (virAsprintf(&exepath, "/proc/%u/exe", pid) < 0) {
7505
 
        virReportOOMError();
7506
 
        goto cleanup;
7507
 
    }
7508
 
 
7509
 
    if (virFileResolveLink(exepath, &emulator) < 0) {
7510
 
        virReportSystemError(errno,
7511
 
                             _("Unable to resolve %s for pid %u"),
7512
 
                             exepath, pid);
7513
 
        goto cleanup;
7514
 
    }
7515
 
    VIR_FREE(def->emulator);
7516
 
    def->emulator = emulator;
7517
 
 
7518
 
cleanup:
7519
 
    VIR_FREE(exepath);
7520
 
    for (i = 0 ; progargv && progargv[i] ; i++)
7521
 
        VIR_FREE(progargv[i]);
7522
 
    VIR_FREE(progargv);
7523
 
    for (i = 0 ; progenv && progenv[i] ; i++)
7524
 
        VIR_FREE(progenv[i]);
7525
 
    VIR_FREE(progenv);
7526
 
    return def;
7527
 
}