libvirt.c 35.6 KB
Newer Older
D
Daniel P. Berrange 已提交
1
/*
2
 * libvirt.c: Main interfaces for the libvirt library to handle virtualization
D
Daniel Veillard 已提交
3 4
 *           domains from a process running in domain 0
 *
E
Eric Blake 已提交
5
 * Copyright (C) 2005-2006, 2008-2014 Red Hat, Inc.
D
Daniel Veillard 已提交
6
 *
O
Osier Yang 已提交
7 8 9 10 11 12 13 14 15 16 17
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library.  If not, see
O
Osier Yang 已提交
19
 * <http://www.gnu.org/licenses/>.
D
Daniel Veillard 已提交
20 21
 */

22
#include <config.h>
D
Daniel Veillard 已提交
23

24 25 26
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
E
Eric Blake 已提交
27
#include <sys/wait.h>
28
#include <time.h>
29

30 31
#include <libxml/parser.h>
#include <libxml/xpath.h>
32 33
#include "getpass.h"

34
#ifdef HAVE_WINSOCK2_H
35
# include <winsock2.h>
36
#endif
37

38
#ifdef WITH_CURL
39 40 41
# include <curl/curl.h>
#endif

42
#include "virerror.h"
43
#include "virlog.h"
44
#include "datatypes.h"
45
#include "driver.h"
46

47
#include "viruuid.h"
48
#include "viralloc.h"
49
#include "configmake.h"
50
#include "virconf.h"
51
#if WITH_GNUTLS
52 53
# include "rpc/virnettlscontext.h"
#endif
54
#include "vircommand.h"
55
#include "virfile.h"
56
#include "virrandom.h"
M
Martin Kletzander 已提交
57
#include "viruri.h"
58
#include "virthread.h"
59
#include "virstring.h"
E
Eric Blake 已提交
60
#include "virutil.h"
61
#include "virtypedparam.h"
62

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
#ifdef WITH_TEST
# include "test/test_driver.h"
#endif
#ifdef WITH_REMOTE
# include "remote/remote_driver.h"
#endif
#ifdef WITH_OPENVZ
# include "openvz/openvz_driver.h"
#endif
#ifdef WITH_VMWARE
# include "vmware/vmware_driver.h"
#endif
#ifdef WITH_PHYP
# include "phyp/phyp_driver.h"
#endif
#ifdef WITH_ESX
# include "esx/esx_driver.h"
#endif
#ifdef WITH_HYPERV
# include "hyperv/hyperv_driver.h"
#endif
R
Roman Bogorodskiy 已提交
84 85 86
#ifdef WITH_BHYVE
# include "bhyve/bhyve_driver.h"
#endif
87

88 89
#define VIR_FROM_THIS VIR_FROM_NONE

90 91
VIR_LOG_INIT("libvirt");

D
Daniel Veillard 已提交
92 93 94
/*
 * TODO:
 * - use lock to protect against concurrent accesses ?
D
Daniel Veillard 已提交
95
 * - use reference counting to guarantee coherent pointer state ?
D
Daniel Veillard 已提交
96 97
 */

98
#define MAX_DRIVERS 21
99

100 101
static virConnectDriverPtr virConnectDriverTab[MAX_DRIVERS];
static int virConnectDriverTabCount;
102
static virStateDriverPtr virStateDriverTab[MAX_DRIVERS];
103
static int virStateDriverTabCount;
104

105 106 107 108 109 110 111
static virNetworkDriverPtr virSharedNetworkDriver;
static virInterfaceDriverPtr virSharedInterfaceDriver;
static virStorageDriverPtr virSharedStorageDriver;
static virNodeDeviceDriverPtr virSharedNodeDeviceDriver;
static virSecretDriverPtr virSharedSecretDriver;
static virNWFilterDriverPtr virSharedNWFilterDriver;

112

113 114 115
static int
virConnectAuthCallbackDefault(virConnectCredentialPtr cred,
                              unsigned int ncred,
J
Ján Tomko 已提交
116
                              void *cbdata G_GNUC_UNUSED)
117
{
118
    size_t i;
119

120
    for (i = 0; i < ncred; i++) {
121 122
        char buf[1024];
        char *bufptr = buf;
123
        size_t len;
124 125

        switch (cred[i].type) {
126 127 128 129
        case VIR_CRED_EXTERNAL: {
            if (STRNEQ(cred[i].challenge, "PolicyKit"))
                return -1;

130 131 132 133 134
            /*
             * Ignore & carry on. Although we can't auth
             * directly, the user may have authenticated
             * themselves already outside context of libvirt
             */
135 136
            break;
        }
137

138 139 140 141
        case VIR_CRED_USERNAME:
        case VIR_CRED_AUTHNAME:
        case VIR_CRED_ECHOPROMPT:
        case VIR_CRED_REALM:
142
            if (printf("%s: ", cred[i].prompt) < 0)
143 144 145 146
                return -1;
            if (fflush(stdout) != 0)
                return -1;

147 148 149 150 151 152 153
            if (!fgets(buf, sizeof(buf), stdin)) {
                if (feof(stdin)) { /* Treat EOF as "" */
                    buf[0] = '\0';
                    break;
                }
                return -1;
            }
154 155 156
            len = strlen(buf);
            if (len != 0 && buf[len-1] == '\n')
                buf[len-1] = '\0';
157 158 159 160
            break;

        case VIR_CRED_PASSPHRASE:
        case VIR_CRED_NOECHOPROMPT:
161
            if (printf("%s: ", cred[i].prompt) < 0)
162 163 164 165
                return -1;
            if (fflush(stdout) != 0)
                return -1;

166 167 168 169
            bufptr = getpass("");
            if (!bufptr)
                return -1;
            break;
170 171 172

        default:
            return -1;
173 174
        }

D
Daniel P. Berrange 已提交
175
        if (cred[i].type != VIR_CRED_EXTERNAL) {
176 177 178
            if (VIR_STRDUP(cred[i].result,
                           STREQ(bufptr, "") && cred[i].defresult ?
                           cred[i].defresult : bufptr) < 0)
D
Daniel P. Berrange 已提交
179 180 181
                return -1;
            cred[i].resultlen = strlen(cred[i].result);
        }
182 183 184 185 186
    }

    return 0;
}

