datatypes.h 13.8 KB
Newer Older
1 2 3
/*
 * datatypes.h: management of structs for public data types
 *
E
Eric Blake 已提交
4
 * Copyright (C) 2006-2008, 2010 Red Hat, Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 * 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
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 *
 */

#ifndef __VIRT_DATATYPES_H_
23
# define __VIRT_DATATYPES_H_
24

25
# include "internal.h"
26

27 28 29
# include "hash.h"
# include "driver.h"
# include "threads.h"
30 31 32 33 34 35 36

/**
 * VIR_CONNECT_MAGIC:
 *
 * magic value used to protect the API when pointers to connection structures
 * are passed down by the uers.
 */
E
Eric Blake 已提交
37
# define VIR_CONNECT_MAGIC	0x4F23DEAD
38
# define VIR_IS_CONNECT(obj)	((obj) && (obj)->magic==VIR_CONNECT_MAGIC)
39 40 41 42 43 44 45 46


/**
 * VIR_DOMAIN_MAGIC:
 *
 * magic value used to protect the API when pointers to domain structures
 * are passed down by the users.
 */
47 48 49
# define VIR_DOMAIN_MAGIC		0xDEAD4321
# define VIR_IS_DOMAIN(obj)		((obj) && (obj)->magic==VIR_DOMAIN_MAGIC)
# define VIR_IS_CONNECTED_DOMAIN(obj)	(VIR_IS_DOMAIN(obj) && VIR_IS_CONNECT((obj)->conn))
50 51 52 53 54 55 56

/**
 * VIR_NETWORK_MAGIC:
 *
 * magic value used to protect the API when pointers to network structures
 * are passed down by the users.
 */
57 58 59
# define VIR_NETWORK_MAGIC		0xDEAD1234
# define VIR_IS_NETWORK(obj)		((obj) && (obj)->magic==VIR_NETWORK_MAGIC)
# define VIR_IS_CONNECTED_NETWORK(obj)	(VIR_IS_NETWORK(obj) && VIR_IS_CONNECT((obj)->conn))
60

D
Daniel Veillard 已提交
61 62 63 64 65 66
/**
 * VIR_INTERFACE_MAGIC:
 *
 * magic value used to protect the API when pointers to interface structures
 * are passed down by the users.
 */
67 68 69
# define VIR_INTERFACE_MAGIC		0xDEAD5309
# define VIR_IS_INTERFACE(obj)		((obj) && (obj)->magic==VIR_INTERFACE_MAGIC)
# define VIR_IS_CONNECTED_INTERFACE(obj)	(VIR_IS_INTERFACE(obj) && VIR_IS_CONNECT((obj)->conn))
D
Daniel Veillard 已提交
70

71 72 73 74 75 76
/**
 * VIR_STORAGE_POOL_MAGIC:
 *
 * magic value used to protect the API when pointers to storage pool structures
 * are passed down by the users.
 */
77 78 79
# define VIR_STORAGE_POOL_MAGIC		0xDEAD5678
# define VIR_IS_STORAGE_POOL(obj)		((obj) && (obj)->magic==VIR_STORAGE_POOL_MAGIC)
# define VIR_IS_CONNECTED_STORAGE_POOL(obj)	(VIR_IS_STORAGE_POOL(obj) && VIR_IS_CONNECT((obj)->conn))
80 81 82 83 84 85 86

/**
 * VIR_STORAGE_VOL_MAGIC:
 *
 * magic value used to protect the API when pointers to storage vol structures
 * are passed down by the users.
 */
87 88 89
# define VIR_STORAGE_VOL_MAGIC		0xDEAD8765
# define VIR_IS_STORAGE_VOL(obj)		((obj) && (obj)->magic==VIR_STORAGE_VOL_MAGIC)
# define VIR_IS_CONNECTED_STORAGE_VOL(obj)	(VIR_IS_STORAGE_VOL(obj) && VIR_IS_CONNECT((obj)->conn))
90

91 92 93 94 95 96
/**
 * VIR_NODE_DEVICE_MAGIC:
 *
 * magic value used to protect the API when pointers to storage vol structures
 * are passed down by the users.
 */
