internal.h 9.0 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
#define STREQLEN(a,b,n) (strncmp((a),(b),(n)) == 0)
49
#define STRCASEEQLEN(a,b,n) (strncasecmp((a),(b),(n)) == 0)
50
#define STRNEQLEN(a,b,n) (strncmp((a),(b),(n)) != 0)
51
#define STRCASENEQLEN(a,b,n) (strncasecmp((a),(b),(n)) != 0)
52

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

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

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

78 79 80
#else
#define ATTRIBUTE_UNUSED
#define ATTRIBUTE_FORMAT(...)
81
#endif				/* __GNUC__ */
82

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

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

101 102 103 104 105 106 107

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

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

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

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

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

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

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

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

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

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

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

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

233 234 235
#define virGetDomain(c,n,u) __virGetDomain((c),(n),(u))
#define virGetNetwork(c,n,u) __virGetNetwork((c),(n),(u))

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

245 246
int __virDrvSupportsFeature (virConnectPtr conn, int feature);

247 248 249 250
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);

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

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

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

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