187

188 189 190 191 192 193 194 195 196 197
/* Don't typically want VIR_CRED_USERNAME. It enables you to authenticate
 * as one user, and act as another. It just results in annoying
 * prompts for the username twice & is very rarely what you want
 */
static int virConnectCredTypeDefault[] = {
    VIR_CRED_AUTHNAME,
    VIR_CRED_ECHOPROMPT,
    VIR_CRED_REALM,
    VIR_CRED_PASSPHRASE,
    VIR_CRED_NOECHOPROMPT,
198
    VIR_CRED_EXTERNAL,
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
};

static virConnectAuth virConnectAuthDefault = {
    virConnectCredTypeDefault,
    sizeof(virConnectCredTypeDefault)/sizeof(int),
    virConnectAuthCallbackDefault,
    NULL,
};

/*
 * virConnectAuthPtrDefault
 *
 * A default implementation of the authentication callbacks. This
 * implementation is suitable for command line based tools. It will
 * prompt for username, passwords, realm and one time keys as needed.
 * It will print on STDOUT, and read from STDIN. If this is not
 * suitable for the application's needs an alternative implementation
 * should be provided.
 */
virConnectAuthPtr virConnectAuthPtrDefault = &virConnectAuthDefault;

220 221
#if HAVE_WINSOCK2_H
static int
222
virWinsockInit(void)
223 224 225 226 227
{
    WORD winsock_version, err;
    WSADATA winsock_data;

    /* http://msdn2.microsoft.com/en-us/library/ms742213.aspx */
228 229
    winsock_version = MAKEWORD(2, 2);
    err = WSAStartup(winsock_version, &winsock_data);
J
Jim Meyering 已提交
230
    return err == 0 ? 0 : -1;
231 232 233
}
#endif

234

235
static bool virGlobalError;
236
static virOnceControl virGlobalOnce = VIR_ONCE_CONTROL_INITIALIZER;
237

238 239 240
static void
virGlobalInit(void)
{
241 242 243 244 245
    /* It would be nice if we could trace the use of this call, to
     * help diagnose in log files if a user calls something other than
     * virConnectOpen first.  But we can't rely on VIR_DEBUG working
     * until after initialization is complete, and since this is
     * one-shot, we never get here again.  */
246
    if (virErrorInitialize() < 0)
247
        goto error;
248

249 250
    virFileActivateDirOverrideForLib();

251 252
    if (getuid() != geteuid() ||
        getgid() != getegid()) {
253
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
254
                       _("libvirt.so is not safe to use from setuid/setgid programs"));
255 256 257
        goto error;
    }

258
    virLogSetFromEnv();
259

260
#ifdef WITH_GNUTLS
261
    virNetTLSInit();
262
#endif
263

264
#if WITH_CURL
265 266 267
    curl_global_init(CURL_GLOBAL_DEFAULT);
#endif

268
    VIR_DEBUG("register drivers");
269

270
#if HAVE_WINSOCK2_H
271
    if (virWinsockInit() == -1)
272
        goto error;
273 274
#endif

275
#ifdef HAVE_LIBINTL_H
276
    if (!bindtextdomain(PACKAGE, LOCALEDIR))
277
        goto error;
278
#endif /* HAVE_LIBINTL_H */
279

280
    /*
281 282
     * Note that the order is important: the first ones have a higher
     * priority when calling virConnectOpen.
283
     */
284
#ifdef WITH_TEST
285 286
    if (testRegister() == -1)
        goto error;
287 288
#endif
#ifdef WITH_OPENVZ
289 290
    if (openvzRegister() == -1)
        goto error;
291 292
#endif
#ifdef WITH_VMWARE
293 294
    if (vmwareRegister() == -1)
        goto error;
295 296
#endif
#ifdef WITH_PHYP
297 298
    if (phypRegister() == -1)
        goto error;
299 300
#endif
#ifdef WITH_ESX
301 302
    if (esxRegister() == -1)
        goto error;
303 304
#endif
#ifdef WITH_HYPERV
305 306
    if (hypervRegister() == -1)
        goto error;
307
#endif
308
#ifdef WITH_REMOTE
309
    if (remoteRegister() == -1)
310
        goto error;
311
#endif
D
Daniel P. Berrange 已提交
312

313 314
    return;

315
 error:
316 317 318
    virGlobalError = true;
}

319

320 321 322 323 324
/**
 * virInitialize:
 *
 * Initialize the library.
 *
325 326 327 328 329 330
 * This method is invoked automatically by any of the virConnectOpen() API
 * calls, and by virGetVersion(). Since release 1.0.0, there is no need to
 * call this method even in a multithreaded application, since
 * initialization is performed in a thread safe manner; but applications
 * using an older version of the library should manually call this before
 * setting up competing threads that attempt virConnectOpen in parallel.
331
 *
332 333 334 335 336
 * The only other time it would be necessary to call virInitialize is if the
 * application did not invoke virConnectOpen as its first API call, such
 * as when calling virEventRegisterImpl() before setting up connections,
 * or when using virSetErrorFunc() to alter error reporting of the first
 * connection attempt.
337 338 339 340 341 342 343 344 345 346 347
 *
 * Returns 0 in case of success, -1 in case of error
 */
