datatypes.c 23.8 KB
Newer Older
1
/*
2
 * datatypes.c: management of structs for public data types
3
 *
4
 * Copyright (C) 2006-2015 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16
 *
 * 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
17
 * License along with this library.  If not, see
O
Osier Yang 已提交
18
 * <http://www.gnu.org/licenses/>.
19 20 21 22
 *
 */

#include <config.h>
D
Daniel P. Berrange 已提交
23
#include <unistd.h>
24 25

#include "datatypes.h"
26
#include "virerror.h"
27
#include "virlog.h"
28
#include "viralloc.h"
29
#include "viruuid.h"
30
#include "virstring.h"
31

32 33
#define VIR_FROM_THIS VIR_FROM_NONE

34 35
VIR_LOG_INIT("datatypes");

36
virClassPtr virConnectClass;
37
virClassPtr virConnectCloseCallbackDataClass;
38 39 40 41 42 43 44 45 46 47 48 49
virClassPtr virDomainClass;
virClassPtr virDomainSnapshotClass;
virClassPtr virInterfaceClass;
virClassPtr virNetworkClass;
virClassPtr virNodeDeviceClass;
virClassPtr virNWFilterClass;
virClassPtr virSecretClass;
virClassPtr virStreamClass;
virClassPtr virStorageVolClass;
virClassPtr virStoragePoolClass;

static void virConnectDispose(void *obj);
50
static void virConnectCloseCallbackDataDispose(void *obj);
51 52 53 54 55 56 57 58 59 60 61
static void virDomainDispose(void *obj);
static void virDomainSnapshotDispose(void *obj);
static void virInterfaceDispose(void *obj);
static void virNetworkDispose(void *obj);
static void virNodeDeviceDispose(void *obj);
static void virNWFilterDispose(void *obj);
static void virSecretDispose(void *obj);
static void virStreamDispose(void *obj);
static void virStorageVolDispose(void *obj);
static void virStoragePoolDispose(void *obj);

62 63
virClassPtr virAdmConnectClass;
virClassPtr virAdmConnectCloseCallbackDataClass;
M
Martin Kletzander 已提交
64

65 66
static void virAdmConnectDispose(void *obj);
static void virAdmConnectCloseCallbackDataDispose(void *obj);
M
Martin Kletzander 已提交
67

68 69 70
virClassPtr virAdmServerClass;
static void virAdmServerDispose(void *obj);

