internal.h 8.9 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
#include <limits.h>

11 12 13 14
#ifdef HAVE_SYS_SYSLIMITS_H
#include <sys/syslimits.h>
#endif

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

#ifdef __cplusplus
extern "C" {
#endif

25 26 27 28 29 30 31 32 33 34 35 36 37
/* On architectures which lack these limits, define them (ie. Cygwin).
 * Note that the libvirt code should be robust enough to handle the
 * case where actual value is longer than these limits (eg. by setting
 * length correctly in second argument to gethostname and by always
 * using strncpy instead of strcpy).
 */
#ifndef HOST_NAME_MAX
#define HOST_NAME_MAX 256
#endif

#ifndef IF_NAMESIZE
#define IF_NAMESIZE 16
#endif
38

39
#define _(str) dgettext(GETTEXT_PACKAGE, (str))
40
#define N_(str) dgettext(GETTEXT_PACKAGE, (str))
41 42
#define gettext_noop(str) (str)

43 44 45
/* String equality tests, suggested by Jim Meyering. */
#define STREQ(a,b) (strcmp((a),(b)) == 0)
#define STRCASEEQ(a,b) (strcasecmp((a),(b)) == 0)
46 47
#define STRNEQ(a,b) (strcmp((a),(b)) != 0)
#define STRCASENEQ(a,b) (strcasecmp((a),(b)) != 0)
48 49
#define STREQLEN(a,b,n) (strncmp((a),(b),(n)) == 0)
#define STRNEQLEN(a,b,n) (strncmp((a),(b),(n)) != 0)
50

51
/* C99 uses __func__.  __FUNCTION__ is legacy. */
52
#ifndef __GNUC__
53
#define __FUNCTION__ __func__
54 55 56
#endif

#ifdef __GNUC__
D
Daniel Veillard 已提交
57 58 59 60 61
/**
 * ATTRIBUTE_UNUSED:
 *
 * Macro to flag conciously unused parameters to functions
 */
62
#ifndef ATTRIBUTE_UNUSED
63
#define ATTRIBUTE_UNUSED __attribute__((__unused__))
64
#endif
65 66 67 68 69 70 71 72 73

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

76 77 78
#else
#define ATTRIBUTE_UNUSED
#define ATTRIBUTE_FORMAT(...)
79
#endif				/* __GNUC__ */
80

D
Daniel Veillard 已提交
81 82 83 84 85 86 87 88 89
/**
 * TODO:
 *
 * macro to flag unimplemented blocks
 */
#define TODO 								\
    fprintf(stderr, "Unimplemented block at %s:%d\n",			\
            __FILE__, __LINE__);

90 91 92 93 94 95
/**
 * VIR_CONNECT_MAGIC:
 *
 * magic value used to protect the API when pointers to connection structures
 * are passed down by the uers.
 */
K
Karel Zak 已提交
96 97 98
#define VIR_CONNECT_MAGIC 	0x4F23DEAD
#define VIR_IS_CONNECT(obj)	((obj) && (obj)->magic==VIR_CONNECT_MAGIC)

99 100 101 102 103 104 105

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

110 111 112 113 114 115 116 117 118 119 120 121 122
/**
 * 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
 */
123
#define MAX_DRIVERS 10
124
#define MIN_XEN_GUEST_SIZE 64  /* 64 megabytes */
125

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

134
    int uses;               /* reference count */
135 136 137 138 139 140 141 142 143 144 145 146 147

    /* 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. */
148 149 150 151 152
    virError err;           /* the last error */
    virErrorFunc handler;   /* associated handlet */
    void *userData;         /* the user data */

    /* misc */
153
    xmlMutexPtr hashes_mux;/* a mutex to protect the domain and networks hash tables */
D
Daniel Veillard 已提交
154
    virHashTablePtr domains;/* hash table for known domains */
155
    virHashTablePtr networks;/* hash table for known domains */
156
    int flags;              /* a set of connection flags */
157
    char *name;                 /* connection URI */
158
};
159 160

/**
161 162 163 164 165
* _virDomain:
*
* Internal structure associated to a domain
*/
struct _virDomain {
166 167 168 169 170 171
    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 */
172
};
173

174 175 176 177 178 179 180 181 182 183 184 185 186
/**
* _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 */
};

187
/*
188 189 190 191 192 193
* Internal routines
*/
char *virDomainGetVM(virDomainPtr domain);
char *virDomainGetVMInfo(virDomainPtr domain,
			 const char *vm, const char *name);

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

212 213
/************************************************************************
 *									*
214
 *	API for domain/connections (de)allocations and lookups		*
215 216 217 218 219
 *									*
 ************************************************************************/

virConnectPtr	virGetConnect	(void);
int		virFreeConnect	(virConnectPtr conn);
220
virDomainPtr	__virGetDomain	(virConnectPtr conn,
221
				 const char *name,
222
				 const unsigned char *uuid);
223 224
int		virFreeDomain	(virConnectPtr conn,
				 virDomainPtr domain);
225
virNetworkPtr	__virGetNetwork	(virConnectPtr conn,
226 227 228 229
				 const char *name,
				 const unsigned char *uuid);
int		virFreeNetwork	(virConnectPtr conn,
				 virNetworkPtr domain);
230

231 232 233
#define virGetDomain(c,n,u) __virGetDomain((c),(n),(u))
#define virGetNetwork(c,n,u) __virGetNetwork((c),(n),(u))

234 235 236 237 238 239 240 241 242
int __virStateInitialize(void);
int __virStateCleanup(void);
int __virStateReload(void);
int __virStateActive(void);
#define virStateInitialize() __virStateInitialize()
#define virStateCleanup() __virStateCleanup()
#define virStateReload() __virStateReload()
#define virStateActive() __virStateActive()

243 244
int __virDrvSupportsFeature (virConnectPtr conn, int feature);

245 246 247 248
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);

249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
/* 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;
}

273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
/* 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;
}

292 293
#ifdef __cplusplus
}
294 295
#endif                          /* __cplusplus */
#endif                          /* __VIR_INTERNAL_H__ */
296 297 298 299 300 301 302 303 304 305 306 307 308 309

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