int
virInitialize(void)
{
    if (virOnce(&virGlobalOnce, virGlobalInit) < 0)
        return -1;

    if (virGlobalError)
        return -1;
348
    return 0;
349 350
}

351

352 353
#ifdef WIN32
BOOL WINAPI
354
DllMain(HINSTANCE instance, DWORD reason, LPVOID ignore);
355 356

BOOL WINAPI
J
Ján Tomko 已提交
357
DllMain(HINSTANCE instance G_GNUC_UNUSED,
358
        DWORD reason,
J
Ján Tomko 已提交
359
        LPVOID ignore G_GNUC_UNUSED)
360 361 362 363 364 365 366 367
{
    switch (reason) {
    case DLL_PROCESS_ATTACH:
        virInitialize();
        break;

    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
368
        /* Nothing todo in libvirt yet */
369 370 371 372 373 374 375 376 377 378 379 380
        break;

    case DLL_PROCESS_DETACH:
        /* Don't bother releasing per-thread data
           since (hopefully) windows cleans up
           everything on process exit */
        break;
    }

    return TRUE;
}
#endif
381

382

383
/**
384
 * virSetSharedNetworkDriver:
385 386 387 388
 * @driver: pointer to a network driver block
 *
 * Register a network virtualization driver
 *
389
 * Returns 0 on success, or -1 in case of error.
390 391
 */
int
392
virSetSharedNetworkDriver(virNetworkDriverPtr driver)
393
{
394
    virCheckNonNullArgReturn(driver, -1);
395

396 397 398 399 400 401 402
    if (virSharedNetworkDriver) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("A network driver is already registered"));
        return -1;
    }

    VIR_DEBUG("registering %s as network driver", driver->name);
403

404 405
    virSharedNetworkDriver = driver;
    return 0;
406 407
}

408

D
Daniel Veillard 已提交
409
/**
410
 * virSetSharedInterfaceDriver:
L
Laine Stump 已提交
411
 * @driver: pointer to an interface driver block
D
Daniel Veillard 已提交
412
 *
L
Laine Stump 已提交
413
 * Register an interface virtualization driver
D
Daniel Veillard 已提交
414 415 416 417
 *
 * Returns the driver priority or -1 in case of error.
 */
int
418
virSetSharedInterfaceDriver(virInterfaceDriverPtr driver)
D
Daniel Veillard 已提交
419
{
420
    virCheckNonNullArgReturn(driver, -1);
D
Daniel Veillard 已提交
421

422 423 424 425 426
    if (virSharedInterfaceDriver) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("A interface driver is already registered"));
        return -1;
    }
D
Daniel Veillard 已提交
427

428 429 430 431
    VIR_DEBUG("registering %s as interface driver", driver->name);

    virSharedInterfaceDriver = driver;
    return 0;
D
Daniel Veillard 已提交
432 433
}

434

435
/**
436
 * virSetSharedStorageDriver:
437 438 439 440 441 442 443
 * @driver: pointer to a storage driver block
 *
 * Register a storage virtualization driver
 *
 * Returns the driver priority or -1 in case of error.
 */
int
444
virSetSharedStorageDriver(virStorageDriverPtr driver)
445
{
446
    virCheckNonNullArgReturn(driver, -1);
447

448 449 450 451 452 453 454
    if (virSharedStorageDriver) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("A storage driver is already registered"));
        return -1;
    }

    VIR_DEBUG("registering %s as storage driver", driver->name);
455

456 457
    virSharedStorageDriver = driver;
    return 0;
458 459
}

460

461
/**
462
 * virSetSharedNodeDeviceDriver:
463 464 465 466 467 468 469
 * @driver: pointer to a device monitor block
 *
 * Register a device monitor
 *
 * Returns the driver priority or -1 in case of error.
 */
int
470
virSetSharedNodeDeviceDriver(virNodeDeviceDriverPtr driver)
471
{
472
    virCheckNonNullArgReturn(driver, -1);
473

474 475 476 477 478
    if (virSharedNodeDeviceDriver) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("A node device driver is already registered"));
        return -1;
    }
479

480 481 482 483
    VIR_DEBUG("registering %s as device driver", driver->name);

    virSharedNodeDeviceDriver = driver;
    return 0;
484 485
}

486

487
/**
488
 * virSetSharedSecretDriver:
489 490 491 492 493 494 495
 * @driver: pointer to a secret driver block
 *
 * Register a secret driver
 *
 * Returns the driver priority or -1 in case of error.
 */
int
496
virSetSharedSecretDriver(virSecretDriverPtr driver)
497
{
498
    virCheckNonNullArgReturn(driver, -1);
499

500 501 502 503 504 505 506
    if (virSharedSecretDriver) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("A secret driver is already registered"));
        return -1;
    }

    VIR_DEBUG("registering %s as secret driver", driver->name);
507

508 509
    virSharedSecretDriver = driver;
    return 0;
510 511
}

512

S
Stefan Berger 已提交
513
/**
514
 * virSetSharedNWFilterDriver:
S
Stefan Berger 已提交
515 516 517 518 519 520 521
 * @driver: pointer to a network filter driver block
 *
 * Register a network filter virtualization driver
 *
 * Returns the driver priority or -1 in case of error.
 */
int
522
virSetSharedNWFilterDriver(virNWFilterDriverPtr driver)
S
Stefan Berger 已提交
523
{
524
    virCheckNonNullArgReturn(driver, -1);
S
Stefan Berger 已提交
525

526 527 528 529 530
    if (virSharedNWFilterDriver) {
        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                       _("A network filter driver is already registered"));
        return -1;
    }