71 72 73
static int
virDataTypesOnceInit(void)
{
74 75
#define DECLARE_CLASS_COMMON(basename, parent)                   \
    if (!(basename ## Class = virClassNew(parent,                \
76
                                          #basename,             \
77 78 79
                                          sizeof(basename),      \
                                          basename ## Dispose))) \
        return -1;
80 81 82 83
#define DECLARE_CLASS(basename)                                  \
    DECLARE_CLASS_COMMON(basename, virClassForObject())
#define DECLARE_CLASS_LOCKABLE(basename)                         \
    DECLARE_CLASS_COMMON(basename, virClassForObjectLockable())
84

85
    DECLARE_CLASS_LOCKABLE(virConnect);
86
    DECLARE_CLASS_LOCKABLE(virConnectCloseCallbackData);
87 88 89 90 91 92 93 94 95 96 97
    DECLARE_CLASS(virDomain);
    DECLARE_CLASS(virDomainSnapshot);
    DECLARE_CLASS(virInterface);
    DECLARE_CLASS(virNetwork);
    DECLARE_CLASS(virNodeDevice);
    DECLARE_CLASS(virNWFilter);
    DECLARE_CLASS(virSecret);
    DECLARE_CLASS(virStream);
    DECLARE_CLASS(virStorageVol);
    DECLARE_CLASS(virStoragePool);

98 99
    DECLARE_CLASS_LOCKABLE(virAdmConnect);
    DECLARE_CLASS_LOCKABLE(virAdmConnectCloseCallbackData);
100
    DECLARE_CLASS(virAdmServer);
M
Martin Kletzander 已提交
101

102 103
#undef DECLARE_CLASS_COMMON
#undef DECLARE_CLASS_LOCKABLE
104 105 106 107 108 109
#undef DECLARE_CLASS

    return 0;
}

VIR_ONCE_GLOBAL_INIT(virDataTypes)
C
Chris Lalancette 已提交
110

111 112 113
/**
 * virGetConnect:
 *
M
Michael Chapman 已提交
114
 * Allocates a new hypervisor connection object.
115
 *
M
Michael Chapman 已提交
116
 * Returns a pointer to the connection object, or NULL on error.
117 118
 */
virConnectPtr
119 120
virGetConnect(void)
{
121 122
    virConnectPtr ret;

123 124 125
    if (virDataTypesInitialize() < 0)
        return NULL;

126
    if (!(ret = virObjectLockableNew(virConnectClass)))
127 128
        return NULL;

129
    if (!(ret->closeCallback = virObjectLockableNew(virConnectCloseCallbackDataClass)))
130 131
        goto error;

132
    return ret;
133

134
 error:
135 136
    virObjectUnref(ret);
    return NULL;
137 138 139
}

/**
140
 * virConnectDispose:
M
Michael Chapman 已提交
141
 * @obj: the hypervisor connection to release
142 143
 *
 * Unconditionally release all memory associated with a connection.
144
 * The connection object must not be used once this method returns.
145 146
 */
static void
147 148 149
virConnectDispose(void *obj)
{
    virConnectPtr conn = obj;
150 151

    if (conn->driver)
152
        conn->driver->connectClose(conn);
153

154 155
    virResetError(&conn->err);

156
    virURIFree(conn->uri);
157

158 159 160 161
    if (conn->closeCallback) {
        virObjectLock(conn->closeCallback);
        conn->closeCallback->callback = NULL;
        virObjectUnlock(conn->closeCallback);
162

163 164
        virObjectUnref(conn->closeCallback);
    }
165 166 167
}


168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
/**
 * virConnectCloseCallbackDataDispose:
 * @obj: the close callback data to release
 *
 * Release resources bound to the connection close callback.
 */
static void
virConnectCloseCallbackDataDispose(void *obj)
{
    virConnectCloseCallbackDataPtr cb = obj;

    virObjectLock(cb);

    if (cb->freeCallback)
        cb->freeCallback(cb->opaque);
183
    virObjectUnref(cb->conn);
184 185 186 187

    virObjectUnlock(cb);
}

188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
void virConnectCloseCallbackDataRegister(virConnectCloseCallbackDataPtr close,
                                         virConnectPtr conn,
                                         virConnectCloseFunc cb,
                                         void *opaque,
                                         virFreeCallback freecb)
{
    virObjectLock(close);

    if (close->callback != NULL) {
        VIR_WARN("Attempt to register callback on armed"
                 " close callback object %p", close);
        goto cleanup;
        return;
    }

    close->conn = conn;
    virObjectRef(close->conn);
    close->callback = cb;
    close->opaque = opaque;
    close->freeCallback = freecb;

 cleanup:

    virObjectUnlock(close);
}

void virConnectCloseCallbackDataUnregister(virConnectCloseCallbackDataPtr close,
                                           virConnectCloseFunc cb)
{
    virObjectLock(close);

    if (close->callback != cb) {
        VIR_WARN("Attempt to unregister different callback on "
                 " close callback object %p", close);
        goto cleanup;
    }

    close->callback = NULL;
    if (close->freeCallback)
        close->freeCallback(close->opaque);
    close->freeCallback = NULL;
    virObjectUnref(close->conn);
230
    close->conn = NULL;
231 232 233 234 235 236 237 238 239 240 241

 cleanup:

    virObjectUnlock(close);
}

void virConnectCloseCallbackDataCall(virConnectCloseCallbackDataPtr close,
                                     int reason)
{
    virObjectLock(close);

242
    if (!close->conn)
243 244 245 246 247 248 249 250 251
        goto exit;

    VIR_DEBUG("Triggering connection close callback %p reason=%d, opaque=%p",
              close->callback, reason, close->opaque);
    close->callback(close->conn, reason, close->opaque);

    if (close->freeCallback)
        close->freeCallback(close->opaque);
    close->freeCallback = NULL;
252 253
    virObjectUnref(close->conn);
    close->conn = NULL;
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269

 exit:
    virObjectUnlock(close);
}

virConnectCloseFunc
virConnectCloseCallbackDataGetCallback(virConnectCloseCallbackDataPtr close)
{
    virConnectCloseFunc cb;

    virObjectLock(close);
    cb = close->callback;
    virObjectUnlock(close);

    return cb;
}
270

271 272 273 274 275 276
/**
 * virGetDomain:
 * @conn: the hypervisor connection
 * @name: pointer to the domain name
 * @uuid: pointer to the uuid
 *
M
Michael Chapman 已提交
277 278
 * Allocates a new domain object. When the object is no longer needed,
 * virObjectUnref() must be called in order to not leak data.
279
 *
M
Michael Chapman 已提交
280
 * Returns a pointer to the domain object, or NULL on error.
281 282
 */
virDomainPtr
283 284
virGetDomain(virConnectPtr conn, const char *name, const unsigned char *uuid)
{
285 286
    virDomainPtr ret = NULL;

287 288 289
    if (virDataTypesInitialize() < 0)
        return NULL;

290 291 292
    virCheckConnectGoto(conn, error);
    virCheckNonNullArgGoto(name, error);
    virCheckNonNullArgGoto(uuid, error);
293

294
    if (!(ret = virObjectNew(virDomainClass)))
295
        goto error;
296

297 298
    if (VIR_STRDUP(ret->name, name) < 0)
        goto error;
299 300

    ret->conn = virObjectRef(conn);
301 302 303
    ret->id = -1;
    memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);

304
    return ret;
305

306
 error:
307
    virObjectUnref(ret);
308
    return NULL;
309 310 311
}

/**
312
 * virDomainDispose:
M
Michael Chapman 已提交
313
 * @obj: the domain to release
314 315
 *
 * Unconditionally release all memory associated with a domain.
316
 * The domain object must not be used once this method returns.
317 318 319 320 321
 *
 * It will also unreference the associated connection object,
 * which may also be released if its ref count hits zero.
 */
static void
322 323 324
virDomainDispose(void *obj)
{
    virDomainPtr domain = obj;
325
    char uuidstr[VIR_UUID_STRING_BUFLEN];
326

327
    virUUIDFormat(domain->uuid, uuidstr);
328
    VIR_DEBUG("release domain %p %s %s", domain, domain->name, uuidstr);
329

330
    VIR_FREE(domain->name);
331
    virObjectUnref(domain->conn);
332 333 334 335 336 337 338 339 340
}


/**
 * virGetNetwork:
 * @conn: the hypervisor connection
 * @name: pointer to the network name
 * @uuid: pointer to the uuid
 *
M
Michael Chapman 已提交
341 342
 * Allocates a new network object. When the object is no longer needed,
 * virObjectUnref() must be called in order to not leak data.
343
 *
M
Michael Chapman 已提交
344
 * Returns a pointer to the network object, or NULL on error.
345 346
 */
virNetworkPtr
347 348
virGetNetwork(virConnectPtr conn, const char *name, const unsigned char *uuid)
{
349 350
    virNetworkPtr ret = NULL;

351 352 353
    if (virDataTypesInitialize() < 0)
        return NULL;

354 355 356
    virCheckConnectGoto(conn, error);
    virCheckNonNullArgGoto(name, error);
    virCheckNonNullArgGoto(uuid, error);
357

358
    if (!(ret = virObjectNew(virNetworkClass)))
359
        goto error;
360

361 362
    if (VIR_STRDUP(ret->name, name) < 0)
        goto error;
363 364

    ret->conn = virObjectRef(conn);
365 366
    memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);

367
    return ret;
368

369
 error:
370
    virObjectUnref(ret);
371
    return NULL;
372 373 374
}