97 98 99
# define VIR_NODE_DEVICE_MAGIC                   0xDEAD5679
# define VIR_IS_NODE_DEVICE(obj)                 ((obj) && (obj)->magic==VIR_NODE_DEVICE_MAGIC)
# define VIR_IS_CONNECTED_NODE_DEVICE(obj)       (VIR_IS_NODE_DEVICE(obj) && VIR_IS_CONNECT((obj)->conn))
100

101 102 103 104 105 106
/**
 * VIR_SECRET_MAGIC:
 *
 * magic value used to protect the API when pointers to secret structures are
 * passed down by the users.
 */
107 108 109
# define VIR_SECRET_MAGIC		0x5678DEAD
# define VIR_IS_SECRET(obj)		((obj) && (obj)->magic==VIR_SECRET_MAGIC)
# define VIR_IS_CONNECTED_SECRET(obj)	(VIR_IS_SECRET(obj) && VIR_IS_CONNECT((obj)->conn))
110

111

112 113 114 115 116 117
/**
 * VIR_STREAM_MAGIC:
 *
 * magic value used to protect the API when pointers to stream structures
 * are passed down by the users.
 */
118 119 120
# define VIR_STREAM_MAGIC                   0x1DEAD666
# define VIR_IS_STREAM(obj)                 ((obj) && (obj)->magic==VIR_STREAM_MAGIC)
# define VIR_IS_CONNECTED_STREAM(obj)       (VIR_IS_STREAM(obj) && VIR_IS_CONNECT((obj)->conn))
121 122


S
Stefan Berger 已提交
123 124 125 126 127 128
/**
 * VIR_NWFILTER_MAGIC:
 *
 * magic value used to protect the API when pointers to network filter
 * pool structures are passed down by the users.
 */
129 130 131
# define VIR_NWFILTER_MAGIC			0xDEAD7777
# define VIR_IS_NWFILTER(obj)			((obj) && (obj)->magic==VIR_NWFILTER_MAGIC)
# define VIR_IS_CONNECTED_NWFILTER(obj)		(VIR_IS_NWFILTER(obj) && VIR_IS_CONNECT((obj)->conn))
S
Stefan Berger 已提交
132

C
Chris Lalancette 已提交
133 134 135 136 137 138 139 140 141
/**
 * VIR_SNAPSHOT_MAGIC:
 *
 * magic value used to protect the API when pointers to snapshot structures
 * are passed down by the users.
 */
# define VIR_SNAPSHOT_MAGIC                0x6666DEAD
# define VIR_IS_SNAPSHOT(obj)              ((obj) && (obj)->magic==VIR_SNAPSHOT_MAGIC)
# define VIR_IS_DOMAIN_SNAPSHOT(obj)    (VIR_IS_SNAPSHOT(obj) && VIR_IS_DOMAIN((obj)->domain))
S
Stefan Berger 已提交
142

143 144 145 146 147 148
/**
 * _virConnect:
 *
 * Internal structure associated to a connection
 */
struct _virConnect {
149 150 151 152
    /* All the variables from here, until the 'lock' declaration
     * are setup at time of connection open, and never changed
     * since. Thus no need to lock when accessing them
     */
153 154
    unsigned int magic;     /* specific value to check */
    int flags;              /* a set of connection flags */
155
    xmlURIPtr uri;          /* connection URI */
156 157 158 159

    /* The underlying hypervisor driver and network driver. */
    virDriverPtr      driver;
    virNetworkDriverPtr networkDriver;
D
Daniel Veillard 已提交
160
    virInterfaceDriverPtr interfaceDriver;
161
    virStorageDriverPtr storageDriver;
162
    virDeviceMonitorPtr  deviceMonitor;
163
    virSecretDriverPtr secretDriver;
S
Stefan Berger 已提交
164
    virNWFilterDriverPtr nwfilterDriver;
165 166 167 168 169 170 171

    /* Private data pointer which can be used by driver and
     * network driver as they wish.
     * NB: 'private' is a reserved word in C++.
     */
    void *            privateData;
    void *            networkPrivateData;
D
Daniel Veillard 已提交
172
    void *            interfacePrivateData;
173
    void *            storagePrivateData;
174
    void *            devMonPrivateData;
175
    void *            secretPrivateData;
S
Stefan Berger 已提交
176
    void *            nwfilterPrivateData;
177 178 179 180 181 182 183