S
Stefan Berger 已提交
531

532 533 534 535
    VIR_DEBUG("registering %s as network filter driver", driver->name);

    virSharedNWFilterDriver = driver;
    return 0;
S
Stefan Berger 已提交
536 537 538
}


539
/**
540
 * virRegisterConnectDriver:
541
 * @driver: pointer to a driver block
542
 * @setSharedDrivers: populate shared drivers
543
 *
544 545
 * Register a virtualization driver, optionally filling in
 * any empty pointers for shared secondary drivers
546 547 548 549
 *
 * Returns the driver priority or -1 in case of error.
 */
int
550 551
virRegisterConnectDriver(virConnectDriverPtr driver,
                         bool setSharedDrivers)
552
{
553
    VIR_DEBUG("driver=%p name=%s", driver,
554
              driver ? NULLSTR(driver->hypervisorDriver->name) : "(null)");
555

556
    virCheckNonNullArgReturn(driver, -1);
557 558 559 560 561 562
    if (virConnectDriverTabCount >= MAX_DRIVERS) {
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("Too many drivers, cannot register %s"),
                       driver->hypervisorDriver->name);
        return -1;
    }
563

564
    VIR_DEBUG("registering %s as driver %d",
565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
           driver->hypervisorDriver->name, virConnectDriverTabCount);

    if (setSharedDrivers) {
        if (driver->interfaceDriver == NULL)
            driver->interfaceDriver = virSharedInterfaceDriver;
        if (driver->networkDriver == NULL)
            driver->networkDriver = virSharedNetworkDriver;
        if (driver->nodeDeviceDriver == NULL)
            driver->nodeDeviceDriver = virSharedNodeDeviceDriver;
        if (driver->nwfilterDriver == NULL)
            driver->nwfilterDriver = virSharedNWFilterDriver;
        if (driver->secretDriver == NULL)
            driver->secretDriver = virSharedSecretDriver;
        if (driver->storageDriver == NULL)
            driver->storageDriver = virSharedStorageDriver;
    }
581

582 583
    virConnectDriverTab[virConnectDriverTabCount] = driver;
    return virConnectDriverTabCount++;
584 585
}

586

587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613
/**
 * virHasDriverForURIScheme:
 * @scheme: the URI scheme
 *
 * Determine if there is a driver registered that explicitly
 * handles URIs with the scheme @scheme.
 *
 * Returns: true if a driver is registered
 */
bool
virHasDriverForURIScheme(const char *scheme)
{
    size_t i;
    size_t j;

    for (i = 0; i < virConnectDriverTabCount; i++) {
        if (!virConnectDriverTab[i]->uriSchemes)
            continue;
        for (j = 0; virConnectDriverTab[i]->uriSchemes[j]; j++) {
            if (STREQ(virConnectDriverTab[i]->uriSchemes[j], scheme))
                return true;
        }
    }

    return false;
}

614 615 616 617 618 619 620 621 622 623 624
/**
 * virRegisterStateDriver:
 * @driver: pointer to a driver block
 *
 * Register a virtualization driver
 *
 * Returns the driver priority or -1 in case of error.
 */
int
virRegisterStateDriver(virStateDriverPtr driver)
{
625
    virCheckNonNullArgReturn(driver, -1);
626 627 628 629 630 631 632

    if (virStateDriverTabCount >= MAX_DRIVERS) {
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("Too many drivers, cannot register %s"),
                       driver->name);
        return -1;
    }
633 634 635 636 637

    virStateDriverTab[virStateDriverTabCount] = driver;
    return virStateDriverTabCount++;
}

638

639 640
/**
 * virStateInitialize:
641
 * @privileged: set to true if running with root privilege, false otherwise
642
 * @mandatory: set to true if all drivers must report success, not skipped
643 644
 * @callback: callback to invoke to inhibit shutdown of the daemon
 * @opaque: data to pass to @callback
645
 *
646
 * Initialize all virtualization drivers.
647
 *
648
 * Returns 0 if all succeed, -1 upon any failure.
649
 */
650 651
int
virStateInitialize(bool privileged,
652
                   bool mandatory,
653 654
                   virStateInhibitCallback callback,
                   void *opaque)
655
{
656
    size_t i;
657 658 659 660

    if (virInitialize() < 0)
        return -1;

661
    for (i = 0; i < virStateDriverTabCount; i++) {
662
        if (virStateDriverTab[i]->stateInitialize) {
663
            virDrvStateInitResult ret;
664
            VIR_DEBUG("Running global init for %s state driver",
665
                      virStateDriverTab[i]->name);
666 667 668 669 670
            ret = virStateDriverTab[i]->stateInitialize(privileged,
                                                        callback,
                                                        opaque);
            VIR_DEBUG("State init result %d (mandatory=%d)", ret, mandatory);
            if (ret == VIR_DRV_STATE_INIT_ERROR) {
671 672
                VIR_ERROR(_("Initialization of %s state driver failed: %s"),
                          virStateDriverTab[i]->name,
673
                          virGetLastErrorMessage());
674
                return -1;
675 676 677 678
            } else if (ret == VIR_DRV_STATE_INIT_SKIPPED && mandatory) {
                VIR_ERROR(_("Initialization of mandatory %s state driver skipped"),
                          virStateDriverTab[i]->name);
                return -1;
679
            }
680
        }
681
    }
682
    return 0;
683 684
}

685

686 687 688 689 690
/**
 * virStateCleanup:
 *
 * Run each virtualization driver's cleanup method.
 *
691
 * Returns 0 if all succeed, -1 upon any failure.
692
 */