/**
375
 * virNetworkDispose:
M
Michael Chapman 已提交
376
 * @obj: the network to release
377 378
 *
 * Unconditionally release all memory associated with a network.
379
 * The network object must not be used once this method returns.
380 381 382 383 384
 *
 * It will also unreference the associated connection object,
 * which may also be released if its ref count hits zero.
 */
static void
385 386 387
virNetworkDispose(void *obj)
{
    virNetworkPtr network = obj;
388
    char uuidstr[VIR_UUID_STRING_BUFLEN];
389

390
    virUUIDFormat(network->uuid, uuidstr);
391
    VIR_DEBUG("release network %p %s %s", network, network->name, uuidstr);
392

393
    VIR_FREE(network->name);
394
    virObjectUnref(network->conn);
395 396 397
}


D
Daniel Veillard 已提交
398 399 400 401 402 403
/**
 * virGetInterface:
 * @conn: the hypervisor connection
 * @name: pointer to the interface name
 * @mac: pointer to the mac
 *
M
Michael Chapman 已提交
404 405
 * Allocates a new interface object. When the object is no longer needed,
 * virObjectUnref() must be called in order to not leak data.
D
Daniel Veillard 已提交
406
 *
M
Michael Chapman 已提交
407
 * Returns a pointer to the interface object, or NULL on error.
D
Daniel Veillard 已提交
408 409
 */
