~ubuntu-branches/ubuntu/maverick/libvirt/maverick

« back to all changes in this revision

Viewing changes to src/libvirt.c

  • Committer: Bazaar Package Importer
  • Author(s): Soren Hansen
  • Date: 2008-06-25 18:51:21 UTC
  • mto: (3.1.1 lenny) (1.2.1 upstream) (0.2.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 27.
  • Revision ID: james.westby@ubuntu.com-20080625185121-8dku38gpoluks1bx
Tags: upstream-0.4.4
ImportĀ upstreamĀ versionĀ 0.4.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
 */
11
11
 
12
12
#include <config.h>
13
 
#include "libvirt/libvirt.h"
14
13
 
15
14
#include <stdio.h>
16
15
#include <stdlib.h>
170
169
            return -1;
171
170
        }
172
171
 
173
 
        if (STREQ(bufptr, "") && cred[i].defresult)
174
 
            cred[i].result = strdup(cred[i].defresult);
175
 
        else
176
 
            cred[i].result = strdup(bufptr);
177
 
        if (!cred[i].result)
178
 
            return -1;
179
 
        cred[i].resultlen = strlen(cred[i].result);
 
172
        if (cred[i].type != VIR_CRED_EXTERNAL) {
 
173
            if (STREQ(bufptr, "") && cred[i].defresult)
 
174
                cred[i].result = strdup(cred[i].defresult);
 
175
            else
 
176
                cred[i].result = strdup(bufptr);
 
177
            if (!cred[i].result)
 
178
                return -1;
 
179
            cred[i].resultlen = strlen(cred[i].result);
 
180
        }
180
181
    }
181
182
 
182
183
    return 0;
282
283
#ifdef WITH_LXC
283
284
    if (lxcRegister() == -1) return -1;
284
285
#endif
 
286
#ifdef WITH_LIBVIRTD
285
287
    if (storageRegister() == -1) return -1;
 
288
#endif
286
289
#ifdef WITH_REMOTE
287
290
    if (remoteRegister () == -1) return -1;
288
291
#endif
454
457
 
455
458
    if (driver == NULL) {
456
459
        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
457
 
        return(-1);
 
460
        return(-1);
458
461
    }
459
462
 
460
463
    if (virNetworkDriverTabCount >= MAX_DRIVERS) {
461
 
        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
462
 
        return(-1);
 
464
        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
 
465
        return(-1);
463
466
    }
464
467
 
465
468
    virNetworkDriverTab[virNetworkDriverTabCount] = driver;
486
489
    }
487
490
 
488
491
    if (virStorageDriverTabCount >= MAX_DRIVERS) {
489
 
        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
 
492
        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
490
493
        return(-1);
491
494
    }
492
495
 
510
513
 
511
514
    if (driver == NULL) {
512
515
        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
513
 
        return(-1);
 
516
        return(-1);
514
517
    }
515
518
 
516
519
    if (virDriverTabCount >= MAX_DRIVERS) {
517
 
        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
518
 
        return(-1);
 
520
        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
 
521
        return(-1);
519
522
    }
520
523
 
521
524
    if (driver->no < 0) {
522
 
        virLibConnError
 
525
        virLibConnError
523
526
            (NULL, VIR_ERR_INVALID_ARG,
524
527
             "virRegisterDriver: tried to register an internal Xen driver");
525
528
        return -1;
549
552
    }
550
553
 
551
554
    if (virStateDriverTabCount >= MAX_DRIVERS) {
552
 
        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
 
555
        virLibConnError(NULL, VIR_ERR_INVALID_ARG, __FUNCTION__);
553
556
        return(-1);
554
557
    }
555
558
 
607
610
    return ret;
608
611
}
609
612
 
 
613
int __virStateSigDispatcher(siginfo_t *siginfo) {
 
614
    int i, ret = 0;
 
615
 
 
616
    for (i = 0 ; i < virStateDriverTabCount ; i++) {
 
617
        if (virStateDriverTab[i]->sigHandler &&
 
618
            virStateDriverTab[i]->sigHandler(siginfo))
 
619
            ret = 1;
 
620
    }
 
621
    return ret;
 
622
}
 
623
 
610
624
 
611
625
 