693 694 695
int
virStateCleanup(void)
{
696
    int r;
697
    int ret = 0;
698

699 700 701
    for (r = virStateDriverTabCount - 1; r >= 0; r--) {
        if (virStateDriverTab[r]->stateCleanup &&
            virStateDriverTab[r]->stateCleanup() < 0)
702 703 704 705 706
            ret = -1;
    }
    return ret;
}

707

708 709 710 711 712
/**
 * virStateReload:
 *
 * Run each virtualization driver's reload method.
 *
713
 * Returns 0 if all succeed, -1 upon any failure.
714
 */
715 716 717
int
virStateReload(void)
{
718 719
    size_t i;
    int ret = 0;
720

721
    for (i = 0; i < virStateDriverTabCount; i++) {
722 723
        if (virStateDriverTab[i]->stateReload &&
            virStateDriverTab[i]->stateReload() < 0)
724 725 726 727 728
            ret = -1;
    }
    return ret;
}

729

730 731 732 733 734 735 736
/**
 * virStateStop:
 *
 * Run each virtualization driver's "stop" method.
 *
 * Returns 0 if successful, -1 on failure
 */
737 738 739
int
virStateStop(void)
{
740 741
    size_t i;
    int ret = 0;
742

743
    for (i = 0; i < virStateDriverTabCount; i++) {
744 745
        if (virStateDriverTab[i]->stateStop &&
            virStateDriverTab[i]->stateStop())
746 747 748 749
            ret = 1;
    }
    return ret;
}
750 751


752 753 754
/**
 * virGetVersion:
 * @libVer: return value for the library version (OUT)
755 756 757 758 759 760 761 762 763 764
 * @type: ignored; pass NULL
 * @typeVer: pass NULL; for historical purposes duplicates @libVer if
 * non-NULL
 *
 * Provides version information. @libVer is the version of the
 * library and will always be set unless an error occurs, in which case
 * an error code will be returned. @typeVer exists for historical
 * compatibility; if it is not NULL it will duplicate @libVer (it was
 * originally intended to return hypervisor information based on @type,
 * but due to the design of remote clients this is not reliable). To
765
 * get the version of the running hypervisor use the virConnectGetVersion()
766
 * function instead. To get the libvirt library version used by a
767 768 769
 * connection use the virConnectGetLibVersion() instead.
 *
 * This function includes a call to virInitialize() when necessary.
770 771 772 773 774
 *
 * Returns -1 in case of failure, 0 otherwise, and values for @libVer and
 *       @typeVer have the format major * 1,000,000 + minor * 1,000 + release.
 */
int
J
Ján Tomko 已提交
775
virGetVersion(unsigned long *libVer, const char *type G_GNUC_UNUSED,
776 777
              unsigned long *typeVer)
{
778 779
    if (virInitialize() < 0)
        goto error;
780
    VIR_DEBUG("libVir=%p, type=%s, typeVer=%p", libVer, type, typeVer);
781

782
    virResetLastError();
783
    if (libVer == NULL)
784
        goto error;
785 786
    *libVer = LIBVIR_VERSION_NUMBER;

787
    if (typeVer != NULL)
788 789
        *typeVer = LIBVIR_VERSION_NUMBER;

790
    return 0;
791

792
 error:
793 794
    virDispatchError(NULL);
    return -1;
795 796
}

797 798 799

static int
virConnectGetDefaultURI(virConfPtr conf,
800
                        char **name)
801 802
{
    int ret = -1;
803
    const char *defname = getenv("LIBVIRT_DEFAULT_URI");
804 805
    if (defname && *defname) {
        VIR_DEBUG("Using LIBVIRT_DEFAULT_URI '%s'", defname);
806
        if (VIR_STRDUP(*name, defname) < 0)
807
            goto cleanup;
808 809 810 811 812 813
    } else {
        if (virConfGetValueString(conf, "uri_default", name) < 0)
            goto cleanup;

        if (*name)
            VIR_DEBUG("Using config file uri '%s'", *name);
814 815 816
    }

    ret = 0;
817
 cleanup:
818 819 820
    return ret;
}

821

822 823 824 825 826 827 828
/*
 * Check to see if an invalid URI like qemu://system (missing /) was passed,
 * offer the suggested fix.
 */
static int
virConnectCheckURIMissingSlash(const char *uristr, virURIPtr uri)
{
829
    if (!uri->path || !uri->server)
830 831
        return 0;

832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850
    /* To avoid false positives, only check drivers that mandate
       a path component in the URI, like /system or /session */
    if (STRNEQ(uri->scheme, "qemu") &&
        STRNEQ(uri->scheme, "vbox") &&
        STRNEQ(uri->scheme, "vz"))
        return 0;

    if (STREQ(uri->server, "session") ||
        STREQ(uri->server, "system")) {
        virReportError(VIR_ERR_INTERNAL_ERROR,
                       _("invalid URI %s (maybe you want %s:///%s)"),
                       uristr, uri->scheme, uri->server);
        return -1;
    }

    return 0;
}


851
static virConnectPtr
852 853 854
virConnectOpenInternal(const char *name,
                       virConnectAuthPtr auth,
                       unsigned int flags)