virInterfacePtr
410 411
virGetInterface(virConnectPtr conn, const char *name, const char *mac)
{
D
Daniel Veillard 已提交
412 413
    virInterfacePtr ret = NULL;

414 415 416
    if (virDataTypesInitialize() < 0)
        return NULL;

417 418
    virCheckConnectGoto(conn, error);
    virCheckNonNullArgGoto(name, error);
419 420 421 422 423

    /* a NULL mac from caller is okay. Treat it as blank */
    if (mac == NULL)
       mac = "";

424
    if (!(ret = virObjectNew(virInterfaceClass)))
425
        goto error;
D
Daniel Veillard 已提交
426

427 428 429
    if (VIR_STRDUP(ret->name, name) < 0 ||
        VIR_STRDUP(ret->mac, mac) < 0)
        goto error;
D
Daniel Veillard 已提交
430

431
    ret->conn = virObjectRef(conn);
D
Daniel Veillard 已提交
432

433
    return ret;
D
Daniel Veillard 已提交
434

435
 error:
436
    virObjectUnref(ret);
437
    return NULL;
D
Daniel Veillard 已提交
438 439 440
}

/**
441
 * virInterfaceDispose:
M
Michael Chapman 已提交
442
 * @obj: the interface to release
D
Daniel Veillard 已提交
443
 *
D
Dan Kenigsberg 已提交
444
 * Unconditionally release all memory associated with an interface.
445
 * The interface object must not be used once this method returns.
D
Daniel Veillard 已提交
446 447 448 449 450
 *
 * It will also unreference the associated connection object,
 * which may also be released if its ref count hits zero.
 */
static void
451 452 453
virInterfaceDispose(void *obj)
{
    virInterfacePtr iface = obj;
454
    VIR_DEBUG("release interface %p %s", iface, iface->name);
D
Daniel Veillard 已提交
455

456 457
    VIR_FREE(iface->name);
    VIR_FREE(iface->mac);
458
    virObjectUnref(iface->conn);
D
Daniel Veillard 已提交
459 460 461
}


462 463 464 465 466
/**
 * virGetStoragePool:
 * @conn: the hypervisor connection
 * @name: pointer to the storage pool name
 * @uuid: pointer to the uuid
467
 * @privateData: pointer to driver specific private data
M
Martin Kletzander 已提交
468
 * @freeFunc: private data cleanup function pointer specific to driver
469
 *
M
Michael Chapman 已提交
470 471
 * Allocates a new storage pool object. When the object is no longer needed,
 * virObjectUnref() must be called in order to not leak data.
472
 *
M
Michael Chapman 已提交
473
 * Returns a pointer to the storage pool object, or NULL on error.
474 475
 */
virStoragePoolPtr
476
virGetStoragePool(virConnectPtr conn, const char *name,
477 478
                  const unsigned char *uuid,
                  void *privateData, virFreeCallback freeFunc)
479
{
480 481
    virStoragePoolPtr ret = NULL;

482 483 484
    if (virDataTypesInitialize() < 0)
        return NULL;

485 486 487
    virCheckConnectGoto(conn, error);
    virCheckNonNullArgGoto(name, error);
    virCheckNonNullArgGoto(uuid, error);
488

489
    if (!(ret = virObjectNew(virStoragePoolClass)))
490
        goto error;
491

492 493
    if (VIR_STRDUP(ret->name, name) < 0)
        goto error;
494 495

    ret->conn = virObjectRef(conn);
496 497
    memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);