612
626
/**
633
647
 
634
648
    if (!initialized)
635
649
        if (virInitialize() < 0)
636
 
            return -1;
 
650
            return -1;
637
651
 
638
652
    if (libVer == NULL)
639
653
        return (-1);
641
655
 
642
656
    if (typeVer != NULL) {
643
657
        if (type == NULL)
644
 
            type = "Xen";
645
 
        for (i = 0;i < virDriverTabCount;i++) {
646
 
            if ((virDriverTab[i] != NULL) &&
647
 
                (!strcasecmp(virDriverTab[i]->name, type))) {
648
 
                *typeVer = virDriverTab[i]->ver;
649
 
                break;
650
 
            }
651
 
        }
 
658
            type = "Xen";
 
659
        for (i = 0;i < virDriverTabCount;i++) {
 
660
            if ((virDriverTab[i] != NULL) &&
 
661
                (STRCASEEQ(virDriverTab[i]->name, type))) {
 
662
                *typeVer = virDriverTab[i]->ver;
 
663
                break;
 
664
            }
 
665
        }
652
666
        if (i >= virDriverTabCount) {
653
667
            *typeVer = 0;
654
668
            virLibConnError(NULL, VIR_ERR_NO_SUPPORT, type);
675
689
    if (!name || name[0] == '\0') {
676
690
        char *defname = getenv("LIBVIRT_DEFAULT_URI");
677
691
        if (defname && *defname) {
678
 
            DEBUG("Using LIBVIRT_DEFAULT_URI %s", defname);
 
692
            DEBUG("Using LIBVIRT_DEFAULT_URI %s", defname);
679
693
            name = defname;
680
694
        } else {
681
 
            const char *use = NULL;
682
 
            const char *latest;
683
 
            int probes = 0;
684
 
            for (i = 0; i < virNetworkDriverTabCount; i++) {
685
 
                if ((virDriverTab[i]->probe != NULL) &&
686
 
                    ((latest = virDriverTab[i]->probe()) != NULL)) {
687
 
                    probes++;
 
695
            const char *use = NULL;
 
696
            const char *latest;
 
697
            int probes = 0;
 
698
            for (i = 0; i < virNetworkDriverTabCount; i++) {
 
699
                if ((virDriverTab[i]->probe != NULL) &&
 
700
                    ((latest = virDriverTab[i]->probe()) != NULL)) {
 
701
                    probes++;
688
702
 
689
 
                    DEBUG("Probed %s", latest);
690
 
                    /*
691
 
                     * if running a xen kernel, give it priority over
692
 
                     * QEmu emulation
693
 
                     */
694
 
                    if (STREQ(latest, "xen:///"))
695
 
                        use = latest;
696
 
                    else if (use == NULL)
697
 
                        use = latest;
698
 
                }
699
 
            }
700
 
            if (use == NULL) {
701
 
                name = "xen:///";
702
 
                DEBUG("Could not probe any hypervisor defaulting to %s",
703
 
                      name);
704
 
            } else {
705
 
                name = use;
706
 
                DEBUG("Using %s as default URI, %d hypervisor found",
707
 
                      use, probes);
708
 
            }
709
 
        }
 
703
                    DEBUG("Probed %s", latest);
 
704
                    /*
 
705
                     * if running a xen kernel, give it priority over
 
706
                     * QEmu emulation
 
707
                     */
 
708
                    if (STREQ(latest, "xen:///"))
 
709
                        use = latest;
 
710
                    else if (use == NULL)
 
711
                        use = latest;
 
712
                }
 
713
            }
 
714
            if (use == NULL) {
 
715
                name = "xen:///";
 
716
                DEBUG("Could not probe any hypervisor defaulting to %s",
 
717
                      name);
 
718
            } else {
 
719
                name = use;
 
720
                DEBUG("Using %s as default URI, %d hypervisor found",
 
721
                      use, probes);
 
722
            }
 
723
        }
710
724
    }
711
725
 
712
726
    /* Convert xen -> xen:/// for back compat */
713
 
    if (!strcasecmp(name, "xen"))
 
727
    if (STRCASEEQ(name, "xen"))
714
728
        name = "xen:///";
715
729
 