    /*
     * The lock mutex must be acquired before accessing/changing
     * any of members following this point, or changing the ref
     * count of any virDomain/virNetwork object associated with
     * this connection
     */
184
    virMutex lock;
185 186 187 188 189 190

    /* Per-connection error. */
    virError err;           /* the last error */
    virErrorFunc handler;   /* associated handlet */
    void *userData;         /* the user data */

191 192
    virHashTablePtr domains;  /* hash table for known domains */
    virHashTablePtr networks; /* hash table for known domains */
D
Daniel Veillard 已提交
193
    virHashTablePtr interfaces; /* hash table for known interfaces */
194 195
    virHashTablePtr storagePools;/* hash table for known storage pools */
    virHashTablePtr storageVols;/* hash table for known storage vols */
196
    virHashTablePtr nodeDevices; /* hash table for known node devices */
197
    virHashTablePtr secrets;  /* hash taboe for known secrets */
S
Stefan Berger 已提交
198
    virHashTablePtr nwfilterPools; /* hash tables ofr known nw filter pools */
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
    int refs;                 /* reference count */
};

/**
* _virDomain:
*
* Internal structure associated to a domain
*/
struct _virDomain {
    unsigned int magic;                  /* specific value to check */
    int refs;                            /* reference count */
    virConnectPtr conn;                  /* pointer back to the connection */
    char *name;                          /* the domain external name */
    int id;                              /* the domain ID */
    unsigned char uuid[VIR_UUID_BUFLEN]; /* the domain unique identifier */
C
Chris Lalancette 已提交
214
    virHashTablePtr snapshots; /* hash table for known snapshots */
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
};

/**
* _virNetwork:
*
* Internal structure associated to a domain
*/
struct _virNetwork {
    unsigned int magic;                  /* specific value to check */
    int refs;                            /* reference count */
    virConnectPtr conn;                  /* pointer back to the connection */
    char *name;                          /* the network external name */
    unsigned char uuid[VIR_UUID_BUFLEN]; /* the network unique identifier */
};

D
Daniel Veillard 已提交
230 231 232 233 234 235 236 237 238 239 240 241 242
/**
* _virInterface:
*
* Internal structure associated to a physical host interface
*/
struct _virInterface {
    unsigned int magic;                  /* specific value to check */
    int refs;                            /* reference count */
    virConnectPtr conn;                  /* pointer back to the connection */
    char *name;                          /* the network external name */
    char *mac;                           /* the interface MAC address */
};

243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
/**
* _virStoragePool:
*
* Internal structure associated to a storage pool
*/
struct _virStoragePool {
    unsigned int magic;                  /* specific value to check */
    int refs;                            /* reference count */
    virConnectPtr conn;                  /* pointer back to the connection */
    char *name;                          /* the storage pool external name */
    unsigned char uuid[VIR_UUID_BUFLEN]; /* the storage pool unique identifier */
};

/**
* _virStorageVol:
*
* Internal structure associated to a storage volume
*/
struct _virStorageVol {
    unsigned int magic;                  /* specific value to check */
    int refs;                            /* reference count */
    virConnectPtr conn;                  /* pointer back to the connection */
    char *pool;                          /* Pool name of owner */
    char *name;                          /* the storage vol external name */
    /* XXX currently abusing path for this. Ought not to be so evil */
    char key[PATH_MAX];                  /* unique key for storage vol */
};

271 272 273 274 275 276 277 278 279 280
/**
 * _virNodeDevice:
 *
 * Internal structure associated with a node device
 */
struct _virNodeDevice {
    unsigned int magic;                 /* specific value to check */
    int refs;                           /* reference count */
    virConnectPtr conn;                 /* pointer back to the connection */
    char *name;                         /* device name (unique on node) */
281
    char *parent;                       /* parent device name */
282 283
};

284 285 286 287 288 289 290 291 292
/**
 * _virSecret:
 *
 * Internal structure associated with a secret
 */