498 499 500 501
    /* set the driver specific data */
    ret->privateData = privateData;
    ret->privateDataFreeFunc = freeFunc;

502
    return ret;
503

504
 error:
505
    virObjectUnref(ret);
506
    return NULL;
507 508 509 510
}


/**
511
 * virStoragePoolDispose:
M
Michael Chapman 已提交
512
 * @obj: the storage pool to release
513 514
 *
 * Unconditionally release all memory associated with a pool.
515
 * The pool object must not be used once this method returns.
516 517 518 519 520
 *
 * It will also unreference the associated connection object,
 * which may also be released if its ref count hits zero.
 */
static void
521 522 523
virStoragePoolDispose(void *obj)
{
    virStoragePoolPtr pool = obj;
524
    char uuidstr[VIR_UUID_STRING_BUFLEN];
525

526
    virUUIDFormat(pool->uuid, uuidstr);
527
    VIR_DEBUG("release pool %p %s %s", pool, pool->name, uuidstr);
528

529
    if (pool->privateDataFreeFunc)
530 531
        pool->privateDataFreeFunc(pool->privateData);

532
    VIR_FREE(pool->name);
533
    virObjectUnref(pool->conn);
534 535 536 537 538 539 540 541
}


/**
 * virGetStorageVol:
 * @conn: the hypervisor connection
 * @pool: pool owning the volume
 * @name: pointer to the storage vol name
J
Jiri Denemark 已提交
542
 * @key: pointer to unique key of the volume
543
 * @privateData: pointer to driver specific private data
M
Martin Kletzander 已提交
544
 * @freeFunc: private data cleanup function pointer specific to driver
545
 *
M
Michael Chapman 已提交
546 547
 * Allocates a new storage volume object. When the object is no longer needed,
 * virObjectUnref() must be called in order to not leak data.
548
 *
M
Michael Chapman 已提交
549
 * Returns a pointer to the storage volume object, or NULL on error.
550 551
 */
virStorageVolPtr
552
virGetStorageVol(virConnectPtr conn, const char *pool, const char *name,
553
                 const char *key, void *privateData, virFreeCallback freeFunc)
554
{
555 556
    virStorageVolPtr ret = NULL;

557 558 559
    if (virDataTypesInitialize() < 0)
        return NULL;

560 561 562 563
    virCheckConnectGoto(conn, error);
    virCheckNonNullArgGoto(pool, error);
    virCheckNonNullArgGoto(name, error);
    virCheckNonNullArgGoto(key, error);
564

565
    if (!(ret = virObjectNew(virStorageVolClass)))
566
        goto error;
567

568 569 570 571
    if (VIR_STRDUP(ret->pool, pool) < 0 ||
        VIR_STRDUP(ret->name, name) < 0 ||
        VIR_STRDUP(ret->key, key) < 0)
        goto error;
572 573

    ret->conn = virObjectRef(conn);
574

575 576 577 578
    /* set driver specific data */
    ret->privateData = privateData;
    ret->privateDataFreeFunc = freeFunc;

579
    return ret;
580

581
 error:
582
    virObjectUnref(ret);
583
    return NULL;
584 585 586 587
}


/**
588
 * virStorageVolDispose:
M
Michael Chapman 已提交
589
 * @obj: the storage volume to release
590
 *
591 592
 * Unconditionally release all memory associated with a volume.
 * The volume object must not be used once this method returns.
593 594 595 596 597
 *
 * It will also unreference the associated connection object,
 * which may also be released if its ref count hits zero.
 */
static void
598 599 600
virStorageVolDispose(void *obj)
{
    virStorageVolPtr vol = obj;
601
    VIR_DEBUG("release vol %p %s", vol, vol->name);
602

603
    if (vol->privateDataFreeFunc)
604 605
        vol->privateDataFreeFunc(vol->privateData);

606
    VIR_FREE(vol->key);
607 608
    VIR_FREE(vol->name);
    VIR_FREE(vol->pool);
609
    virObjectUnref(vol->conn);
610
}
611 612 613 614 615 616 617