716
730
    /* Convert xen:// -> xen:/// because xmlParseURI cannot parse the
824
838
failed:
825
839
    if (ret->driver) ret->driver->close (ret);
826
840
    if (uri) xmlFreeURI(uri);
827
 
        virUnrefConnect(ret);
 
841
        virUnrefConnect(ret);
828
842
    return NULL;
829
843
}
830
844
 
1218
1232
    }
1219
1233
    if (conn->flags & VIR_CONNECT_RO) {
1220
1234
        virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1221
 
        return (NULL);
 
1235
        return (NULL);
1222
1236
    }
1223
1237
 
1224
1238
    if (conn->driver->domainCreateLinux)
1334
1348
                 raw + 12, raw + 13, raw + 14, raw + 15);
1335
1349
 
1336
1350
    if (ret!=VIR_UUID_BUFLEN) {
1337
 
        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
1338
 
        return (NULL);
 
1351
        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
 
1352
        return (NULL);
1339
1353
    }
1340
1354
    for (i = 0; i < VIR_UUID_BUFLEN; i++)
1341
1355
        uuid[i] = raw[i] & 0xFF;
1379
1393
 * @domain: a domain object
1380
1394
 *
1381
1395
 * Destroy the domain object. The running instance is shutdown if not down
1382
 
 * already and all resources used by it are given back to the hypervisor.
1383
 
 * The data structure is freed and should not be used thereafter if the
1384
 
 * call does not return an error.
1385
 
 * This function may requires privileged access
 
1396
 * already and all resources used by it are given back to the hypervisor. This
 
1397
 * does not free the associated virDomainPtr object.
 
1398
 * This function may require privileged access
1386
1399
 *
1387
1400
 * Returns 0 in case of success and -1 in case of failure.
1388
1401
 */
1401
1414
    conn = domain->conn;
1402
1415
    if (conn->flags & VIR_CONNECT_RO) {
1403
1416
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1404
 
        return (-1);
 
1417
        return (-1);
1405
1418
    }
1406
1419
 
1407
1420
    if (conn->driver->domainDestroy)
1458
1471
    }
1459
1472
    if (domain->conn->flags & VIR_CONNECT_RO) {
1460
1473
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1461
 
        return (-1);
 
1474
        return (-1);
1462
1475
    }
1463
1476
 
1464
1477
    conn = domain->conn;
1492
1505
    }
1493
1506
    if (domain->conn->flags & VIR_CONNECT_RO) {
1494
1507
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1495
 
        return (-1);
 
1508
        return (-1);
1496
1509
    }
1497
1510
 
1498
1511
    conn = domain->conn;
1529
1542
    }
1530
1543
    if (domain->conn->flags & VIR_CONNECT_RO) {
1531
1544
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1532
 
        return (-1);
 
1545
        return (-1);
1533
1546
    }
1534
1547
    conn = domain->conn;
1535
1548
    if (to == NULL) {
1585
1598
    }
1586
1599
    if (conn->flags & VIR_CONNECT_RO) {
1587
1600
        virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1588
 
        return (-1);
 
1601
        return (-1);
1589
1602
    }
1590
1603
    if (from == NULL) {
1591
1604
        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
1643
1656
    }
1644
1657
    if (domain->conn->flags & VIR_CONNECT_RO) {
1645
1658
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1646
 
        return (-1);
 
1659
        return (-1);
1647
1660
    }
1648
1661
    conn = domain->conn;
1649
1662
    if (to == NULL) {
1703
1716
    }
1704
1717
    if (domain->conn->flags & VIR_CONNECT_RO) {
1705
1718
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1706
 
        return (-1);
 
1719
        return (-1);
1707
1720
    }
1708
1721
 
1709
1722
    conn = domain->conn;
1738
1751
    }
1739
1752
    if (domain->conn->flags & VIR_CONNECT_RO) {
1740
1753
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1741
 
        return (-1);
 
1754
        return (-1);
1742
1755
    }
1743
1756
 
1744
1757
    conn = domain->conn;
1794
1807
        return (-1);
1795
1808
    }
1796
1809
 
1797
 
    if (domain->id == 0) {
1798
 
        memset(uuid, 0, VIR_UUID_BUFLEN);
1799
 
    } else {
1800
 
        memcpy(uuid, &domain->uuid[0], VIR_UUID_BUFLEN);
1801
 
    }
 
1810
    memcpy(uuid, &domain->uuid[0], VIR_UUID_BUFLEN);
 
1811
 
1802
1812
    return (0);
1803
1813
}
1804
1814
 
1933
1943
 
1934
1944
    if (domain == NULL) {
1935
1945
        TODO
1936
 
        return (-1);
 
1946
        return (-1);
1937
1947
    }
1938
1948
    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
1939
1949
        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
1941
1951
    }