struct _virSecret {
    unsigned int magic;                  /* specific value to check */
    int refs;                            /* reference count */
    virConnectPtr conn;                  /* pointer back to the connection */
293
    unsigned char uuid[VIR_UUID_BUFLEN]; /* the domain unique identifier */
294 295
    int usageType;                       /* the type of usage */
    char *usageID;                       /* the usage's unique identifier */
296 297
};

298

299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
typedef int (*virStreamAbortFunc)(virStreamPtr, void *opaque);
typedef int (*virStreamFinishFunc)(virStreamPtr, void *opaque);

/**
 * _virStream:
 *
 * Internal structure associated with an input stream
 */
struct _virStream {
    unsigned int magic;
    virConnectPtr conn;
    int refs;
    int flags;

    virStreamDriverPtr driver;
    void *privateData;
};

C
Chris Lalancette 已提交
317 318 319 320 321 322 323 324 325 326 327
/**
 * _virDomainSnapshot
 *
 * Internal structure associated with a domain snapshot
 */
struct _virDomainSnapshot {
    unsigned int magic;
    int refs;
    char *name;
    virDomainPtr domain;
};
328

329 330 331 332 333 334 335 336
/************************************************************************
 *									*
 *	API for domain/connections (de)allocations and lookups		*
 *									*
 ************************************************************************/

virConnectPtr virGetConnect(void);
int virUnrefConnect(virConnectPtr conn);
D
Daniel P. Berrange 已提交
337
virDomainPtr virGetDomain(virConnectPtr conn,
338 339 340
                            const char *name,
                            const unsigned char *uuid);
int virUnrefDomain(virDomainPtr domain);
D
Daniel P. Berrange 已提交
341
virNetworkPtr virGetNetwork(virConnectPtr conn,
342 343 344 345
                              const char *name,
                              const unsigned char *uuid);
int virUnrefNetwork(virNetworkPtr network);

D
Daniel Veillard 已提交
346 347 348
virInterfacePtr virGetInterface(virConnectPtr conn,
                                const char *name,
                                const char *mac);
349
int virUnrefInterface(virInterfacePtr iface);
D
Daniel Veillard 已提交
350

D
Daniel P. Berrange 已提交
351
virStoragePoolPtr virGetStoragePool(virConnectPtr conn,
352 353 354
                                      const char *name,
                                      const unsigned char *uuid);
int virUnrefStoragePool(virStoragePoolPtr pool);
D
Daniel P. Berrange 已提交
355
virStorageVolPtr virGetStorageVol(virConnectPtr conn,
356 357 358 359 360
                                     const char *pool,
                                    const char *name,
                                    const char *key);
int virUnrefStorageVol(virStorageVolPtr vol);

361 362 363 364
virNodeDevicePtr virGetNodeDevice(virConnectPtr conn,
                                  const char *name);
int virUnrefNodeDevice(virNodeDevicePtr dev);

365
virSecretPtr virGetSecret(virConnectPtr conn,
366 367 368
                          const unsigned char *uuid,
                          int usageType,
                          const char *usageID);
369 370
int virUnrefSecret(virSecretPtr secret);

371 372 373
virStreamPtr virGetStream(virConnectPtr conn);
int virUnrefStream(virStreamPtr st);

S
Stefan Berger 已提交
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
/**
* _virNWFilter:
*
* Internal structure associated to a network filter
*/
struct _virNWFilter {
    unsigned int magic;                  /* specific value to check */
    int refs;                            /* reference count */
    virConnectPtr conn;                  /* pointer back to the connection */
    char *name;                          /* the network filter external name */
    unsigned char uuid[VIR_UUID_BUFLEN]; /* the network filter unique identifier */
};

virNWFilterPtr virGetNWFilter(virConnectPtr conn,
                                  const char *name,
                                  const unsigned char *uuid);
int virUnrefNWFilter(virNWFilterPtr pool);

C
Chris Lalancette 已提交
392 393 394 395
virDomainSnapshotPtr virGetDomainSnapshot(virDomainPtr domain,
                                          const char *name);
int virUnrefDomainSnapshot(virDomainSnapshotPtr pool);

396
#endif