提交 fb741174 编写于 作者: D Daniel P. Berrange

Solaris portability fix from Mark Johnson. Remove use of anonymous union members

上级 b876bf6e
Sat Sep 29 14:05:41 EST 2007 Daniel P. Berrange <berrange@redhat.com>
* src/sexpr.h, src/sexpr.c, src/virsh.c, src/xend_internal.c:
Remove use of anonymous union members in sexpr code.
* src/internal.h: Solaris portability fix (Mark Johnson)
Fri Sep 28 16:41:41 EST 2007 Daniel P. Berrange <berrange@redhat.com>
* src/qemu_conf.c: Fix crash processing multiple <input> tags
......
......@@ -26,11 +26,6 @@ extern "C" {
#define N_(str) dgettext(GETTEXT_PACKAGE, (str))
#define gettext_noop(str) (str)
#ifdef __GNUC__
#ifdef HAVE_ANSIDECL_H
#include <ansidecl.h>
#endif
/* String equality tests, suggested by Jim Meyering. */
#define STREQ(a,b) (strcmp((a),(b)) == 0)
#define STRCASEEQ(a,b) (strcasecmp((a),(b)) == 0)
......@@ -39,6 +34,15 @@ extern "C" {
#define STREQLEN(a,b,n) (strncmp((a),(b),(n)) == 0)
#define STRNEQLEN(a,b,n) (strncmp((a),(b),(n)) != 0)
#ifndef __GNUC__
#define __FUNCTION__ __func__
#endif
#ifdef __GNUC__
#ifdef HAVE_ANSIDECL_H
#include <ansidecl.h>
#endif
/**
* ATTRIBUTE_UNUSED:
*
......@@ -61,7 +65,7 @@ extern "C" {
#else
#define ATTRIBUTE_UNUSED
#define ATTRIBUTE_FORMAT(...)
#endif
#endif /* __GNUC__ */
/**
* TODO:
......
......@@ -80,11 +80,11 @@ sexpr_free(struct sexpr *sexpr)
switch (sexpr->kind) {
case SEXPR_CONS:
sexpr_free(sexpr->car);
sexpr_free(sexpr->cdr);
sexpr_free(sexpr->u.s.car);
sexpr_free(sexpr->u.s.cdr);
break;
case SEXPR_VALUE:
free(sexpr->value);
free(sexpr->u.value);
break;
case SEXPR_NIL:
break;
......@@ -127,12 +127,12 @@ sexpr_string(const char *str, ssize_t len)
return ret;
ret->kind = SEXPR_VALUE;
if (len > 0) {
ret->value = strndup(str, len);
ret->u.value = strndup(str, len);
} else {
ret->value = strdup(str);
ret->u.value = strdup(str);
}
if (ret->value == NULL) {
if (ret->u.value == NULL) {
return NULL;
}
......@@ -157,8 +157,8 @@ sexpr_cons(struct sexpr *car, struct sexpr *cdr)
if (ret == NULL)
return ret;
ret->kind = SEXPR_CONS;
ret->car = car;
ret->cdr = cdr;
ret->u.s.car = car;
ret->u.s.cdr = cdr;
return ret;
}
......@@ -174,12 +174,12 @@ static void
append(struct sexpr *lst, struct sexpr *value)
{
while (lst->kind != SEXPR_NIL) {
lst = lst->cdr;
lst = lst->u.s.cdr;
}
lst->kind = SEXPR_CONS;
lst->car = value;
lst->cdr = sexpr_nil();
lst->u.s.car = value;
lst->u.s.cdr = sexpr_nil();
}
/**
......@@ -228,18 +228,18 @@ sexpr2string(struct sexpr * sexpr, char *buffer, size_t n_buffer)
if (tmp == 0)
goto error;
ret += tmp;
tmp = sexpr2string(sexpr->car, buffer + ret, n_buffer - ret);
tmp = sexpr2string(sexpr->u.s.car, buffer + ret, n_buffer - ret);
if (tmp == 0)
goto error;
ret += tmp;
while (sexpr->cdr->kind != SEXPR_NIL) {
sexpr = sexpr->cdr;
while (sexpr->u.s.cdr->kind != SEXPR_NIL) {
sexpr = sexpr->u.s.cdr;
tmp = snprintf(buffer + ret, n_buffer - ret, " ");
if (tmp == 0)
goto error;
ret += tmp;
tmp =
sexpr2string(sexpr->car, buffer + ret, n_buffer - ret);
sexpr2string(sexpr->u.s.car, buffer + ret, n_buffer - ret);
if (tmp == 0)
goto error;
ret += tmp;
......@@ -250,12 +250,12 @@ sexpr2string(struct sexpr * sexpr, char *buffer, size_t n_buffer)
ret += tmp;
break;
case SEXPR_VALUE:
if (strchr(sexpr->value, ' '))
if (strchr(sexpr->u.value, ' '))
tmp = snprintf(buffer + ret, n_buffer - ret, "'%s'",
sexpr->value);
sexpr->u.value);
else
tmp = snprintf(buffer + ret, n_buffer - ret, "%s",
sexpr->value);
sexpr->u.value);
if (tmp == 0)
goto error;
ret += tmp;
......@@ -346,8 +346,8 @@ _string2sexpr(const char *buffer, size_t * end)
ptr++;
}
ret->value = strndup(start, ptr - start);
if (ret->value == NULL) {
ret->u.value = strndup(start, ptr - start);
if (ret->u.value == NULL) {
virSexprError(VIR_ERR_NO_MEMORY,
_("failed to copy a string"));
}
......@@ -361,15 +361,15 @@ _string2sexpr(const char *buffer, size_t * end)
ptr++;
}
ret->value = strndup(start, ptr - start);
if (ret->value == NULL) {
ret->u.value = strndup(start, ptr - start);
if (ret->u.value == NULL) {
virSexprError(VIR_ERR_NO_MEMORY,
_("failed to copy a string"));
}
}
ret->kind = SEXPR_VALUE;
if (ret->value == NULL)
if (ret->u.value == NULL)
goto error;
}
......@@ -426,11 +426,11 @@ sexpr_lookup(struct sexpr *sexpr, const char *node)
ptr = buffer;
token = strsep(&ptr, "/");
if (sexpr->kind != SEXPR_CONS || sexpr->car->kind != SEXPR_VALUE) {
if (sexpr->kind != SEXPR_CONS || sexpr->u.s.car->kind != SEXPR_VALUE) {
return NULL;
}
if (strcmp(sexpr->car->value, token) != 0) {
if (strcmp(sexpr->u.s.car->u.value, token) != 0) {
return NULL;
}
......@@ -440,16 +440,16 @@ sexpr_lookup(struct sexpr *sexpr, const char *node)
if (token == NULL)
continue;
sexpr = sexpr->cdr;
for (i = sexpr; i->kind != SEXPR_NIL; i = i->cdr) {
sexpr = sexpr->u.s.cdr;
for (i = sexpr; i->kind != SEXPR_NIL; i = i->u.s.cdr) {
if (i->kind != SEXPR_CONS ||
i->car->kind != SEXPR_CONS ||
i->car->car->kind != SEXPR_VALUE) {
i->u.s.car->kind != SEXPR_CONS ||
i->u.s.car->u.s.car->kind != SEXPR_VALUE) {
continue;
}
if (strcmp(i->car->car->value, token) == 0) {
sexpr = i->car;
if (strcmp(i->u.s.car->u.s.car->u.value, token) == 0) {
sexpr = i->u.s.car;
break;
}
}
......@@ -463,10 +463,10 @@ sexpr_lookup(struct sexpr *sexpr, const char *node)
return NULL;
}
if (sexpr->kind != SEXPR_CONS || sexpr->cdr->kind != SEXPR_CONS)
if (sexpr->kind != SEXPR_CONS || sexpr->u.s.cdr->kind != SEXPR_CONS)
return NULL;
return sexpr->cdr;
return sexpr->u.s.cdr;
}
/**
......@@ -484,7 +484,7 @@ sexpr_node(struct sexpr *sexpr, const char *node)
{
struct sexpr *n = sexpr_lookup(sexpr, node);
return (n && n->car->kind == SEXPR_VALUE) ? n->car->value : NULL;
return (n && n->u.s.car->kind == SEXPR_VALUE) ? n->u.s.car->u.value : NULL;
}
/**
......
......@@ -29,9 +29,9 @@ struct sexpr {
struct {
struct sexpr *car;
struct sexpr *cdr;
};
} s;
char *value;
};
} u;
};
/* conversion to/from strings */
......
......@@ -4338,9 +4338,9 @@ vshDomainStateToString(int state)
case VIR_DOMAIN_CRASHED:
return gettext_noop("crashed");
default:
return gettext_noop("no state"); /* = dom0 state */
;/*FALLTHROUGH*/
}
return NULL;
return gettext_noop("no state"); /* = dom0 state */
}
static const char *
......@@ -4354,9 +4354,9 @@ vshDomainVcpuStateToString(int state)
case VIR_VCPU_RUNNING:
return gettext_noop("running");
default:
return gettext_noop("no state");
;/*FALLTHROUGH*/
}
return NULL;
return gettext_noop("no state");
}
static int
......@@ -4868,7 +4868,7 @@ vshParseArgv(vshControl * ctl, int argc, char **argv)
}
last = argv[i];
}
end = end ? : argc;
end = end ? end : argc;
/* standard (non-command) options */
while ((arg = getopt_long(end, argv, "d:hqtc:vrl:", opt, &idx)) != -1) {
......
......@@ -190,9 +190,9 @@ virXendErrorInt(virConnectPtr conn, virErrorNumber error, int val)
#define foreach(iterator, start) \
for (_for_i = (start), *iterator = (start)->car; \
for (_for_i = (start), *iterator = (start)->u.s.car; \
_for_i->kind == SEXPR_CONS; \
_for_i = _for_i->cdr, iterator = _for_i->car)
_for_i = _for_i->u.s.cdr, iterator = _for_i->u.s.car)
#define foreach_node(iterator, start, path) \
foreach(iterator, start) \
......@@ -662,23 +662,22 @@ xend_node_op(virConnectPtr xend, const char *path, const char *key, ...)
* Returns 0 in case of success, -1 in case of failure.
*/
static int
xend_op_ext(virConnectPtr xend, const char *name, char *error,
size_t n_error, const char *key, ...)
xend_op(virConnectPtr xend, const char *name, const char *key, ...)
{
char buffer[1024];
char error[1024];
va_list ap;
int ret;
snprintf(buffer, sizeof(buffer), "/xend/domain/%s", name);
va_start(ap, key);
ret = xend_op_ext2(xend, buffer, error, n_error, key, ap);
ret = xend_op_ext2(xend, buffer, error, sizeof(error), key, ap);
va_end(ap);
return ret;
}
#define xend_op(xend, name, key, ...) ({char error[1024]; xend_op_ext(xend, name, error, sizeof(error), key, __VA_ARGS__);})
#endif /* ! PROXY */
/**
......@@ -961,11 +960,11 @@ xenDaemonListDomainsOld(virConnectPtr xend)
if (root == NULL)
goto error;
for (_for_i = root, node = root->car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->cdr, node = _for_i->car) {
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
if (node->kind != SEXPR_VALUE)
continue;
extra += strlen(node->value) + 1;
extra += strlen(node->u.value) + 1;
count++;
}
......@@ -977,13 +976,13 @@ xenDaemonListDomainsOld(virConnectPtr xend)
ptr += sizeof(char *) * (count + 1);
i = 0;
for (_for_i = root, node = root->car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->cdr, node = _for_i->car) {
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
if (node->kind != SEXPR_VALUE)
continue;
ret[i] = ptr;
strcpy(ptr, node->value);
ptr += strlen(node->value) + 1;
strcpy(ptr, node->u.value);
ptr += strlen(node->u.value) + 1;
i++;
}
......@@ -1462,8 +1461,8 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
if ((tmp != NULL) && (tmp[0] != 0))
virBufferVSprintf(&buf, " <emulator>%s</emulator>\n", tmp);
for (cur = root; cur->kind == SEXPR_CONS; cur = cur->cdr) {
node = cur->car;
for (cur = root; cur->kind == SEXPR_CONS; cur = cur->u.s.cdr) {
node = cur->u.s.car;
/* Normally disks are in a (device (vbd ...)) block
but blktap disks ended up in a differently named
(device (tap ....)) block.... */
......@@ -1702,8 +1701,8 @@ xend_parse_sexp_desc(virConnectPtr conn, struct sexpr *root, int xendConfigVersi
/* in case of HVM we have devices emulation */
if (hvm) {
for (cur = sexpr_lookup(root, "domain/image/hvm"); cur && cur->kind == SEXPR_CONS; cur = cur->cdr) {
node = cur->car;
for (cur = sexpr_lookup(root, "domain/image/hvm"); cur && cur->kind == SEXPR_CONS; cur = cur->u.s.cdr) {
node = cur->u.s.car;
if (sexpr_lookup(node, "usbdevice")) {
tmp = sexpr_node(node, "usbdevice");
if (tmp && *tmp) {
......@@ -2903,11 +2902,11 @@ xenDaemonListDomains(virConnectPtr conn, int *ids, int maxids)
ret = 0;
for (_for_i = root, node = root->car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->cdr, node = _for_i->car) {
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
if (node->kind != SEXPR_VALUE)
continue;
id = xenDaemonDomainLookupByName_ids(conn, node->value, NULL);
id = xenDaemonDomainLookupByName_ids(conn, node->u.value, NULL);
if (id >= 0)
ids[ret++] = (int) id;
if (ret >= maxids)
......@@ -2941,8 +2940,8 @@ xenDaemonNumOfDomains(virConnectPtr conn)
ret = 0;
for (_for_i = root, node = root->car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->cdr, node = _for_i->car) {
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
if (node->kind != SEXPR_VALUE)
continue;
ret++;
......@@ -3110,11 +3109,11 @@ xenDaemonDomainGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo,
memset(cpumaps, 0, maxinfo * maplen);
/* scan the sexprs from "(vcpu (number x)...)" and get parameter values */
for (s = root; s->kind == SEXPR_CONS; s = s->cdr) {
if ((s->car->kind == SEXPR_CONS) &&
(s->car->car->kind == SEXPR_VALUE) &&
!strcmp(s->car->car->value, "vcpu")) {
t = s->car;
for (s = root; s->kind == SEXPR_CONS; s = s->u.s.cdr) {
if ((s->u.s.car->kind == SEXPR_CONS) &&
(s->u.s.car->u.s.car->kind == SEXPR_VALUE) &&
!strcmp(s->u.s.car->u.s.car->u.value, "vcpu")) {
t = s->u.s.car;
vcpu = ipt->number = sexpr_int(t, "vcpu/number");
if ((oln = sexpr_int(t, "vcpu/online")) != 0) {
if (sexpr_int(t, "vcpu/running")) ipt->state = VIR_VCPU_RUNNING;
......@@ -3131,14 +3130,14 @@ xenDaemonDomainGetVcpus(virDomainPtr domain, virVcpuInfoPtr info, int maxinfo,
* get sexpr from "(cpumap (x y z...))" and convert values
* to bitmap
*/
for (t = t->cdr; t->kind == SEXPR_CONS; t = t->cdr)
if ((t->car->kind == SEXPR_CONS) &&
(t->car->car->kind == SEXPR_VALUE) &&
!strcmp(t->car->car->value, "cpumap") &&
(t->car->cdr->kind == SEXPR_CONS)) {
for (t = t->car->cdr->car; t->kind == SEXPR_CONS; t = t->cdr)
if (t->car->kind == SEXPR_VALUE) {
cpu = strtol(t->car->value, NULL, 0);
for (t = t->u.s.cdr; t->kind == SEXPR_CONS; t = t->u.s.cdr)
if ((t->u.s.car->kind == SEXPR_CONS) &&
(t->u.s.car->u.s.car->kind == SEXPR_VALUE) &&
!strcmp(t->u.s.car->u.s.car->u.value, "cpumap") &&
(t->u.s.car->u.s.cdr->kind == SEXPR_CONS)) {
for (t = t->u.s.car->u.s.cdr->u.s.car; t->kind == SEXPR_CONS; t = t->u.s.cdr)
if (t->u.s.car->kind == SEXPR_VALUE) {
cpu = strtol(t->u.s.car->u.value, NULL, 0);
if (cpu >= 0 && (VIR_CPU_MAPLEN(cpu+1) <= maplen)) {
VIR_USE_CPU(cpumap, cpu);
}
......@@ -3660,8 +3659,8 @@ xenDaemonNumOfDefinedDomains(virConnectPtr conn)
ret = 0;
for (_for_i = root, node = root->car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->cdr, node = _for_i->car) {
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
if (node->kind != SEXPR_VALUE)
continue;
ret++;
......@@ -3690,12 +3689,12 @@ int xenDaemonListDefinedDomains(virConnectPtr conn, char **const names, int maxn
ret = 0;
for (_for_i = root, node = root->car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->cdr, node = _for_i->car) {
for (_for_i = root, node = root->u.s.car; _for_i->kind == SEXPR_CONS;
_for_i = _for_i->u.s.cdr, node = _for_i->u.s.car) {
if (node->kind != SEXPR_VALUE)
continue;
names[ret++] = strdup(node->value);
names[ret++] = strdup(node->u.value);
if (ret >= maxnames)
break;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册