1942
1952
    if (domain->conn->flags & VIR_CONNECT_RO) {
1943
1953
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1944
 
        return (-1);
 
1954
        return (-1);
1945
1955
    }
1946
1956
    if (memory < 4096) {
1947
1957
        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
1976
1986
 
1977
1987
    if (domain == NULL) {
1978
1988
        TODO
1979
 
        return (-1);
 
1989
        return (-1);
1980
1990
    }
1981
1991
    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
1982
1992
        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
1984
1994
    }
1985
1995
    if (domain->conn->flags & VIR_CONNECT_RO) {
1986
1996
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
1987
 
        return (-1);
 
1997
        return (-1);
1988
1998
    }
1989
1999
    if (memory < 4096) {
1990
2000
        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
2416
2426
 */
2417
2427
int
2418
2428
virDomainGetSchedulerParameters(virDomainPtr domain,
2419
 
                                virSchedParameterPtr params, int *nparams)
 
2429
                                virSchedParameterPtr params, int *nparams)
2420
2430
{
2421
2431
    virConnectPtr conn;
2422
2432
    DEBUG("domain=%p, params=%p, nparams=%p", domain, params, nparams);
2448
2458
 */
2449
2459
int
2450
2460
virDomainSetSchedulerParameters(virDomainPtr domain,
2451
 
                                virSchedParameterPtr params, int nparams)
 
2461
                                virSchedParameterPtr params, int nparams)
2452
2462
{
2453
2463
    virConnectPtr conn;
2454
2464
    DEBUG("domain=%p, params=%p, nparams=%d", domain, params, nparams);
2576
2586
    return -1;
2577
2587
}
2578
2588
 
2579
 
 
 
2589
/**
 
2590
 * virDomainBlockPeek:
 
2591
 * @dom: pointer to the domain object
 
2592
 * @path: path to the block device
 
2593
 * @offset: offset within block device
 
2594
 * @size: size to read
 
2595
 * @buffer: return buffer (must be at least size bytes)
 
2596
 * @flags: unused, always pass 0
 
2597
 *
 
2598
 * This function allows you to read the contents of a domain's
 
2599
 * disk device.
 
2600
 *
 
2601
 * Typical uses for this are to determine if the domain has
 
2602
 * written a Master Boot Record (indicating that the domain
 
2603
 * has completed installation), or to try to work out the state
 
2604
 * of the domain's filesystems.
 
2605
 *
 
2606
 * (Note that in the local case you might try to open the
 
2607
 * block device or file directly, but that won't work in the
 
2608
 * remote case, nor if you don't have sufficient permission.
 
2609
 * Hence the need for this call).
 
2610
 *
 
2611
 * 'path' must be a device or file corresponding to the domain.
 
2612
 * In other words it must be the precise string returned in
 
2613
 * a <disk><source dev='...'/></disk> from
 
2614
 * virDomainGetXMLDesc.
 
2615
 *
 
2616
 * 'offset' and 'size' represent an area which must lie entirely
 
2617
 * within the device or file.  'size' may be 0 to test if the
 
2618
 * call would succeed.
 
2619
 *
 
2620
 * 'buffer' is the return buffer and must be at least 'size' bytes.
 
2621
 *
 
2622
 * NB. The remote driver imposes a 64K byte limit on 'size'.
 
2623
 * For your program to be able to work reliably over a remote
 
2624
 * connection you should split large requests to <= 65536 bytes.
 
2625
 *
 
2626
 * Returns: 0 in case of success or -1 in case of failure.
 
2627
 */
 
2628
int
 
2629
virDomainBlockPeek (virDomainPtr dom,
 
2630
                    const char *path,
 
2631
                    unsigned long long offset /* really 64 bits */,
 
2632
                    size_t size,
 
2633
                    void *buffer,
 
2634
                    unsigned int flags)
 
2635
{
 
2636
    virConnectPtr conn;
 
2637
    DEBUG("domain=%p, path=%s, offset=%lld, size=%zi, buffer=%p",
 
2638
          dom, path, offset, size, buffer);
 
2639
 
 
2640
    if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
 
2641
        virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
 
2642
        return -1;
 
2643
    }
 
2644
    conn = dom->conn;
 
2645
 
 
2646
    if (!path) {
 
2647
        virLibDomainError (dom, VIR_ERR_INVALID_ARG,
 
2648
                           _("path is NULL"));
 
2649
        return -1;
 
2650
    }
 
