提交 247cf7a3 编写于 作者: D Daniel Veillard

* src/hash.c src/hash.h src/internal.h src/libvirt.c src/sexpr.c

  src/sexpr.h src/virsh.c src/virterror.c src/xen_internal.c
  src/xen_internal.h src/xend_internal.c src/xend_internal.h
  src/xml.c src/xml.h: applied cb/indent to homogenize the source
  style, as a first pass.
Daniel
上级 cda69700
Wed Mar 15 13:10:25 CET 2006 Daniel Veillard <veillard@redhat.com>
* src/hash.c src/hash.h src/internal.h src/libvirt.c src/sexpr.c
src/sexpr.h src/virsh.c src/virterror.c src/xen_internal.c
src/xen_internal.h src/xend_internal.c src/xend_internal.h
src/xml.c src/xml.h: applied cb/indent to homogenize the source
style, as a first pass.
Fri Mar 10 11:07:58 CET 2006 Daniel Veillard <veillard@redhat.com> Fri Mar 10 11:07:58 CET 2006 Daniel Veillard <veillard@redhat.com>
* configure.in: applied patch for --with-xen-distdir option from * configure.in: applied patch for --with-xen-distdir option from
......
...@@ -53,15 +53,17 @@ struct _virHashTable { ...@@ -53,15 +53,17 @@ struct _virHashTable {
* Calculate the hash key * Calculate the hash key
*/ */
static unsigned long static unsigned long
virHashComputeKey(virHashTablePtr table, const char *name) { virHashComputeKey(virHashTablePtr table, const char *name)
{
unsigned long value = 0L; unsigned long value = 0L;
char ch; char ch;
if (name != NULL) { if (name != NULL) {
value += 30 * (*name); value += 30 * (*name);
while ((ch = *name++) != 0) { while ((ch = *name++) != 0) {
value = value ^ ((value << 5) + (value >> 3) + (unsigned long)ch); value =
} value ^ ((value << 5) + (value >> 3) + (unsigned long) ch);
}
} }
return (value % table->size); return (value % table->size);
} }
...@@ -75,24 +77,25 @@ virHashComputeKey(virHashTablePtr table, const char *name) { ...@@ -75,24 +77,25 @@ virHashComputeKey(virHashTablePtr table, const char *name) {
* Returns the newly created object, or NULL if an error occured. * Returns the newly created object, or NULL if an error occured.
*/ */
virHashTablePtr virHashTablePtr
virHashCreate(int size) { virHashCreate(int size)
{
virHashTablePtr table; virHashTablePtr table;
if (size <= 0) if (size <= 0)
size = 256; size = 256;
table = malloc(sizeof(virHashTable)); table = malloc(sizeof(virHashTable));
if (table) { if (table) {
table->size = size; table->size = size;
table->nbElems = 0; table->nbElems = 0;
table->table = malloc(size * sizeof(virHashEntry)); table->table = malloc(size * sizeof(virHashEntry));
if (table->table) { if (table->table) {
memset(table->table, 0, size * sizeof(virHashEntry)); memset(table->table, 0, size * sizeof(virHashEntry));
return(table); return (table);
} }
free(table); free(table);
} }
return(NULL); return (NULL);
} }
/** /**
...@@ -105,84 +108,87 @@ virHashCreate(int size) { ...@@ -105,84 +108,87 @@ virHashCreate(int size) {
* Returns 0 in case of success, -1 in case of failure * Returns 0 in case of success, -1 in case of failure
*/ */
static int static int
virHashGrow(virHashTablePtr table, int size) { virHashGrow(virHashTablePtr table, int size)
{
unsigned long key; unsigned long key;
int oldsize, i; int oldsize, i;
virHashEntryPtr iter, next; virHashEntryPtr iter, next;
struct _virHashEntry *oldtable; struct _virHashEntry *oldtable;
#ifdef DEBUG_GROW #ifdef DEBUG_GROW
unsigned long nbElem = 0; unsigned long nbElem = 0;
#endif #endif
if (table == NULL) if (table == NULL)
return(-1); return (-1);
if (size < 8) if (size < 8)
return(-1); return (-1);
if (size > 8 * 2048) if (size > 8 * 2048)
return(-1); return (-1);
oldsize = table->size; oldsize = table->size;
oldtable = table->table; oldtable = table->table;
if (oldtable == NULL) if (oldtable == NULL)
return(-1); return (-1);
table->table = malloc(size * sizeof(virHashEntry)); table->table = malloc(size * sizeof(virHashEntry));
if (table->table == NULL) { if (table->table == NULL) {
table->table = oldtable; table->table = oldtable;
return(-1); return (-1);
} }
memset(table->table, 0, size * sizeof(virHashEntry)); memset(table->table, 0, size * sizeof(virHashEntry));
table->size = size; table->size = size;
/* If the two loops are merged, there would be situations where /* If the two loops are merged, there would be situations where
a new entry needs to allocated and data copied into it from * a new entry needs to allocated and data copied into it from
the main table. So instead, we run through the array twice, first * the main table. So instead, we run through the array twice, first
copying all the elements in the main array (where we can't get * copying all the elements in the main array (where we can't get
conflicts) and then the rest, so we only free (and don't allocate) * conflicts) and then the rest, so we only free (and don't allocate)
*/ */
for (i = 0; i < oldsize; i++) { for (i = 0; i < oldsize; i++) {
if (oldtable[i].valid == 0) if (oldtable[i].valid == 0)
continue; continue;
key = virHashComputeKey(table, oldtable[i].name); key = virHashComputeKey(table, oldtable[i].name);
memcpy(&(table->table[key]), &(oldtable[i]), sizeof(virHashEntry)); memcpy(&(table->table[key]), &(oldtable[i]), sizeof(virHashEntry));
table->table[key].next = NULL; table->table[key].next = NULL;
} }
for (i = 0; i < oldsize; i++) { for (i = 0; i < oldsize; i++) {
iter = oldtable[i].next; iter = oldtable[i].next;
while (iter) { while (iter) {
next = iter->next; next = iter->next;
/* /*
* put back the entry in the new table * put back the entry in the new table
*/ */
key = virHashComputeKey(table, iter->name); key = virHashComputeKey(table, iter->name);
if (table->table[key].valid == 0) { if (table->table[key].valid == 0) {
memcpy(&(table->table[key]), iter, sizeof(virHashEntry)); memcpy(&(table->table[key]), iter, sizeof(virHashEntry));
table->table[key].next = NULL; table->table[key].next = NULL;
free(iter); free(iter);
} else { } else {
iter->next = table->table[key].next; iter->next = table->table[key].next;
table->table[key].next = iter; table->table[key].next = iter;
} }
#ifdef DEBUG_GROW #ifdef DEBUG_GROW
nbElem++; nbElem++;
#endif #endif
iter = next; iter = next;
} }
} }
free(oldtable); free(oldtable);
#ifdef DEBUG_GROW #ifdef DEBUG_GROW
xmlGenericError(xmlGenericErrorContext, xmlGenericError(xmlGenericErrorContext,
"virHashGrow : from %d to %d, %d elems\n", oldsize, size, nbElem); "virHashGrow : from %d to %d, %d elems\n", oldsize,
size, nbElem);
#endif #endif
return(0); return (0);
} }
/** /**
...@@ -194,7 +200,8 @@ virHashGrow(virHashTablePtr table, int size) { ...@@ -194,7 +200,8 @@ virHashGrow(virHashTablePtr table, int size) {
* deallocated with @f if provided. * deallocated with @f if provided.
*/ */
void void
virHashFree(virHashTablePtr table, virHashDeallocator f) { virHashFree(virHashTablePtr table, virHashDeallocator f)
{
int i; int i;
virHashEntryPtr iter; virHashEntryPtr iter;
virHashEntryPtr next; virHashEntryPtr next;
...@@ -202,30 +209,30 @@ virHashFree(virHashTablePtr table, virHashDeallocator f) { ...@@ -202,30 +209,30 @@ virHashFree(virHashTablePtr table, virHashDeallocator f) {
int nbElems; int nbElems;
if (table == NULL) if (table == NULL)
return; return;
if (table->table) { if (table->table) {
nbElems = table->nbElems; nbElems = table->nbElems;
for(i = 0; (i < table->size) && (nbElems > 0); i++) { for (i = 0; (i < table->size) && (nbElems > 0); i++) {
iter = &(table->table[i]); iter = &(table->table[i]);
if (iter->valid == 0) if (iter->valid == 0)
continue; continue;
inside_table = 1; inside_table = 1;
while (iter) { while (iter) {
next = iter->next; next = iter->next;
if ((f != NULL) && (iter->payload != NULL)) if ((f != NULL) && (iter->payload != NULL))
f(iter->payload, iter->name); f(iter->payload, iter->name);
if (iter->name) if (iter->name)
free(iter->name); free(iter->name);
iter->payload = NULL; iter->payload = NULL;
if (!inside_table) if (!inside_table)
free(iter); free(iter);
nbElems--; nbElems--;
inside_table = 0; inside_table = 0;
iter = next; iter = next;
} }
inside_table = 0; inside_table = 0;
} }
free(table->table); free(table->table);
} }
free(table); free(table);
} }
...@@ -242,38 +249,38 @@ virHashFree(virHashTablePtr table, virHashDeallocator f) { ...@@ -242,38 +249,38 @@ virHashFree(virHashTablePtr table, virHashDeallocator f) {
* Returns 0 the addition succeeded and -1 in case of error. * Returns 0 the addition succeeded and -1 in case of error.
*/ */
int int
virHashAddEntry(virHashTablePtr table, const char *name, virHashAddEntry(virHashTablePtr table, const char *name, void *userdata)
void *userdata) { {
unsigned long key, len = 0; unsigned long key, len = 0;
virHashEntryPtr entry; virHashEntryPtr entry;
virHashEntryPtr insert; virHashEntryPtr insert;
if ((table == NULL) || (name == NULL)) if ((table == NULL) || (name == NULL))
return(-1); return (-1);
/* /*
* Check for duplicate and insertion location. * Check for duplicate and insertion location.
*/ */
key = virHashComputeKey(table, name); key = virHashComputeKey(table, name);
if (table->table[key].valid == 0) { if (table->table[key].valid == 0) {
insert = NULL; insert = NULL;
} else { } else {
for (insert = &(table->table[key]); insert->next != NULL; for (insert = &(table->table[key]); insert->next != NULL;
insert = insert->next) { insert = insert->next) {
if (!strcmp(insert->name, name)) if (!strcmp(insert->name, name))
return(-1); return (-1);
len++; len++;
} }
if (!strcmp(insert->name, name)) if (!strcmp(insert->name, name))
return(-1); return (-1);
} }
if (insert == NULL) { if (insert == NULL) {
entry = &(table->table[key]); entry = &(table->table[key]);
} else { } else {
entry = malloc(sizeof(virHashEntry)); entry = malloc(sizeof(virHashEntry));
if (entry == NULL) if (entry == NULL)
return(-1); return (-1);
} }
entry->name = strdup(name); entry->name = strdup(name);
...@@ -282,15 +289,15 @@ virHashAddEntry(virHashTablePtr table, const char *name, ...@@ -282,15 +289,15 @@ virHashAddEntry(virHashTablePtr table, const char *name,
entry->valid = 1; entry->valid = 1;
if (insert != NULL) if (insert != NULL)
insert->next = entry; insert->next = entry;
table->nbElems++; table->nbElems++;
if (len > MAX_HASH_LEN) if (len > MAX_HASH_LEN)
virHashGrow(table, MAX_HASH_LEN * table->size); virHashGrow(table, MAX_HASH_LEN * table->size);
return(0); return (0);
} }
/** /**
...@@ -308,44 +315,45 @@ virHashAddEntry(virHashTablePtr table, const char *name, ...@@ -308,44 +315,45 @@ virHashAddEntry(virHashTablePtr table, const char *name,
*/ */
int int
virHashUpdateEntry(virHashTablePtr table, const char *name, virHashUpdateEntry(virHashTablePtr table, const char *name,
void *userdata, virHashDeallocator f) { void *userdata, virHashDeallocator f)
{
unsigned long key; unsigned long key;
virHashEntryPtr entry; virHashEntryPtr entry;
virHashEntryPtr insert; virHashEntryPtr insert;
if ((table == NULL) || name == NULL) if ((table == NULL) || name == NULL)
return(-1); return (-1);
/* /*
* Check for duplicate and insertion location. * Check for duplicate and insertion location.
*/ */
key = virHashComputeKey(table, name); key = virHashComputeKey(table, name);
if (table->table[key].valid == 0) { if (table->table[key].valid == 0) {
insert = NULL; insert = NULL;
} else { } else {
for (insert = &(table->table[key]); insert->next != NULL; for (insert = &(table->table[key]); insert->next != NULL;
insert = insert->next) { insert = insert->next) {
if (!strcmp(insert->name, name)) { if (!strcmp(insert->name, name)) {
if (f) if (f)
f(insert->payload, insert->name); f(insert->payload, insert->name);
insert->payload = userdata; insert->payload = userdata;
return(0); return (0);
} }
} }
if (!strcmp(insert->name, name)) { if (!strcmp(insert->name, name)) {
if (f) if (f)
f(insert->payload, insert->name); f(insert->payload, insert->name);
insert->payload = userdata; insert->payload = userdata;
return(0); return (0);
} }
} }
if (insert == NULL) { if (insert == NULL) {
entry = &(table->table[key]); entry = &(table->table[key]);
} else { } else {
entry = malloc(sizeof(virHashEntry)); entry = malloc(sizeof(virHashEntry));
if (entry == NULL) if (entry == NULL)
return(-1); return (-1);
} }
entry->name = strdup(name); entry->name = strdup(name);
...@@ -356,9 +364,9 @@ virHashUpdateEntry(virHashTablePtr table, const char *name, ...@@ -356,9 +364,9 @@ virHashUpdateEntry(virHashTablePtr table, const char *name,
if (insert != NULL) { if (insert != NULL) {
insert->next = entry; insert->next = entry;
} }
return(0); return (0);
} }
/** /**
...@@ -371,22 +379,23 @@ virHashUpdateEntry(virHashTablePtr table, const char *name, ...@@ -371,22 +379,23 @@ virHashUpdateEntry(virHashTablePtr table, const char *name,
* Returns the a pointer to the userdata * Returns the a pointer to the userdata
*/ */
void * void *
virHashLookup(virHashTablePtr table, const char *name) { virHashLookup(virHashTablePtr table, const char *name)
{
unsigned long key; unsigned long key;
virHashEntryPtr entry; virHashEntryPtr entry;
if (table == NULL) if (table == NULL)
return(NULL); return (NULL);
if (name == NULL) if (name == NULL)
return(NULL); return (NULL);
key = virHashComputeKey(table, name); key = virHashComputeKey(table, name);
if (table->table[key].valid == 0) if (table->table[key].valid == 0)
return(NULL); return (NULL);
for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { for (entry = &(table->table[key]); entry != NULL; entry = entry->next) {
if (!strcmp(entry->name, name)) if (!strcmp(entry->name, name))
return(entry->payload); return (entry->payload);
} }
return(NULL); return (NULL);
} }
/** /**
...@@ -399,10 +408,11 @@ virHashLookup(virHashTablePtr table, const char *name) { ...@@ -399,10 +408,11 @@ virHashLookup(virHashTablePtr table, const char *name) {
* -1 in case of error * -1 in case of error
*/ */
int int
virHashSize(virHashTablePtr table) { virHashSize(virHashTablePtr table)
{
if (table == NULL) if (table == NULL)
return(-1); return (-1);
return(table->nbElems); return (table->nbElems);
} }
/** /**
...@@ -419,43 +429,45 @@ virHashSize(virHashTablePtr table) { ...@@ -419,43 +429,45 @@ virHashSize(virHashTablePtr table) {
*/ */
int int
virHashRemoveEntry(virHashTablePtr table, const char *name, virHashRemoveEntry(virHashTablePtr table, const char *name,
virHashDeallocator f) { virHashDeallocator f)
{
unsigned long key; unsigned long key;
virHashEntryPtr entry; virHashEntryPtr entry;
virHashEntryPtr prev = NULL; virHashEntryPtr prev = NULL;
if (table == NULL || name == NULL) if (table == NULL || name == NULL)
return(-1); return (-1);
key = virHashComputeKey(table, name); key = virHashComputeKey(table, name);
if (table->table[key].valid == 0) { if (table->table[key].valid == 0) {
return(-1); return (-1);
} else { } else {
for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { for (entry = &(table->table[key]); entry != NULL;
entry = entry->next) {
if (!strcmp(entry->name, name)) { if (!strcmp(entry->name, name)) {
if ((f != NULL) && (entry->payload != NULL)) if ((f != NULL) && (entry->payload != NULL))
f(entry->payload, entry->name); f(entry->payload, entry->name);
entry->payload = NULL; entry->payload = NULL;
if(entry->name) if (entry->name)
free(entry->name); free(entry->name);
if(prev) { if (prev) {
prev->next = entry->next; prev->next = entry->next;
free(entry); free(entry);
} else { } else {
if (entry->next == NULL) { if (entry->next == NULL) {
entry->valid = 0; entry->valid = 0;
} else { } else {
entry = entry->next; entry = entry->next;
memcpy(&(table->table[key]), entry, sizeof(virHashEntry)); memcpy(&(table->table[key]), entry,
free(entry); sizeof(virHashEntry));
} free(entry);
} }
}
table->nbElems--; table->nbElems--;
return(0); return (0);
} }
prev = entry; prev = entry;
} }
return(-1); return (-1);
} }
} }
...@@ -18,12 +18,13 @@ extern "C" { ...@@ -18,12 +18,13 @@ extern "C" {
/* /*
* The hash table. * The hash table.
*/ */
typedef struct _virHashTable virHashTable; typedef struct _virHashTable virHashTable;
typedef virHashTable *virHashTablePtr; typedef virHashTable *virHashTablePtr;
/* /*
* function types: * function types:
*/ */
/** /**
* virHashDeallocator: * virHashDeallocator:
* @payload: the data in the hash * @payload: the data in the hash
...@@ -31,41 +32,37 @@ typedef virHashTable *virHashTablePtr; ...@@ -31,41 +32,37 @@ typedef virHashTable *virHashTablePtr;
* *
* Callback to free data from a hash. * Callback to free data from a hash.
*/ */
typedef void (*virHashDeallocator)(void *payload, char *name); typedef void (*virHashDeallocator) (void *payload, char *name);
/* /*
* Constructor and destructor. * Constructor and destructor.
*/ */
virHashTablePtr virHashCreate (int size); virHashTablePtr virHashCreate(int size);
void void
virHashFree (virHashTablePtr table, virHashFree(virHashTablePtr table, virHashDeallocator f);
virHashDeallocator f); int virHashSize(virHashTablePtr table);
int virHashSize (virHashTablePtr table);
/* /*
* Add a new entry to the hash table. * Add a new entry to the hash table.
*/ */
int virHashAddEntry (virHashTablePtr table, int virHashAddEntry(virHashTablePtr table,
const char *name, const char *name, void *userdata);
void *userdata); int virHashUpdateEntry(virHashTablePtr table,
int virHashUpdateEntry(virHashTablePtr table, const char *name,
const char *name, void *userdata, virHashDeallocator f);
void *userdata,
virHashDeallocator f);
/* /*
* Remove an entry from the hash table. * Remove an entry from the hash table.
*/ */
int virHashRemoveEntry(virHashTablePtr table, int virHashRemoveEntry(virHashTablePtr table,
const char *name, const char *name, virHashDeallocator f);
virHashDeallocator f);
/* /*
* Retrieve the userdata. * Retrieve the userdata.
*/ */
void * virHashLookup (virHashTablePtr table, void *virHashLookup(virHashTablePtr table, const char *name);
const char *name);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* ! __VIR_HASH_H__ */ #endif /* ! __VIR_HASH_H__ */
...@@ -74,27 +74,27 @@ extern "C" { ...@@ -74,27 +74,27 @@ extern "C" {
* *
* Internal structure associated to a connection * Internal structure associated to a connection
*/ */
struct _virConnect { struct _virConnect {
unsigned int magic; /* specific value to check */ unsigned int magic; /* specific value to check */
int handle; /* internal handle used for hypercall */ int handle; /* internal handle used for hypercall */
struct xs_handle *xshandle; /* handle to talk to the xenstore */ struct xs_handle *xshandle; /* handle to talk to the xenstore */
/* connection to xend */ /* connection to xend */
int type; /* PF_UNIX or PF_INET */ int type; /* PF_UNIX or PF_INET */
int len; /* lenght of addr */ int len; /* lenght of addr */
struct sockaddr *addr; /* type of address used */ struct sockaddr *addr; /* type of address used */
struct sockaddr_un addr_un; /* the unix address */ struct sockaddr_un addr_un; /* the unix address */
struct sockaddr_in addr_in; /* the inet address */ struct sockaddr_in addr_in; /* the inet address */
/* error stuff */ /* error stuff */
virError err; /* the last error */ virError err; /* the last error */
virErrorFunc handler; /* associated handlet */ virErrorFunc handler; /* associated handlet */
void *userData; /* the user data */ void *userData; /* the user data */
/* misc */ /* misc */
virHashTablePtr domains; /* hash table for known domains */ virHashTablePtr domains; /* hash table for known domains */
int flags; /* a set of connection flags */ int flags; /* a set of connection flags */
}; };
/** /**
* virDomainFlags: * virDomainFlags:
...@@ -102,50 +102,44 @@ struct _virConnect { ...@@ -102,50 +102,44 @@ struct _virConnect {
* a set of special flag values associated to the domain * a set of special flag values associated to the domain
*/ */
enum { enum {
DOMAIN_IS_SHUTDOWN = (1 << 0) /* the domain is being shutdown */ DOMAIN_IS_SHUTDOWN = (1 << 0) /* the domain is being shutdown */
} virDomainFlags; } virDomainFlags;
/** /**
* _virDomain: * _virDomain:
* *
* Internal structure associated to a domain * Internal structure associated to a domain
*/ */
struct _virDomain { struct _virDomain {
unsigned int magic; /* specific value to check */ unsigned int magic; /* specific value to check */
virConnectPtr conn; /* pointer back to the connection */ virConnectPtr conn; /* pointer back to the connection */
char *name; /* the domain external name */ char *name; /* the domain external name */
char *path; /* the domain internal path */ char *path; /* the domain internal path */
int handle; /* internal handle for the dmonain ID */ int handle; /* internal handle for the dmonain ID */
int flags; /* extra flags */ int flags; /* extra flags */
unsigned char uuid[16]; /* the domain unique identifier */ unsigned char uuid[16]; /* the domain unique identifier */
}; };
/* /*
* Internal routines * Internal routines
*/ */
char * virDomainGetVM (virDomainPtr domain); char *virDomainGetVM(virDomainPtr domain);
char * virDomainGetVMInfo (virDomainPtr domain, char *virDomainGetVMInfo(virDomainPtr domain,
const char *vm, const char *vm, const char *name);
const char *name);
void __virRaiseError(virConnectPtr conn,
void __virRaiseError (virConnectPtr conn, virDomainPtr dom,
virDomainPtr dom, int domain,
int domain, int code,
int code, virErrorLevel level,
virErrorLevel level, const char *str1,
const char *str1, const char *str2,
const char *str2, const char *str3,
const char *str3, int int1, int int2, const char *msg, ...);
int int1, const char *__virErrorMsg(virErrorNumber error, const char *info);
int int2,
const char *msg,
...);
const char * __virErrorMsg (virErrorNumber error,
const char *info);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __VIR_INTERNAL_H__ */
#endif /* __VIR_INTERNAL_H__ */
此差异已折叠。
...@@ -30,9 +30,10 @@ ...@@ -30,9 +30,10 @@
* Handle an error in the S-Expression code * Handle an error in the S-Expression code
*/ */
static void static void
virSexprError(virErrorNumber error, const char *info) { virSexprError(virErrorNumber error, const char *info)
{
const char *errmsg; const char *errmsg;
if (error == VIR_ERR_OK) if (error == VIR_ERR_OK)
return; return;
...@@ -56,7 +57,7 @@ sexpr_new(void) ...@@ -56,7 +57,7 @@ sexpr_new(void)
ret = (struct sexpr *) malloc(sizeof(*ret)); ret = (struct sexpr *) malloc(sizeof(*ret));
if (ret == NULL) { if (ret == NULL) {
virSexprError(VIR_ERR_NO_MEMORY, "failed to allocate a node"); virSexprError(VIR_ERR_NO_MEMORY, "failed to allocate a node");
return(NULL); return (NULL);
} }
ret->kind = SEXPR_NIL; ret->kind = SEXPR_NIL;
return ret; return ret;
...@@ -193,11 +194,11 @@ struct sexpr * ...@@ -193,11 +194,11 @@ struct sexpr *
sexpr_append(struct sexpr *lst, struct sexpr *value) sexpr_append(struct sexpr *lst, struct sexpr *value)
{ {
if (lst == NULL) if (lst == NULL)
return(NULL); return (NULL);
if (value == NULL) if (value == NULL)
return(lst); return (lst);
append(lst, value); append(lst, value);
return(lst); return (lst);
} }
/** /**
...@@ -219,33 +220,34 @@ sexpr2string(struct sexpr * sexpr, char *buffer, size_t n_buffer) ...@@ -219,33 +220,34 @@ sexpr2string(struct sexpr * sexpr, char *buffer, size_t n_buffer)
size_t ret = 0, tmp; size_t ret = 0, tmp;
if ((sexpr == NULL) || (buffer == NULL) || (n_buffer <= 0)) if ((sexpr == NULL) || (buffer == NULL) || (n_buffer <= 0))
return(0); return (0);
switch (sexpr->kind) { switch (sexpr->kind) {
case SEXPR_CONS: case SEXPR_CONS:
tmp = snprintf(buffer + ret, n_buffer - ret, "("); tmp = snprintf(buffer + ret, n_buffer - ret, "(");
if (tmp == 0) if (tmp == 0)
goto error; goto error;
ret += tmp; ret += tmp;
tmp = sexpr2string(sexpr->car, buffer + ret, n_buffer - ret); tmp = sexpr2string(sexpr->car, buffer + ret, n_buffer - ret);
if (tmp == 0) if (tmp == 0)
goto error; goto error;
ret += tmp; ret += tmp;
while (sexpr->cdr->kind != SEXPR_NIL) { while (sexpr->cdr->kind != SEXPR_NIL) {
sexpr = sexpr->cdr; sexpr = sexpr->cdr;
tmp = snprintf(buffer + ret, n_buffer - ret, " "); tmp = snprintf(buffer + ret, n_buffer - ret, " ");
if (tmp == 0) if (tmp == 0)
goto error; goto error;
ret += tmp; ret += tmp;
tmp = sexpr2string(sexpr->car, buffer + ret, n_buffer - ret); tmp =
if (tmp == 0) sexpr2string(sexpr->car, buffer + ret, n_buffer - ret);
goto error; if (tmp == 0)
ret += tmp; goto error;
ret += tmp;
} }
tmp = snprintf(buffer + ret, n_buffer - ret, ")"); tmp = snprintf(buffer + ret, n_buffer - ret, ")");
if (tmp == 0) if (tmp == 0)
goto error; goto error;
ret += tmp; ret += tmp;
break; break;
case SEXPR_VALUE: case SEXPR_VALUE:
if (strchr(sexpr->value, ' ')) if (strchr(sexpr->value, ' '))
...@@ -254,21 +256,21 @@ sexpr2string(struct sexpr * sexpr, char *buffer, size_t n_buffer) ...@@ -254,21 +256,21 @@ sexpr2string(struct sexpr * sexpr, char *buffer, size_t n_buffer)
else else
tmp = snprintf(buffer + ret, n_buffer - ret, "%s", tmp = snprintf(buffer + ret, n_buffer - ret, "%s",
sexpr->value); sexpr->value);
if (tmp == 0) if (tmp == 0)
goto error; goto error;
ret += tmp; ret += tmp;
break; break;
case SEXPR_NIL: case SEXPR_NIL:
break; break;
default: default:
goto error; goto error;
} }
return(ret); return (ret);
error: error:
buffer[n_buffer - 1] = 0; buffer[n_buffer - 1] = 0;
virSexprError(VIR_ERR_SEXPR_SERIAL, buffer); virSexprError(VIR_ERR_SEXPR_SERIAL, buffer);
return(0); return (0);
} }
#define IS_SPACE(c) ((c == 0x20) || (c == 0x9) || (c == 0xD) || (c == 0xA)) #define IS_SPACE(c) ((c == 0x20) || (c == 0x9) || (c == 0xD) || (c == 0xA))
...@@ -278,7 +280,7 @@ trim(const char *string) ...@@ -278,7 +280,7 @@ trim(const char *string)
{ {
while (IS_SPACE(*string)) while (IS_SPACE(*string))
string++; string++;
return(string); return (string);
} }
/** /**
...@@ -345,9 +347,10 @@ _string2sexpr(const char *buffer, size_t * end) ...@@ -345,9 +347,10 @@ _string2sexpr(const char *buffer, size_t * end)
} }
ret->value = strndup(start, ptr - start); ret->value = strndup(start, ptr - start);
if (ret->value == NULL) { if (ret->value == NULL) {
virSexprError(VIR_ERR_NO_MEMORY, "failed to copy a string"); virSexprError(VIR_ERR_NO_MEMORY,
} "failed to copy a string");
}
if (*ptr == '\'') if (*ptr == '\'')
ptr++; ptr++;
...@@ -359,23 +362,24 @@ _string2sexpr(const char *buffer, size_t * end) ...@@ -359,23 +362,24 @@ _string2sexpr(const char *buffer, size_t * end)
} }
ret->value = strndup(start, ptr - start); ret->value = strndup(start, ptr - start);
if (ret->value == NULL) { if (ret->value == NULL) {
virSexprError(VIR_ERR_NO_MEMORY, "failed to copy a string"); virSexprError(VIR_ERR_NO_MEMORY,
} "failed to copy a string");
}
} }
ret->kind = SEXPR_VALUE; ret->kind = SEXPR_VALUE;
if (ret->value == NULL) if (ret->value == NULL)
goto error; goto error;
} }
*end = ptr - buffer; *end = ptr - buffer;
return ret; return ret;
error: error:
sexpr_free(ret); sexpr_free(ret);
return(NULL); return (NULL);
} }
/** /**
...@@ -415,7 +419,7 @@ sexpr_lookup(struct sexpr *sexpr, const char *node) ...@@ -415,7 +419,7 @@ sexpr_lookup(struct sexpr *sexpr, const char *node)
char buffer[4096], *ptr, *token; char buffer[4096], *ptr, *token;
if ((node == NULL) || (sexpr == NULL)) if ((node == NULL) || (sexpr == NULL))
return(NULL); return (NULL);
snprintf(buffer, sizeof(buffer), "%s", node); snprintf(buffer, sizeof(buffer), "%s", node);
...@@ -437,7 +441,7 @@ sexpr_lookup(struct sexpr *sexpr, const char *node) ...@@ -437,7 +441,7 @@ sexpr_lookup(struct sexpr *sexpr, const char *node)
continue; continue;
sexpr = sexpr->cdr; sexpr = sexpr->cdr;
for (i=sexpr; i->kind != SEXPR_NIL; i=i->cdr) { for (i = sexpr; i->kind != SEXPR_NIL; i = i->cdr) {
if (i->kind != SEXPR_CONS || if (i->kind != SEXPR_CONS ||
i->car->kind != SEXPR_CONS || i->car->kind != SEXPR_CONS ||
i->car->car->kind != SEXPR_VALUE) { i->car->car->kind != SEXPR_VALUE) {
......
...@@ -33,24 +33,17 @@ struct sexpr { ...@@ -33,24 +33,17 @@ struct sexpr {
}; };
/* conversion to/from strings */ /* conversion to/from strings */
size_t sexpr2string (struct sexpr *sexpr, size_t sexpr2string(struct sexpr *sexpr, char *buffer, size_t n_buffer);
char *buffer, struct sexpr *string2sexpr(const char *buffer);
size_t n_buffer);
struct sexpr * string2sexpr (const char *buffer);
/* constructors and destructors */ /* constructors and destructors */
struct sexpr * sexpr_nil (void); struct sexpr *sexpr_nil(void);
struct sexpr * sexpr_string (const char *str, struct sexpr *sexpr_string(const char *str, ssize_t len);
ssize_t len); struct sexpr *sexpr_cons(struct sexpr *car, struct sexpr *cdr);
struct sexpr * sexpr_cons (struct sexpr *car, struct sexpr *sexpr_append(struct sexpr *lst, struct sexpr *item);
struct sexpr *cdr); void sexpr_free(struct sexpr *sexpr);
struct sexpr * sexpr_append (struct sexpr *lst,
struct sexpr *item);
void sexpr_free (struct sexpr *sexpr);
/* lookup in S-Expressions */ /* lookup in S-Expressions */
const char * sexpr_node (struct sexpr *sexpr, const char *sexpr_node(struct sexpr *sexpr, const char *node);
const char *node); struct sexpr *sexpr_lookup(struct sexpr *sexpr, const char *node);
struct sexpr * sexpr_lookup (struct sexpr *sexpr,
const char *node);
#endif #endif
此差异已折叠。
此差异已折叠。
...@@ -23,8 +23,7 @@ ...@@ -23,8 +23,7 @@
#include <xen/xen.h> #include <xen/xen.h>
#ifndef __LINUX_PUBLIC_PRIVCMD_H__ #ifndef __LINUX_PUBLIC_PRIVCMD_H__
typedef struct hypercall_struct typedef struct hypercall_struct {
{
unsigned long op; unsigned long op;
unsigned long arg[5]; unsigned long arg[5];
} hypercall_t; } hypercall_t;
...@@ -45,16 +44,16 @@ typedef struct hypercall_struct ...@@ -45,16 +44,16 @@ typedef struct hypercall_struct
* Handle an error at the xend daemon interface * Handle an error at the xend daemon interface
*/ */
static void static void
virXenError(virErrorNumber error, const char *info, int value) { virXenError(virErrorNumber error, const char *info, int value)
{
const char *errmsg; const char *errmsg;
if (error == VIR_ERR_OK) if (error == VIR_ERR_OK)
return; return;
errmsg = __virErrorMsg(error, info); errmsg = __virErrorMsg(error, info);
__virRaiseError(NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR, __virRaiseError(NULL, NULL, VIR_FROM_XEN, error, VIR_ERR_ERROR,
errmsg, info, NULL, value, 0, errmsg, info, errmsg, info, NULL, value, 0, errmsg, info, value);
value);
} }
/** /**
...@@ -65,17 +64,19 @@ virXenError(virErrorNumber error, const char *info, int value) { ...@@ -65,17 +64,19 @@ virXenError(virErrorNumber error, const char *info, int value) {
* *
* Returns the handle or -1 in case of error. * Returns the handle or -1 in case of error.
*/ */
int xenHypervisorOpen(int quiet) { int
xenHypervisorOpen(int quiet)
{
int ret; int ret;
ret = open(XEN_HYPERVISOR_SOCKET, O_RDWR); ret = open(XEN_HYPERVISOR_SOCKET, O_RDWR);
if (ret < 0) { if (ret < 0) {
if (!quiet) if (!quiet)
virXenError(VIR_ERR_NO_XEN, XEN_HYPERVISOR_SOCKET, 0); virXenError(VIR_ERR_NO_XEN, XEN_HYPERVISOR_SOCKET, 0);
return(-1); return (-1);
} }
return(ret); return (ret);
} }
/** /**
...@@ -86,16 +87,18 @@ int xenHypervisorOpen(int quiet) { ...@@ -86,16 +87,18 @@ int xenHypervisorOpen(int quiet) {
* *
* Returns 0 in case of success or -1 in case of error. * Returns 0 in case of success or -1 in case of error.
*/ */
int xenHypervisorClose(int handle) { int
xenHypervisorClose(int handle)
{
int ret; int ret;
if (handle < 0) if (handle < 0)
return(-1); return (-1);
ret = close(handle); ret = close(handle);
if (ret < 0) if (ret < 0)
return(-1); return (-1);
return(0); return (0);
} }
/** /**
...@@ -108,18 +111,19 @@ int xenHypervisorClose(int handle) { ...@@ -108,18 +111,19 @@ int xenHypervisorClose(int handle) {
* Returns 0 in case of success and -1 in case of error. * Returns 0 in case of success and -1 in case of error.
*/ */
static int static int
xenHypervisorDoOp(int handle, dom0_op_t *op) { xenHypervisorDoOp(int handle, dom0_op_t * op)
{
int ret; int ret;
unsigned int cmd; unsigned int cmd;
hypercall_t hc; hypercall_t hc;
op->interface_version = DOM0_INTERFACE_VERSION; op->interface_version = DOM0_INTERFACE_VERSION;
hc.op = __HYPERVISOR_dom0_op; hc.op = __HYPERVISOR_dom0_op;
hc.arg[0] = (unsigned long)op; hc.arg[0] = (unsigned long) op;
if (mlock(op, sizeof(dom0_op_t)) < 0) { if (mlock(op, sizeof(dom0_op_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(dom0_op_t)); virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(dom0_op_t));
return(-1); return (-1);
} }
cmd = _IOC(_IOC_NONE, 'P', 0, sizeof(hc)); cmd = _IOC(_IOC_NONE, 'P', 0, sizeof(hc));
...@@ -134,9 +138,9 @@ xenHypervisorDoOp(int handle, dom0_op_t *op) { ...@@ -134,9 +138,9 @@ xenHypervisorDoOp(int handle, dom0_op_t *op) {
} }
if (ret < 0) if (ret < 0)
return(-1); return (-1);
return(0); return (0);
} }
/** /**
...@@ -148,13 +152,14 @@ xenHypervisorDoOp(int handle, dom0_op_t *op) { ...@@ -148,13 +152,14 @@ xenHypervisorDoOp(int handle, dom0_op_t *op) {
* Returns the hypervisor running version or 0 in case of error. * Returns the hypervisor running version or 0 in case of error.
*/ */
unsigned long unsigned long
xenHypervisorGetVersion(int handle) { xenHypervisorGetVersion(int handle)
{
int ret; int ret;
unsigned int cmd; unsigned int cmd;
hypercall_t hc; hypercall_t hc;
hc.op = __HYPERVISOR_xen_version; hc.op = __HYPERVISOR_xen_version;
hc.arg[0] = (unsigned long) XENVER_version; hc.arg[0] = (unsigned long) XENVER_version;
hc.arg[1] = 0; hc.arg[1] = 0;
cmd = _IOC(_IOC_NONE, 'P', 0, sizeof(hc)); cmd = _IOC(_IOC_NONE, 'P', 0, sizeof(hc));
...@@ -162,13 +167,13 @@ xenHypervisorGetVersion(int handle) { ...@@ -162,13 +167,13 @@ xenHypervisorGetVersion(int handle) {
if (ret < 0) { if (ret < 0) {
virXenError(VIR_ERR_XEN_CALL, " getting version ", XENVER_version); virXenError(VIR_ERR_XEN_CALL, " getting version ", XENVER_version);
return(0); return (0);
} }
/* /*
* use unsigned long in case the version grows behind expectations * use unsigned long in case the version grows behind expectations
* allowed by int * allowed by int
*/ */
return((unsigned long) ret); return ((unsigned long) ret);
} }
/** /**
...@@ -182,18 +187,21 @@ xenHypervisorGetVersion(int handle) { ...@@ -182,18 +187,21 @@ xenHypervisorGetVersion(int handle) {
* Returns 0 in case of success, -1 in case of error. * Returns 0 in case of success, -1 in case of error.
*/ */
int int
xenHypervisorGetDomainInfo(int handle, int domain, dom0_getdomaininfo_t *info) { xenHypervisorGetDomainInfo(int handle, int domain,
dom0_getdomaininfo_t * info)
{
dom0_op_t op; dom0_op_t op;
int ret; int ret;
if (info == NULL) if (info == NULL)
return(-1); return (-1);
memset(info, 0, sizeof(dom0_getdomaininfo_t)); memset(info, 0, sizeof(dom0_getdomaininfo_t));
if (mlock(info, sizeof(dom0_getdomaininfo_t)) < 0) { if (mlock(info, sizeof(dom0_getdomaininfo_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " locking", sizeof(dom0_getdomaininfo_t)); virXenError(VIR_ERR_XEN_CALL, " locking",
return(-1); sizeof(dom0_getdomaininfo_t));
return (-1);
} }
op.cmd = DOM0_GETDOMAININFOLIST; op.cmd = DOM0_GETDOMAININFOLIST;
...@@ -206,13 +214,14 @@ xenHypervisorGetDomainInfo(int handle, int domain, dom0_getdomaininfo_t *info) { ...@@ -206,13 +214,14 @@ xenHypervisorGetDomainInfo(int handle, int domain, dom0_getdomaininfo_t *info) {
ret = xenHypervisorDoOp(handle, &op); ret = xenHypervisorDoOp(handle, &op);
if (munlock(info, sizeof(dom0_getdomaininfo_t)) < 0) { if (munlock(info, sizeof(dom0_getdomaininfo_t)) < 0) {
virXenError(VIR_ERR_XEN_CALL, " release", sizeof(dom0_getdomaininfo_t)); virXenError(VIR_ERR_XEN_CALL, " release",
sizeof(dom0_getdomaininfo_t));
ret = -1; ret = -1;
} }
if (ret < 0) if (ret < 0)
return(-1); return (-1);
return(0); return (0);
} }
/** /**
...@@ -225,7 +234,8 @@ xenHypervisorGetDomainInfo(int handle, int domain, dom0_getdomaininfo_t *info) { ...@@ -225,7 +234,8 @@ xenHypervisorGetDomainInfo(int handle, int domain, dom0_getdomaininfo_t *info) {
* Returns 0 in case of success, -1 in case of error. * Returns 0 in case of success, -1 in case of error.
*/ */
int int
xenHypervisorPauseDomain(int handle, int domain) { xenHypervisorPauseDomain(int handle, int domain)
{
dom0_op_t op; dom0_op_t op;
int ret; int ret;
...@@ -235,8 +245,8 @@ xenHypervisorPauseDomain(int handle, int domain) { ...@@ -235,8 +245,8 @@ xenHypervisorPauseDomain(int handle, int domain) {
ret = xenHypervisorDoOp(handle, &op); ret = xenHypervisorDoOp(handle, &op);
if (ret < 0) if (ret < 0)
return(-1); return (-1);
return(0); return (0);
} }
/** /**
...@@ -249,7 +259,8 @@ xenHypervisorPauseDomain(int handle, int domain) { ...@@ -249,7 +259,8 @@ xenHypervisorPauseDomain(int handle, int domain) {
* Returns 0 in case of success, -1 in case of error. * Returns 0 in case of success, -1 in case of error.
*/ */
int int
xenHypervisorResumeDomain(int handle, int domain) { xenHypervisorResumeDomain(int handle, int domain)
{
dom0_op_t op; dom0_op_t op;
int ret; int ret;
...@@ -259,8 +270,8 @@ xenHypervisorResumeDomain(int handle, int domain) { ...@@ -259,8 +270,8 @@ xenHypervisorResumeDomain(int handle, int domain) {
ret = xenHypervisorDoOp(handle, &op); ret = xenHypervisorDoOp(handle, &op);
if (ret < 0) if (ret < 0)
return(-1); return (-1);
return(0); return (0);
} }
/** /**
...@@ -273,7 +284,8 @@ xenHypervisorResumeDomain(int handle, int domain) { ...@@ -273,7 +284,8 @@ xenHypervisorResumeDomain(int handle, int domain) {
* Returns 0 in case of success, -1 in case of error. * Returns 0 in case of success, -1 in case of error.
*/ */
int int
xenHypervisorDestroyDomain(int handle, int domain) { xenHypervisorDestroyDomain(int handle, int domain)
{
dom0_op_t op; dom0_op_t op;
int ret; int ret;
...@@ -283,8 +295,8 @@ xenHypervisorDestroyDomain(int handle, int domain) { ...@@ -283,8 +295,8 @@ xenHypervisorDestroyDomain(int handle, int domain) {
ret = xenHypervisorDoOp(handle, &op); ret = xenHypervisorDoOp(handle, &op);
if (ret < 0) if (ret < 0)
return(-1); return (-1);
return(0); return (0);
} }
/** /**
...@@ -298,7 +310,8 @@ xenHypervisorDestroyDomain(int handle, int domain) { ...@@ -298,7 +310,8 @@ xenHypervisorDestroyDomain(int handle, int domain) {
* Returns 0 in case of success, -1 in case of error. * Returns 0 in case of success, -1 in case of error.
*/ */
int int
xenHypervisorSetMaxMemory(int handle, int domain, unsigned long memory) { xenHypervisorSetMaxMemory(int handle, int domain, unsigned long memory)
{
dom0_op_t op; dom0_op_t op;
int ret; int ret;
...@@ -309,6 +322,6 @@ xenHypervisorSetMaxMemory(int handle, int domain, unsigned long memory) { ...@@ -309,6 +322,6 @@ xenHypervisorSetMaxMemory(int handle, int domain, unsigned long memory) {
ret = xenHypervisorDoOp(handle, &op); ret = xenHypervisorDoOp(handle, &op);
if (ret < 0) if (ret < 0)
return(-1); return (-1);
return(0); return (0);
} }
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
/* required for uint8_t, uint32_t, etc ... */ /* required for uint8_t, uint32_t, etc ... */
#include <stdint.h> #include <stdint.h>
/* required for dom0_getdomaininfo_t */ /* required for dom0_getdomaininfo_t */
#include <xen/dom0_ops.h> #include <xen/dom0_ops.h>
...@@ -20,23 +21,19 @@ ...@@ -20,23 +21,19 @@
extern "C" { extern "C" {
#endif #endif
int xenHypervisorOpen (int quiet); int xenHypervisorOpen(int quiet);
int xenHypervisorClose (int handle); int xenHypervisorClose(int handle);
unsigned long xenHypervisorGetVersion (int handle); unsigned long xenHypervisorGetVersion(int handle);
int xenHypervisorDestroyDomain (int handle, int xenHypervisorDestroyDomain(int handle, int domain);
int domain); int xenHypervisorResumeDomain(int handle, int domain);
int xenHypervisorResumeDomain (int handle, int xenHypervisorPauseDomain(int handle, int domain);
int domain); int xenHypervisorGetDomainInfo(int handle,
int xenHypervisorPauseDomain (int handle, int domain,
int domain); dom0_getdomaininfo_t * info);
int xenHypervisorGetDomainInfo (int handle, int xenHypervisorSetMaxMemory(int handle,
int domain, int domain, unsigned long memory);
dom0_getdomaininfo_t *info);
int xenHypervisorSetMaxMemory (int handle,
int domain,
unsigned long memory);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* __VIR_XEN_INTERNAL_H__ */ #endif /* __VIR_XEN_INTERNAL_H__ */
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -16,26 +16,19 @@ extern "C" { ...@@ -16,26 +16,19 @@ extern "C" {
* *
* A buffer structure. * A buffer structure.
*/ */
typedef struct _virBuffer virBuffer; typedef struct _virBuffer virBuffer;
typedef virBuffer *virBufferPtr; typedef virBuffer *virBufferPtr;
struct _virBuffer { struct _virBuffer {
char *content; /* The buffer content UTF8 */ char *content; /* The buffer content UTF8 */
unsigned int use; /* The buffer size used */ unsigned int use; /* The buffer size used */
unsigned int size; /* The buffer size */ unsigned int size; /* The buffer size */
}; };
int virBufferAdd (virBufferPtr buf, int virBufferAdd(virBufferPtr buf, const char *str, int len);
const char *str, int virBufferVSprintf(virBufferPtr buf, const char *format, ...);
int len); char *virDomainParseXMLDesc(const char *xmldesc, char **name);
int virBufferVSprintf (virBufferPtr buf,
const char *format,
...);
char * virDomainParseXMLDesc (const char *xmldesc,
char **name);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif /* __VIR_XML_H__ */
#endif /* __VIR_XML_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册