855
{
856 857
    size_t i;
    int res;
858
    virConnectPtr ret;
859
    VIR_AUTOPTR(virConf) conf = NULL;
860
    char *uristr = NULL;
861 862 863 864

    ret = virGetConnect();
    if (ret == NULL)
        return NULL;
865

866
    if (virConfLoadConfig(&conf, "libvirt.conf") < 0)
867 868 869 870 871
        goto failed;

    if (name && name[0] == '\0')
        name = NULL;

872
    /* Convert xen -> xen:///system for back compat */
873
    if (name && STRCASEEQ(name, "xen"))
874
        name = "xen:///system";
875

876
    /* Convert xen:// -> xen:///system because xmlParseURI cannot parse the
877 878 879
     * former.  This allows URIs such as xen://localhost to work.
     */
    if (name && STREQ(name, "xen://"))
880
        name = "xen:///system";
881

882
    /*
E
Eric Blake 已提交
883 884 885
     * If no URI is passed, then check for an environment string if not
     * available probe the compiled in drivers to find a default hypervisor
     * if detectable.
886
     */
887
    if (name) {
888 889 890 891 892
        if (VIR_STRDUP(uristr, name) < 0)
            goto failed;
    } else {
        if (virConnectGetDefaultURI(conf, &uristr) < 0)
            goto failed;
893 894 895 896 897 898 899 900 901

        if (uristr == NULL) {
            VIR_DEBUG("Trying to probe for default URI");
            for (i = 0; i < virConnectDriverTabCount && uristr == NULL; i++) {
                if (virConnectDriverTab[i]->hypervisorDriver->connectURIProbe) {
                    if (virConnectDriverTab[i]->hypervisorDriver->connectURIProbe(&uristr) < 0)
                        goto failed;
                    VIR_DEBUG("%s driver URI probe returned '%s'",
                              virConnectDriverTab[i]->hypervisorDriver->name,
902
                              NULLSTR(uristr));
903 904 905
                }
            }
        }
906
    }
907

908 909
    if (uristr) {
        char *alias = NULL;
910

911
        if (!(flags & VIR_CONNECT_NO_ALIASES) &&
912
            virURIResolveAlias(conf, uristr, &alias) < 0)
913 914
            goto failed;

915 916 917 918 919 920
        if (alias) {
            VIR_FREE(uristr);
            uristr = alias;
        }

        if (!(ret->uri = virURIParse(uristr))) {
921
            VIR_FREE(alias);
922 923
            goto failed;
        }
924

925 926 927 928 929 930
        /* Avoid need for drivers to worry about NULLs, as
         * no one needs to distinguish "" vs NULL */
        if (ret->uri->path == NULL &&
            VIR_STRDUP(ret->uri->path, "") < 0)
            goto failed;

931
        VIR_DEBUG("Split \"%s\" to URI components:\n"
932 933 934 935
                  "  scheme %s\n"
                  "  server %s\n"
                  "  user %s\n"
                  "  port %d\n"
J
Jiri Denemark 已提交
936
                  "  path %s",
937
                  uristr,
938
                  NULLSTR(ret->uri->scheme), NULLSTR(ret->uri->server),
939
                  NULLSTR(ret->uri->user), ret->uri->port,
940
                  ret->uri->path);
941

942 943 944 945 946 947 948
        if (ret->uri->scheme == NULL) {
            virReportError(VIR_ERR_NO_CONNECT,
                           _("URI '%s' does not include a driver name"),
                           name);
            goto failed;
        }

949
        if (virConnectCheckURIMissingSlash(uristr,
950 951 952
                                           ret->uri) < 0) {
            goto failed;
        }
953
    } else {
954
        VIR_DEBUG("no name, allowing driver auto-select");
955 956
    }

957 958 959
    /* Cleansing flags */
    ret->flags = flags & VIR_CONNECT_RO;

960
    for (i = 0; i < virConnectDriverTabCount; i++) {
961 962 963 964 965 966 967
        /* We're going to probe the remote driver next. So we have already
         * probed all other client-side-only driver before, but none of them
         * accepted the URI.
         * If the scheme corresponds to a known but disabled client-side-only
         * driver then report a useful error, instead of a cryptic one about
         * not being able to connect to libvirtd or not being able to find
         * certificates. */
968
        if (STREQ(virConnectDriverTab[i]->hypervisorDriver->name, "remote") &&
969
            ret->uri != NULL &&
970 971 972 973 974
            (
#ifndef WITH_PHYP
             STRCASEEQ(ret->uri->scheme, "phyp") ||
#endif
#ifndef WITH_ESX
975
             STRCASEEQ(ret->uri->scheme, "vpx") ||
976 977
             STRCASEEQ(ret->uri->scheme, "esx") ||
             STRCASEEQ(ret->uri->scheme, "gsx") ||
M
Matthias Bolte 已提交
978 979 980
#endif
#ifndef WITH_HYPERV
             STRCASEEQ(ret->uri->scheme, "hyperv") ||
D
Dmitry Guryanov 已提交
981
#endif
982
#ifndef WITH_VZ
D
Dmitry Guryanov 已提交
983
             STRCASEEQ(ret->uri->scheme, "parallels") ||
984 985
#endif
             false)) {
986
            virReportErrorHelper(VIR_FROM_NONE, VIR_ERR_CONFIG_UNSUPPORTED,
987 988 989 990 991 992
                                 __FILE__, __FUNCTION__, __LINE__,
                                 _("libvirt was built without the '%s' driver"),
                                 ret->uri->scheme);
            goto failed;
        }

993 994 995
        VIR_DEBUG("trying driver %zu (%s) ...",
                  i, virConnectDriverTab[i]->hypervisorDriver->name);

996 997 998 999 1000
        if (virConnectDriverTab[i]->localOnly && ret->uri && ret->uri->server) {
            VIR_DEBUG("Server present, skipping local only driver");
            continue;
        }

1001
        /* Filter drivers based on declared URI schemes */
1002
        if (virConnectDriverTab[i]->uriSchemes) {
1003 1004
            bool matchScheme = false;
            size_t s;
1005 1006 1007 1008
            if (!ret->uri) {
                VIR_DEBUG("No URI, skipping driver with URI whitelist");
                continue;
            }
1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024
            VIR_DEBUG("Checking for supported URI schemes");
            for (s = 0; virConnectDriverTab[i]->uriSchemes[s] != NULL; s++) {
                if (STREQ(ret->uri->scheme, virConnectDriverTab[i]->uriSchemes[s])) {
                    VIR_DEBUG("Matched URI scheme '%s'", ret->uri->scheme);
                    matchScheme = true;
                    break;
                }
            }
            if (!matchScheme) {
                VIR_DEBUG("No matching URI scheme");
                continue;
            }
        } else {
            VIR_DEBUG("Matching any URI scheme for '%s'", ret->uri ? ret->uri->scheme : "");
        }

1025 1026 1027 1028 1029 1030 1031
        /* before starting the new connection, check if the driver only works
         * with a server, and so return an error if the server is missing */
        if (virConnectDriverTab[i]->remoteOnly && ret->uri && !ret->uri->server) {
            virReportError(VIR_ERR_INVALID_ARG, "%s", _("URI is missing the server part"));
            goto failed;
        }

1032 1033 1034 1035 1036 1037 1038 1039
        ret->driver = virConnectDriverTab[i]->hypervisorDriver;
        ret->interfaceDriver = virConnectDriverTab[i]->interfaceDriver;
        ret->networkDriver = virConnectDriverTab[i]->networkDriver;
        ret->nodeDeviceDriver = virConnectDriverTab[i]->nodeDeviceDriver;
        ret->nwfilterDriver = virConnectDriverTab[i]->nwfilterDriver;
        ret->secretDriver = virConnectDriverTab[i]->secretDriver;
        ret->storageDriver = virConnectDriverTab[i]->storageDriver;

1040
        res = virConnectDriverTab[i]->hypervisorDriver->connectOpen(ret, auth, conf, flags);
1041
        VIR_DEBUG("driver %zu %s returned %s",
1042
                  i, virConnectDriverTab[i]->hypervisorDriver->name,
O
Osier Yang 已提交
1043 1044 1045 1046 1047
                  res == VIR_DRV_OPEN_SUCCESS ? "SUCCESS" :
                  (res == VIR_DRV_OPEN_DECLINED ? "DECLINED" :
                  (res == VIR_DRV_OPEN_ERROR ? "ERROR" : "unknown status")));

        if (res == VIR_DRV_OPEN_SUCCESS) {
1048
            break;
1049 1050
        } else {
            ret->driver = NULL;
1051 1052 1053 1054 1055 1056 1057 1058 1059
            ret->interfaceDriver = NULL;
            ret->networkDriver = NULL;
            ret->nodeDeviceDriver = NULL;
            ret->nwfilterDriver = NULL;
            ret->secretDriver = NULL;
            ret->storageDriver = NULL;

            if (res == VIR_DRV_OPEN_ERROR)
                goto failed;
1060
        }
1061 1062
    }

1063
    if (!ret->driver) {
1064
        /* If we reach here, then all drivers declined the connection. */
1065
        virReportError(VIR_ERR_NO_CONNECT, "%s", NULLSTR(name));
1066
        goto failed;
1067 1068
    }

1069
    VIR_FREE(uristr);
1070

1071
    return ret;
1072

1073
 failed:
1074
    VIR_FREE(uristr);
1075
    virObjectUnref(ret);
1076

1077
    return NULL;
1078 1079
}

