internal.h 8.6 KB
Newer Older
1 2 3 4
/*
 * internal.h: internal definitions just used by code from the library
 */

5 6
#ifndef __VIR_INTERNAL_H__
#define __VIR_INTERNAL_H__
7

8
#include <errno.h>
9 10 11 12 13
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
D
Daniel Veillard 已提交
14
#include <libxml/threads.h>
15

16
#include "hash.h"
17 18
#include "libvirt/libvirt.h"
#include "libvirt/virterror.h"
19
#include "driver.h"
20
#include <libintl.h>
21

22 23 24 25
#ifdef __cplusplus
extern "C" {
#endif

26
#define _(str) dgettext(GETTEXT_PACKAGE, (str))
27
#define N_(str) dgettext(GETTEXT_PACKAGE, (str))
28 29
#define gettext_noop(str) (str)

30 31 32
/* String equality tests, suggested by Jim Meyering. */
#define STREQ(a,b) (strcmp((a),(b)) == 0)
#define STRCASEEQ(a,b) (strcasecmp((a),(b)) == 0)
33 34
#define STRNEQ(a,b) (strcmp((a),(b)) != 0)
#define STRCASENEQ(a,b) (strcasecmp((a),(b)) != 0)
35 36
#define STREQLEN(a,b,n) (strncmp((a),(b),(n)) == 0)
#define STRNEQLEN(a,b,n) (strncmp((a),(b),(n)) != 0)
37

38 39 40 41 42 43 44 45 46
#ifndef __GNUC__
#define	__FUNCTION__	__func__
#endif

#ifdef __GNUC__
#ifdef HAVE_ANSIDECL_H
#include <ansidecl.h>
#endif

D
Daniel Veillard 已提交
47 48 49 50 51
/**
 * ATTRIBUTE_UNUSED:
 *
 * Macro to flag conciously unused parameters to functions
 */
52
#ifndef ATTRIBUTE_UNUSED
53
#define ATTRIBUTE_UNUSED __attribute__((__unused__))
54
#endif
55 56 57 58 59 60 61 62 63

/**
 * ATTRIBUTE_FORMAT
 *
 * Macro used to check printf/scanf-like functions, if compiling
 * with gcc.
 */
#ifndef ATTRIBUTE_FORMAT
#define ATTRIBUTE_FORMAT(args...) __attribute__((__format__ (args)))
64 65
#endif

66 67 68
#else
#define ATTRIBUTE_UNUSED
#define ATTRIBUTE_FORMAT(...)
69
#endif				/* __GNUC__ */
70

D
Daniel Veillard 已提交
71 72 73 74 75 76 77 78 79
/**
 * TODO:
 *
 * macro to flag unimplemented blocks
 */
#define TODO 								\
    fprintf(stderr, "Unimplemented block at %s:%d\n",			\
            __FILE__, __LINE__);

80 81 82 83 84 85
/**
 * VIR_CONNECT_MAGIC:
 *
 * magic value used to protect the API when pointers to connection structures
 * are passed down by the uers.
 */
K
Karel Zak 已提交
86 87 88
#define VIR_CONNECT_MAGIC 	0x4F23DEAD
#define VIR_IS_CONNECT(obj)	((obj) && (obj)->magic==VIR_CONNECT_MAGIC)

89 90 91 92 93 94 95

/**
 * VIR_DOMAIN_MAGIC:
 *
 * magic value used to protect the API when pointers to domain structures
 * are passed down by the uers.
 */
K
Karel Zak 已提交
96 97 98
#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))
99

100 101 102 103 104 105 106 107 108 109 110 111 112
/**
 * VIR_NETWORK_MAGIC:
 *
 * magic value used to protect the API when pointers to network structures
 * are passed down by the uers.
 */
#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))

/*
 * arbitrary limitations
 */
113
#define MAX_DRIVERS 10
114
#define MIN_XEN_GUEST_SIZE 64  /* 64 megabytes */
115

116 117 118 119 120 121 122 123 124 125
/*
 * Flags for Xen connections
 */
#define VIR_CONNECT_RO 1

/**
 * _virConnect:
 *
 * Internal structure associated to a connection
 */
126 127
struct _virConnect {
    unsigned int magic;     /* specific value to check */
128

129
    int uses;               /* reference count */
130 131 132 133 134 135 136 137 138 139 140 141 142

    /* The underlying hypervisor driver and network driver. */
    virDriverPtr      driver;
    virNetworkDriverPtr networkDriver;

    /* 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;

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

    /* misc */
148
    xmlMutexPtr hashes_mux;/* a mutex to protect the domain and networks hash tables */
D
Daniel Veillard 已提交
149
    virHashTablePtr domains;/* hash table for known domains */
150
    virHashTablePtr networks;/* hash table for known domains */
151 152
    int flags;              /* a set of connection flags */
};
153 154

/**
155 156 157 158 159
* _virDomain:
*
* Internal structure associated to a domain
*/
struct _virDomain {
160 161 162 163 164 165
    unsigned int magic;                  /* specific value to check */
    int uses;                            /* 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 */
166
};
167

168 169 170 171 172 173 174 175 176 177 178 179 180
/**
* _virNetwork:
*
* Internal structure associated to a domain
*/
struct _virNetwork {
    unsigned int magic;                  /* specific value to check */
    int uses;                            /* 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 */
};

181
/*
182 183 184 185 186 187
* Internal routines
*/
char *virDomainGetVM(virDomainPtr domain);
char *virDomainGetVMInfo(virDomainPtr domain,
			 const char *vm, const char *name);

188 189 190 191 192
/************************************************************************
 *									*
 *		API for error handling					*
 *									*
 ************************************************************************/
193 194
void __virRaiseError(virConnectPtr conn,
		     virDomainPtr dom,
195
		     virNetworkPtr net,
196 197 198 199 200 201
		     int domain,
		     int code,
		     virErrorLevel level,
		     const char *str1,
		     const char *str2,
		     const char *str3,
202 203
		     int int1, int int2, const char *msg, ...)
  ATTRIBUTE_FORMAT(printf, 12, 13);
204
const char *__virErrorMsg(virErrorNumber error, const char *info);
D
Daniel Veillard 已提交
205

206 207
/************************************************************************
 *									*
208
 *	API for domain/connections (de)allocations and lookups		*
209 210 211 212 213
 *									*
 ************************************************************************/

virConnectPtr	virGetConnect	(void);
int		virFreeConnect	(virConnectPtr conn);
214
virDomainPtr	__virGetDomain	(virConnectPtr conn,
215
				 const char *name,
216
				 const unsigned char *uuid);
217 218
int		virFreeDomain	(virConnectPtr conn,
				 virDomainPtr domain);
219
virNetworkPtr	__virGetNetwork	(virConnectPtr conn,
220 221 222 223
				 const char *name,
				 const unsigned char *uuid);
int		virFreeNetwork	(virConnectPtr conn,
				 virNetworkPtr domain);
224

225 226 227
#define virGetDomain(c,n,u) __virGetDomain((c),(n),(u))
#define virGetNetwork(c,n,u) __virGetNetwork((c),(n),(u))

228 229 230 231 232 233 234 235 236
int __virStateInitialize(void);
int __virStateCleanup(void);
int __virStateReload(void);
int __virStateActive(void);
#define virStateInitialize() __virStateInitialize()
#define virStateCleanup() __virStateCleanup()
#define virStateReload() __virStateReload()
#define virStateActive() __virStateActive()

237 238
int __virDrvSupportsFeature (virConnectPtr conn, int feature);

239 240 241 242
int __virDomainMigratePrepare (virConnectPtr dconn, char **cookie, int *cookielen, const char *uri_in, char **uri_out, unsigned long flags, const char *dname, unsigned long bandwidth);
int __virDomainMigratePerform (virDomainPtr domain, const char *cookie, int cookielen, const char *uri, unsigned long flags, const char *dname, unsigned long bandwidth);
virDomainPtr __virDomainMigrateFinish (virConnectPtr dconn, const char *dname, const char *cookie, int cookielen, const char *uri, unsigned long flags);

243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
/* Like strtol, but produce an "int" result, and check more carefully.
   Return 0 upon success;  return -1 to indicate failure.
   When END_PTR is NULL, the byte after the final valid digit must be NUL.
   Otherwise, it's like strtol and lets the caller check any suffix for
   validity.  This function is careful to return -1 when the string S
   represents a number that is not representable as an "int". */
static inline int
xstrtol_i(char const *s, char **end_ptr, int base, int *result)
{
    long int val;
    char *p;
    int err;

    errno = 0;
    val = strtol(s, &p, base);
    err = (errno || (!end_ptr && *p) || p == s || (int) val != val);
    if (end_ptr)
        *end_ptr = p;
    if (err)
        return -1;
    *result = val;
    return 0;
}

267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
/* Just like xstrtol_i, above, but produce an "unsigned int" value.  */
static inline int
xstrtol_ui(char const *s, char **end_ptr, int base, unsigned int *result)
{
    unsigned long int val;
    char *p;
    int err;

    errno = 0;
    val = strtoul(s, &p, base);
    err = (errno || (!end_ptr && *p) || p == s || (unsigned int) val != val);
    if (end_ptr)
        *end_ptr = p;
    if (err)
        return -1;
    *result = val;
    return 0;
}

286 287
#ifdef __cplusplus
}
288 289
#endif                          /* __cplusplus */
#endif                          /* __VIR_INTERNAL_H__ */
290 291 292 293 294 295 296 297 298 299 300 301 302 303

/*
 * vim: set tabstop=4:
 * vim: set shiftwidth=4:
 * vim: set expandtab:
 */
/*
 * Local variables:
 *  indent-tabs-mode: nil
 *  c-indent-level: 4
 *  c-basic-offset: 4
 *  tab-width: 4
 * End:
 */