/**
 * virGetNodeDevice:
 * @conn: the hypervisor connection
 * @name: device name (unique on node)
 *
M
Michael Chapman 已提交
618 619
 * Allocates a new node device object. When the object is no longer needed,
 * virObjectUnref() must be called in order to not leak data.
620
 *
M
Michael Chapman 已提交
621
 * Returns a pointer to the node device object, or NULL on error.
622 623 624 625 626 627
 */
virNodeDevicePtr
virGetNodeDevice(virConnectPtr conn, const char *name)
{
    virNodeDevicePtr ret = NULL;

628 629 630
    if (virDataTypesInitialize() < 0)
        return NULL;

631 632
    virCheckConnectGoto(conn, error);
    virCheckNonNullArgGoto(name, error);
633

634
    if (!(ret = virObjectNew(virNodeDeviceClass)))
635
        goto error;
636

637 638
    if (VIR_STRDUP(ret->name, name) < 0)
        goto error;
639

640
    ret->conn = virObjectRef(conn);
641
    return ret;
642

643
 error:
644
    virObjectUnref(ret);
645
    return NULL;
646 647 648 649
}


/**
650
 * virNodeDeviceDispose:
M
Michael Chapman 已提交
651
 * @obj: the node device to release
652
 *
653 654
 * Unconditionally release all memory associated with a device.
 * The device object must not be used once this method returns.
655 656 657 658 659
 *
 * It will also unreference the associated connection object,
 * which may also be released if its ref count hits zero.
 */
static void
660 661 662
virNodeDeviceDispose(void *obj)
{
    virNodeDevicePtr dev = obj;
663
    VIR_DEBUG("release dev %p %s", dev, dev->name);
664 665

    VIR_FREE(dev->name);
666
    VIR_FREE(dev->parent);
667

668
    virObjectUnref(dev->conn);
669
}
670

671

672 673 674 675 676
/**
 * virGetSecret:
 * @conn: the hypervisor connection
 * @uuid: secret UUID
 *
M
Michael Chapman 已提交
677 678
 * Allocates a new secret object. When the object is no longer needed,
 * virObjectUnref() must be called in order to not leak data.
679
 *
M
Michael Chapman 已提交
680
 * Returns a pointer to the secret object, or NULL on error.
681 682
 */
virSecretPtr
683 684
virGetSecret(virConnectPtr conn, const unsigned char *uuid,
             int usageType, const char *usageID)
685 686 687
{
    virSecretPtr ret = NULL;

688 689 690
    if (virDataTypesInitialize() < 0)
        return NULL;

691 692 693
    virCheckConnectGoto(conn, error);
    virCheckNonNullArgGoto(uuid, error);
    virCheckNonNullArgGoto(usageID, error);
694

695 696
    if (!(ret = virObjectNew(virSecretClass)))
        return NULL;
697

698 699
    memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);
    ret->usageType = usageType;
700 701
    if (VIR_STRDUP(ret->usageID, usageID) < 0)
        goto error;
702

703 704 705
    ret->conn = virObjectRef(conn);

    return ret;
706

707
 error:
708
    virObjectUnref(ret);
709 710 711 712
    return NULL;
}

/**
713
 * virSecretDispose:
M
Michael Chapman 已提交
714
 * @obj: the secret to release
715
 *
716 717
 * Unconditionally release all memory associated with a secret.
 * The secret object must not be used once this method returns.
718
 *
719 720
 * It will also unreference the associated connection object,
 * which may also be released if its ref count hits zero.
721 722
 */
static void
723 724 725
virSecretDispose(void *obj)
{
    virSecretPtr secret = obj;
726
    char uuidstr[VIR_UUID_STRING_BUFLEN];
727

728
    virUUIDFormat(secret->uuid, uuidstr);
729
    VIR_DEBUG("release secret %p %s", secret, uuidstr);
J
Jiri Denemark 已提交
730

731
    VIR_FREE(secret->usageID);
732
    virObjectUnref(secret->conn);
733 734 735
}


M
Michael Chapman 已提交
736 737 738 739 740 741 742 743 744
/**
 * virGetStream:
 * @conn: the hypervisor connection
 *
 * Allocates a new stream object. When the object is no longer needed,
 * virObjectUnref() must be called in order to not leak data.
 *
 * Returns a pointer to the stream object, or NULL on error.
 */