1080

1081 1082
/**
 * virConnectOpen:
1083
 * @name: (optional) URI of the hypervisor
1084
 *
1085
 * This function should be called first to get a connection to the
1086 1087
 * Hypervisor and xen store
 *
1088 1089 1090 1091 1092
 * If @name is NULL, if the LIBVIRT_DEFAULT_URI environment variable is set,
 * then it will be used. Otherwise if the client configuration file
 * has the "uri_default" parameter set, then it will be used. Finally
 * probing will be done to determine a suitable default driver to activate.
 * This involves trying each hypervisor in turn until one successfully opens.
1093 1094 1095 1096 1097 1098
 *
 * If connecting to an unprivileged hypervisor driver which requires
 * the libvirtd daemon to be active, it will automatically be launched
 * if not already running. This can be prevented by setting the
 * environment variable LIBVIRT_AUTOSTART=0
 *
C
Chen Hanxiao 已提交
1099
 * URIs are documented at https://libvirt.org/uri.html
E
Eric Blake 已提交
1100
 *
1101 1102 1103
 * virConnectClose should be used to release the resources after the connection
 * is no longer needed.
 *
E
Eric Blake 已提交
1104
 * Returns a pointer to the hypervisor connection or NULL in case of error
1105 1106
 */
virConnectPtr
1107
virConnectOpen(const char *name)
1108
{
1109
    virConnectPtr ret = NULL;
1110 1111 1112

    if (virInitialize() < 0)
        goto error;
1113

1114
    VIR_DEBUG("name=%s", NULLSTR(name));
1115
    virResetLastError();
1116
    ret = virConnectOpenInternal(name, NULL, 0);
1117 1118 1119 1120
    if (!ret)
        goto error;
    return ret;

1121
 error:
1122 1123
    virDispatchError(NULL);
    return NULL;
1124 1125
}

1126