2651
 
 
2652
    if (flags != 0) {
 
2653
        virLibDomainError (dom, VIR_ERR_INVALID_ARG,
 
2654
                           _("flags must be zero"));
 
2655
        return -1;
 
2656
    }
 
2657
 
 
2658
    /* Allow size == 0 as an access test. */
 
2659
    if (size > 0 && !buffer) {
 
2660
        virLibDomainError (dom, VIR_ERR_INVALID_ARG,
 
2661
                           _("buffer is NULL"));
 
2662
        return -1;
 
2663
    }
 
2664
 
 
2665
    if (conn->driver->domainBlockPeek)
 
2666
        return conn->driver->domainBlockPeek (dom, path, offset, size,
 
2667
                                              buffer, flags);
 
2668
 
 
2669
    virLibDomainError (dom, VIR_ERR_NO_SUPPORT, __FUNCTION__);
 
2670
    return -1;
 
2671
}
 
2672
 
 
2673
/**
 
2674
 * virDomainMemoryPeek:
 
2675
 * @dom: pointer to the domain object
 
2676
 * @start: start of memory to peek
 
2677
 * @size: size of memory to peek
 
2678
 * @buffer: return buffer (must be at least size bytes)
 
2679
 * @flags: flags, see below
 
2680
 *
 
2681
 * This function allows you to read the contents of a domain's
 
2682
 * memory.
 
2683
 *
 
2684
 * The memory which is read is controlled by the 'start', 'size'
 
2685
 * and 'flags' parameters.
 
2686
 *
 
2687
 * If 'flags' is VIR_MEMORY_VIRTUAL then the 'start' and 'size'
 
2688
 * parameters are interpreted as virtual memory addresses for
 
2689
 * whichever task happens to be running on the domain at the
 
2690
 * moment.  Although this sounds haphazard it is in fact what
 
2691
 * you want in order to read Linux kernel state, because it
 
2692
 * ensures that pointers in the kernel image can be interpreted
 
2693
 * coherently.
 
2694
 *
 
2695
 * 'buffer' is the return buffer and must be at least 'size' bytes.
 
2696
 * 'size' may be 0 to test if the call would succeed.
 
2697
 *
 
2698
 * NB. The remote driver imposes a 64K byte limit on 'size'.
 
2699
 * For your program to be able to work reliably over a remote
 
2700
 * connection you should split large requests to <= 65536 bytes.
 
2701
 *
 
2702
 * Returns: 0 in case of success or -1 in case of failure.
 
2703
 */
 
2704
int
 
2705
virDomainMemoryPeek (virDomainPtr dom,
 
2706
                     unsigned long long start /* really 64 bits */,
 
2707
                     size_t size,
 
2708
                     void *buffer,
 
2709
                     unsigned int flags)
 