745 746 747 748
virStreamPtr
virGetStream(virConnectPtr conn)
{
    virStreamPtr ret = NULL;
749

750 751
    if (virDataTypesInitialize() < 0)
        return NULL;
752

753 754
    if (!(ret = virObjectNew(virStreamClass)))
        return NULL;
755

756
    ret->conn = virObjectRef(conn);
757

758
    return ret;
759 760
}

M
Michael Chapman 已提交
761 762 763 764 765 766 767 768 769 770
/**
 * virStreamDispose:
 * @obj: the stream to release
 *
 * Unconditionally release all memory associated with a stream.
 * The stream object must not be used once this method returns.
 *
 * It will also unreference the associated connection object,
 * which may also be released if its ref count hits zero.
 */
771
static void
772 773 774
virStreamDispose(void *obj)
{
    virStreamPtr st = obj;
775
    VIR_DEBUG("release dev %p", st);
776

777
    virObjectUnref(st->conn);
778
}
S
Stefan Berger 已提交
779 780 781 782 783 784 785 786


/**
 * virGetNWFilter:
 * @conn: the hypervisor connection
 * @name: pointer to the network filter pool name
 * @uuid: pointer to the uuid
 *
M
Michael Chapman 已提交
787 788
 * Allocates a new network filter object. When the object is no longer needed,
 * virObjectUnref() must be called in order to not leak data.
S
Stefan Berger 已提交
789
 *
M
Michael Chapman 已提交
790
 * Returns a pointer to the network filter object, or NULL on error.
S
Stefan Berger 已提交
791 792
 */
virNWFilterPtr
793 794 795
virGetNWFilter(virConnectPtr conn, const char *name,
               const unsigned char *uuid)
{
S
Stefan Berger 已提交
796 797
    virNWFilterPtr ret = NULL;

798 799 800
    if (virDataTypesInitialize() < 0)
        return NULL;

801 802 803
    virCheckConnectGoto(conn, error);
    virCheckNonNullArgGoto(name, error);
    virCheckNonNullArgGoto(uuid, error);
804

805
    if (!(ret = virObjectNew(virNWFilterClass)))
806
        goto error;
807

808 809
    if (VIR_STRDUP(ret->name, name) < 0)
        goto error;
S
Stefan Berger 已提交
810

811 812
    memcpy(&(ret->uuid[0]), uuid, VIR_UUID_BUFLEN);

813
    ret->conn = virObjectRef(conn);
S
Stefan Berger 已提交
814

815
    return ret;
816

817
 error:
818
    virObjectUnref(ret);
819
    return NULL;
S
Stefan Berger 已提交
820 821 822 823
}


/**
824
 * virNWFilterDispose:
M
Michael Chapman 已提交
825
 * @obj: the network filter to release
S
Stefan Berger 已提交
826
 *
827
 * Unconditionally release all memory associated with a nwfilter.
828
 * The nwfilter object must not be used once this method returns.
S
Stefan Berger 已提交
829 830 831 832 833
 *
 * It will also unreference the associated connection object,
 * which may also be released if its ref count hits zero.
 */
static void
834
virNWFilterDispose(void *obj)
835
{
836
    virNWFilterPtr nwfilter = obj;
837
    char uuidstr[VIR_UUID_STRING_BUFLEN];
S
Stefan Berger 已提交
838

839
    virUUIDFormat(nwfilter->uuid, uuidstr);
840
    VIR_DEBUG("release nwfilter %p %s %s", nwfilter, nwfilter->name, uuidstr);
841

842
    VIR_FREE(nwfilter->name);
843
    virObjectUnref(nwfilter->conn);
S
Stefan Berger 已提交
844
}
C
Chris Lalancette 已提交
845 846


M
Michael Chapman 已提交
847 848 849 850 851 852 853 854 855 856
/**
 * virGetDomainSnapshot:
 * @domain: the domain to snapshot
 * @name: pointer to the domain snapshot name
 *
 * Allocates a new domain snapshot object. When the object is no longer needed,
 * virObjectUnref() must be called in order to not leak data.
 *
 * Returns a pointer to the domain snapshot object, or NULL on error.
 */