1127
/**
1128
 * virConnectOpenReadOnly:
1129
 * @name: (optional) URI of the hypervisor
1130
 *
1131
 * This function should be called first to get a restricted connection to the
D
Daniel Veillard 已提交
1132
 * library functionalities. The set of APIs usable are then restricted
1133
 * on the available methods to control the domains.
1134
 *
1135
 * See virConnectOpen for notes about environment variables which can
1136
 * have an effect on opening drivers and freeing the connection resources
1137
 *
1138
 * URIs are documented at https://libvirt.org/uri.html
E
Eric Blake 已提交
1139 1140
 *
 * Returns a pointer to the hypervisor connection or NULL in case of error
1141
 */
1142
virConnectPtr
1143 1144
virConnectOpenReadOnly(const char *name)
{
1145
    virConnectPtr ret = NULL;
1146 1147 1148

    if (virInitialize() < 0)
        goto error;
1149

1150
    VIR_DEBUG("name=%s", NULLSTR(name));
1151
    virResetLastError();
1152
    ret = virConnectOpenInternal(name, NULL, VIR_CONNECT_RO);
1153 1154 1155 1156
    if (!ret)
        goto error;
    return ret;

1157
 error:
1158 1159
    virDispatchError(NULL);
    return NULL;
1160 1161
}

1162

1163 1164
/**
 * virConnectOpenAuth:
1165
 * @name: (optional) URI of the hypervisor
1166
 * @auth: Authenticate callback parameters
1167
 * @flags: bitwise-OR of virConnectFlags
1168
 *
1169
 * This function should be called first to get a connection to the
1170
 * Hypervisor. If necessary, authentication will be performed fetching
1171 1172
 * credentials via the callback
 *
1173
 * See virConnectOpen for notes about environment variables which can
1174
 * have an effect on opening drivers and freeing the connection resources
1175
 *
1176
 * URIs are documented at https://libvirt.org/uri.html
E
Eric Blake 已提交
1177 1178
 *
 * Returns a pointer to the hypervisor connection or NULL in case of error
1179 1180 1181 1182
 */
virConnectPtr
virConnectOpenAuth(const char *name,
                   virConnectAuthPtr auth,
1183
                   unsigned int flags)
1184
{
1185
    virConnectPtr ret = NULL;
1186 1187 1188

    if (virInitialize() < 0)
        goto error;
1189

1190
    VIR_DEBUG("name=%s, auth=%p, flags=0x%x", NULLSTR(name), auth, flags);
1191
    virResetLastError();
1192
    ret = virConnectOpenInternal(name, auth, flags);
1193 1194 1195 1196
    if (!ret)
        goto error;
    return ret;

1197
 error:
1198 1199
    virDispatchError(NULL);
    return NULL;
D
Daniel Veillard 已提交
1200 1201
}

1202

1203

D
Daniel Veillard 已提交
1204
/**
1205
 * virConnectClose:
D
Daniel Veillard 已提交
1206 1207 1208 1209 1210 1211 1212
 * @conn: pointer to the hypervisor connection
 *
 * This function closes the connection to the Hypervisor. This should
 * not be called if further interaction with the Hypervisor are needed
 * especially if there is running domain which need further monitoring by
 * the application.
 *
1213 1214 1215 1216 1217 1218 1219 1220
 * Connections are reference counted; the count is explicitly
 * increased by the initial open (virConnectOpen, virConnectOpenAuth,
 * and the like) as well as virConnectRef; it is also temporarily
 * increased by other API that depend on the connection remaining
 * alive.  The open and every virConnectRef call should have a
 * matching virConnectClose, and all other references will be released
 * after the corresponding operation completes.
 *
1221 1222 1223 1224 1225 1226 1227 1228 1229 1230
 * Returns a positive number if at least 1 reference remains on
 * success. The returned value should not be assumed to be the total
 * reference count. A return of 0 implies no references remain and
 * the connection is closed and memory has been freed. A return of -1
 * implies a failure.
 *
 * It is possible for the last virConnectClose to return a positive
 * value if some other object still has a temporary reference to the
 * connection, but the application should not try to further use a
 * connection after the virConnectClose that matches the initial open.
D
Daniel Veillard 已提交
1231 1232
 */
int
1233 1234
virConnectClose(virConnectPtr conn)
{
1235
    VIR_DEBUG("conn=%p", conn);
1236

1237 1238
    virResetLastError();

1239
    virCheckConnectReturn(conn, -1);
1240

1241 1242 1243
    if (!virObjectUnref(conn))
        return 0;
    return 1;
D
Daniel Veillard 已提交
1244 1245
}

1246

1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286
/* Helper function called to validate incoming client array on any
 * interface that sets typed parameters in the hypervisor.  */
int
virTypedParameterValidateSet(virConnectPtr conn,
                             virTypedParameterPtr params,
                             int nparams)
{
    bool string_okay;
    size_t i;

    string_okay = VIR_DRV_SUPPORTS_FEATURE(conn->driver,
                                           conn,
                                           VIR_DRV_FEATURE_TYPED_PARAM_STRING);
    for (i = 0; i < nparams; i++) {
        if (strnlen(params[i].field, VIR_TYPED_PARAM_FIELD_LENGTH) ==
            VIR_TYPED_PARAM_FIELD_LENGTH) {
            virReportInvalidArg(params,
                                _("string parameter name '%.*s' too long"),
                                VIR_TYPED_PARAM_FIELD_LENGTH,
                                params[i].field);
            return -1;
        }
        if (params[i].type == VIR_TYPED_PARAM_STRING) {
            if (string_okay) {
                if (!params[i].value.s) {
                    virReportInvalidArg(params,
                                        _("NULL string parameter '%s'"),
                                        params[i].field);
                    return -1;
                }
            } else {
                virReportInvalidArg(params,
                                    _("string parameter '%s' unsupported"),
                                    params[i].field);
                return -1;
            }
        }
    }
    return 0;
}