2710
{
 
2711
    virConnectPtr conn;
 
2712
    DEBUG ("domain=%p, start=%lld, size=%zi, buffer=%p, flags=%d",
 
2713
           dom, start, size, buffer, flags);
 
2714
 
 
2715
    if (!VIR_IS_CONNECTED_DOMAIN (dom)) {
 
2716
        virLibDomainError (NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
 
2717
        return -1;
 
2718
    }
 
2719
    conn = dom->conn;
 
2720
 
 
2721
    /* Flags must be VIR_MEMORY_VIRTUAL at the moment.
 
2722
     *
 
2723
     * Note on access to physical memory: A VIR_MEMORY_PHYSICAL flag is
 
2724
     * a possibility.  However it isn't really useful unless the caller
 
2725
     * can also access registers, particularly CR3 on x86 in order to
 
2726
     * get the Page Table Directory.  Since registers are different on
 
2727
     * every architecture, that would imply another call to get the
 
2728
     * machine registers.
 
2729
     *
 
2730
     * The QEMU driver handles only VIR_MEMORY_VIRTUAL, mapping it
 
2731
     * to the qemu 'memsave' command which does the virtual to physical
 
2732
     * mapping inside qemu.
 
2733
     *
 
2734
     * At time of writing there is no Xen driver.  However the Xen
 
2735
     * hypervisor only lets you map physical pages from other domains,
 
2736
     * and so the Xen driver would have to do the virtual to physical
 
2737
     * mapping by chasing 2, 3 or 4-level page tables from the PTD.
 
2738
     * There is example code in libxc (xc_translate_foreign_address)
 
2739
     * which does this, although we cannot copy this code directly
 
2740
     * because of incompatible licensing.
 
2741
     */
 
2742
    if (flags != VIR_MEMORY_VIRTUAL) {
 
2743
        virLibDomainError (dom, VIR_ERR_INVALID_ARG,
 
2744
                           _("flags parameter must be VIR_MEMORY_VIRTUAL"));
 
2745
        return -1;
 
2746
    }
 
2747
 
 
2748
    /* Allow size == 0 as an access test. */
 
2749
    if (size > 0 && !buffer) {
 
2750
        virLibDomainError (dom, VIR_ERR_INVALID_ARG,
 
2751
                           _("buffer is NULL but size is non-zero"));
 
2752
        return -1;
 
2753
    }
 
2754
 
 
2755
    if (conn->driver->domainMemoryPeek)
 
2756
        return conn->driver->domainMemoryPeek (dom, start, size,
 
2757
                                               buffer, flags);
 
2758
 
 
2759
    virLibDomainError (dom, VIR_ERR_NO_SUPPORT, __FUNCTION__);
 
2760
    return -1;
 
2761
}
2580
2762
 
2581
2763
 
2582
2764
/************************************************************************
2604
2786
    }
2605
2787
    if (conn->flags & VIR_CONNECT_RO) {
2606
2788
        virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
2607
 
        return (NULL);
 
2789
        return (NULL);
2608
2790
    }
2609
2791
    if (xml == NULL) {
2610
2792
        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
2638
2820
    conn = domain->conn;
2639
2821
    if (conn->flags & VIR_CONNECT_RO) {
2640
2822
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
2641
 
        return (-1);
 
2823
        return (-1);
2642
2824
    }
2643
2825
 
2644
2826
    if (conn->driver->domainUndefine)
2722
2904
 
2723
2905
    if (domain == NULL) {
2724
2906
        TODO
2725
 
        return (-1);
 
2907
        return (-1);
2726
2908
    }
2727
2909
    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
2728
2910
        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
2731
2913
    conn = domain->conn;
2732
2914
    if (conn->flags & VIR_CONNECT_RO) {
2733
2915
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
2734
 
        return (-1);
 
2916
        return (-1);
2735
2917
    }
2736
2918
 
2737
2919
    if (conn->driver->domainCreate)
2829
3011
 
2830
3012
    if (domain == NULL) {
2831
3013
        TODO
2832
 
        return (-1);
 
3014
        return (-1);
2833
3015
    }
2834
3016
    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
2835
3017
        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
2837
3019
    }
2838
3020
    if (domain->conn->flags & VIR_CONNECT_RO) {
2839
3021
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
2840
 
        return (-1);
 
3022
        return (-1);
2841
3023
    }
2842
3024
 
2843
3025
    if (nvcpus < 1) {
2880
3062
 
2881
3063
    if (domain == NULL) {
2882
3064
        TODO
2883
 
        return (-1);
 
3065
        return (-1);
2884
3066
    }
2885
3067
    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
2886
3068
        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
2888
3070
    }
2889
3071
    if (domain->conn->flags & VIR_CONNECT_RO) {
2890
3072
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
2891
 
        return (-1);
 
3073
        return (-1);
2892
3074
    }
2893
3075
 
2894
3076
    if ((vcpu > 32000) || (cpumap == NULL) || (maplen < 1)) {
2928
3110
 */
2929
3111
int
2930
3112
virDomainGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo,
2931
 
                  unsigned char *cpumaps, int maplen)
 
3113
                  unsigned char *cpumaps, int maplen)
2932
3114
{
2933
3115
    virConnectPtr conn;
2934
3116
    DEBUG("domain=%p, info=%p, maxinfo=%d, cpumaps=%p, maplen=%d", domain, info, maxinfo, cpumaps, maplen);
2935
3117
 
2936
3118
    if (domain == NULL) {
2937
3119
        TODO
2938
 
        return (-1);
 
3120
        return (-1);
2939
3121
    }
2940
3122
    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
2941
3123
        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
3014
3196
    }
3015
3197
    if (domain->conn->flags & VIR_CONNECT_RO) {
3016
3198
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
3017
 
        return (-1);
 
3199
        return (-1);
3018
3200
    }
3019
3201
    conn = domain->conn;
3020
3202
 
3046
3228
    }