C
Chris Lalancette 已提交
857 858 859 860 861
virDomainSnapshotPtr
virGetDomainSnapshot(virDomainPtr domain, const char *name)
{
    virDomainSnapshotPtr ret = NULL;

862 863 864
    if (virDataTypesInitialize() < 0)
        return NULL;

865 866
    virCheckDomainGoto(domain, error);
    virCheckNonNullArgGoto(name, error);
867

868
    if (!(ret = virObjectNew(virDomainSnapshotClass)))
869
        goto error;
870
    if (VIR_STRDUP(ret->name, name) < 0)
871
        goto error;
872

873
    ret->domain = virObjectRef(domain);
874

875
    return ret;
876

877
 error:
878
    virObjectUnref(ret);
879
    return NULL;
C
Chris Lalancette 已提交
880 881 882
}


M
Michael Chapman 已提交
883 884 885 886 887 888 889 890 891 892
/**
 * virDomainSnapshotDispose:
 * @obj: the domain snapshot to release
 *
 * Unconditionally release all memory associated with a snapshot.
 * The snapshot object must not be used once this method returns.
 *
 * It will also unreference the associated connection object,
 * which may also be released if its ref count hits zero.
 */
C
Chris Lalancette 已提交
893
static void
894
virDomainSnapshotDispose(void *obj)
C
Chris Lalancette 已提交
895
{
896
    virDomainSnapshotPtr snapshot = obj;
897
    VIR_DEBUG("release snapshot %p %s", snapshot, snapshot->name);
C
Chris Lalancette 已提交
898 899

    VIR_FREE(snapshot->name);
900
    virObjectUnref(snapshot->domain);
C
Chris Lalancette 已提交
901
}
M
Martin Kletzander 已提交
902 903


904 905
virAdmConnectPtr
virAdmConnectNew(void)
M
Martin Kletzander 已提交
906
{
907
    virAdmConnectPtr ret;
M
Martin Kletzander 已提交
908 909 910 911

    if (virDataTypesInitialize() < 0)
        return NULL;

912
    if (!(ret = virObjectLockableNew(virAdmConnectClass)))
M
Martin Kletzander 已提交
913 914
        return NULL;

915
    if (!(ret->closeCallback = virObjectLockableNew(virAdmConnectCloseCallbackDataClass)))
916 917
        goto error;

M
Martin Kletzander 已提交
918
    return ret;
919 920 921 922

 error:
    virObjectUnref(ret);
    return NULL;
M
Martin Kletzander 已提交
923 924 925
}

static void
926
virAdmConnectDispose(void *obj)
M
Martin Kletzander 已提交
927
{
928
    virAdmConnectPtr conn = obj;
M
Martin Kletzander 已提交
929

930 931
    if (conn->privateDataFreeFunc)
        conn->privateDataFreeFunc(conn);
932

933 934
    virURIFree(conn->uri);
    virObjectUnref(conn->closeCallback);
935 936 937
}

static void
938
virAdmConnectCloseCallbackDataDispose(void *obj)
939
{
940
    virAdmConnectCloseCallbackDataPtr cb_data = obj;
941 942 943 944 945 946 947

    virObjectLock(cb_data);

    if (cb_data->freeCallback)
        cb_data->freeCallback(cb_data->opaque);

    virObjectUnlock(cb_data);
M
Martin Kletzander 已提交
948
}
949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979

virAdmServerPtr
virAdmGetServer(virAdmConnectPtr conn, const char *name)
{
    virAdmServerPtr ret = NULL;

    if (virDataTypesInitialize() < 0)
        goto error;

    if (!(ret = virObjectNew(virAdmServerClass)))
        goto error;
    if (VIR_STRDUP(ret->name, name) < 0)
        goto error;

    ret->conn = virObjectRef(conn);

    return ret;
 error:
    virObjectUnref(ret);
    return NULL;
}

static void
virAdmServerDispose(void *obj)
{
    virAdmServerPtr srv = obj;
    VIR_DEBUG("release server srv=%p name=%s", srv, srv->name);

    VIR_FREE(srv->name);
    virObjectUnref(srv->conn);
}