3047
3229
    if (domain->conn->flags & VIR_CONNECT_RO) {
3048
3230
        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
3049
 
        return (-1);
 
3231
        return (-1);
3050
3232
    }
3051
3233
    conn = domain->conn;
3052
3234
 
3345
3527
                 raw + 12, raw + 13, raw + 14, raw + 15);
3346
3528
 
3347
3529
    if (ret!=VIR_UUID_BUFLEN) {
3348
 
        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
3349
 
        return (NULL);
 
3530
        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
 
3531
        return (NULL);
3350
3532
    }
3351
3533
    for (i = 0; i < VIR_UUID_BUFLEN; i++)
3352
3534
        uuid[i] = raw[i] & 0xFF;
3379
3561
    }
3380
3562
    if (conn->flags & VIR_CONNECT_RO) {
3381
3563
        virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
3382
 
        return (NULL);
 
3564
        return (NULL);
3383
3565
    }
3384
3566
 
3385
3567
    if (conn->networkDriver && conn->networkDriver->networkCreateXML)
3409
3591
    }
3410
3592
    if (conn->flags & VIR_CONNECT_RO) {
3411
3593
        virLibConnError(conn, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
3412
 
        return (NULL);
 
3594
        return (NULL);
3413
3595
    }
3414
3596
    if (xml == NULL) {
3415
3597
        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
3443
3625
    conn = network->conn;
3444
3626
    if (conn->flags & VIR_CONNECT_RO) {
3445
3627
        virLibNetworkError(network, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
3446
 
        return (-1);
 
3628
        return (-1);
3447
3629
    }
3448
3630
 
3449
3631
    if (conn->networkDriver && conn->networkDriver->networkUndefine)
3470
3652
 
3471
3653
    if (network == NULL) {
3472
3654
        TODO
3473
 
        return (-1);
 
3655
        return (-1);
3474
3656
    }
3475
3657
    if (!VIR_IS_CONNECTED_NETWORK(network)) {
3476
3658
        virLibNetworkError(NULL, VIR_ERR_INVALID_NETWORK, __FUNCTION__);
3479
3661
    conn = network->conn;
3480
3662
    if (conn->flags & VIR_CONNECT_RO) {
3481
3663
        virLibNetworkError(network, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
3482
 
        return (-1);
 
3664
        return (-1);
3483
3665
    }
3484
3666
 
3485
3667
    if (conn->networkDriver && conn->networkDriver->networkCreate)
3494
3676
 * @network: a network object
3495
3677
 *
3496
3678
 * Destroy the network object. The running instance is shutdown if not down
3497
 
 * already and all resources used by it are given back to the hypervisor.
3498
 
 * The data structure is freed and should not be used thereafter if the
3499
 
 * call does not return an error.
3500
 
 * This function may requires privileged access
 
3679
 * already and all resources used by it are given back to the hypervisor. This
 
3680
 * does not free the associated virNetworkPtr object.
 
3681
 * This function may require privileged access
3501
3682
 *
3502
3683
 * Returns 0 in case of success and -1 in case of failure.
3503
3684
 */
3515
3696
    conn = network->conn;
3516
3697
    if (conn->flags & VIR_CONNECT_RO) {
3517
3698
        virLibNetworkError(network, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
3518
 
        return (-1);
 
3699
        return (-1);
3519
3700
    }
3520
3701
 
3521
3702
    if (conn->networkDriver && conn->networkDriver->networkDestroy)
3990
4171
 */
3991
4172
virStoragePoolPtr
3992
4173
virStoragePoolLookupByUUIDString(virConnectPtr conn,
3993
 
                                                                 const char *uuidstr)
 
4174
                                                                 const char *uuidstr)
3994
4175
{
3995
4176
    unsigned char uuid[VIR_UUID_BUFLEN];
3996
4177
    DEBUG("conn=%p, uuidstr=%s", conn, uuidstr);
5024
5205
    virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
5025
5206
    return NULL;
5026
5207
}
5027
 
 
5028
 
 
5029
 
/*
5030
 
 * vim: set tabstop=4:
5031
 
 * vim: set shiftwidth=4:
5032
 
 * vim: set expandtab:
5033
 
 */
5034
 
/*
5035
 
 * Local variables:
5036
 
 *  indent-tabs-mode: nil
5037
 
 *  c-indent-level: 4
5038
 
 *  c-basic-offset: 4
5039
 
 *  tab-width: 4
5040
 
 * End:
5041
 
 */