[Libvir] updated: Support Sun's Compiler

Mark Johnson johnson.nh at gmail.com
Fri Sep 28 15:26:06 UTC 2007


I've cleaned up the patch from the previous comments...
Sorry I'm off the original thread, switched over to mutt
and am waiting for fetchmail to catch up with gmail..

tested on today's CVS bits on a FC7 dom0
  (LD_PRELOAD=src/.libs/libvirt.so src/.libs/virsh)


Thanks,

MRJ

---

fixes to compile with Sun's CC

diff --git a/src/internal.h b/src/internal.h
--- a/src/internal.h
+++ b/src/internal.h
@@ -25,11 +25,6 @@ extern "C" {
 #define _(str) dgettext(GETTEXT_PACKAGE, (str))
 #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)
@@ -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:
diff --git a/src/sexpr.c b/src/sexpr.c
--- a/src/sexpr.c
+++ b/src/sexpr.c
@@ -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 le
         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);
-    }
-
-    if (ret->value == NULL) {
+        ret->u.value = strdup(str);
+    }
+
+    if (ret->u.value == NULL) {
         return NULL;
     }
 
@@ -157,8 +157,8 @@ sexpr_cons(struct sexpr *car, struct sex
     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 @@ append(struct sexpr *lst, struct sexpr *
 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 
             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 
             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
                 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
                 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 
     ptr = buffer;
     token = strsep(&ptr, "/");
 
-    if (sexpr->kind != SEXPR_CONS || sexpr->car->kind != SEXPR_VALUE) {
-        return NULL;
-    }
-
-    if (strcmp(sexpr->car->value, token) != 0) {
+    if (sexpr->kind != SEXPR_CONS || sexpr->u.s.car->kind != SEXPR_VALUE) {
+        return NULL;
+    }
+
+    if (strcmp(sexpr->u.s.car->u.value, token) != 0) {
         return NULL;
     }
 
@@ -440,16 +440,16 @@ sexpr_lookup(struct sexpr *sexpr, const 
         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 
         return NULL;
     }
 
-    if (sexpr->kind != SEXPR_CONS || sexpr->cdr->kind != SEXPR_CONS)
-        return NULL;
-
-    return sexpr->cdr;
+    if (sexpr->kind != SEXPR_CONS || sexpr->u.s.cdr->kind != SEXPR_CONS)
+        return NULL;
+
+    return sexpr->u.s.cdr;
 }
 
 /**
@@ -484,7 +484,7 @@ sexpr_node(struct sexpr *sexpr, const ch
 {
     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;
 }
 
 /**
diff --git a/src/sexpr.h b/src/sexpr.h
--- a/src/sexpr.h
+++ b/src/sexpr.h
@@ -29,9 +29,9 @@ struct sexpr {
         struct {
             struct sexpr *car;
             struct sexpr *cdr;
-        };
+        } s;
         char *value;
-    };
+    } u;
 };
 
 /* conversion to/from strings */
diff --git a/src/virsh.c b/src/virsh.c
--- a/src/virsh.c
+++ b/src/virsh.c
@@ -4295,9 +4295,9 @@ vshDomainStateToString(int state)
     case VIR_DOMAIN_CRASHED:
         return gettext_noop("crashed");
     default:
-        return gettext_noop("no state");  /* = dom0 state */
-    }
-    return NULL;
+        ;/*FALLTHROUGH*/
+    }
+    return gettext_noop("no state");  /* = dom0 state */
 }
 
 static const char *
@@ -4311,9 +4311,9 @@ vshDomainVcpuStateToString(int state)
     case VIR_VCPU_RUNNING:
         return gettext_noop("running");
     default:
-        return gettext_noop("no state");
-    }
-    return NULL;
+        ;/*FALLTHROUGH*/
+    }
+    return gettext_noop("no state");
 }
 
 static int
@@ -4825,7 +4825,7 @@ vshParseArgv(vshControl * ctl, int argc,
         }
         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) {
diff --git a/src/xend_internal.c b/src/xend_internal.c
--- a/src/xend_internal.c
+++ b/src/xend_internal.c
@@ -189,9 +189,9 @@ virXendErrorInt(virConnectPtr conn, virE
 
 
 #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) \
@@ -661,23 +661,22 @@ xend_node_op(virConnectPtr xend, const c
  * 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 */
 
 /**
@@ -960,11 +959,11 @@ xenDaemonListDomainsOld(virConnectPtr xe
     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++;
     }
 
@@ -976,13 +975,13 @@ xenDaemonListDomainsOld(virConnectPtr xe
     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++;
     }
 
@@ -1461,8 +1460,8 @@ xend_parse_sexp_desc(virConnectPtr conn,
     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.... */
@@ -1701,8 +1700,8 @@ xend_parse_sexp_desc(virConnectPtr conn,
 
     /* 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) {
@@ -2677,11 +2676,11 @@ xenDaemonListDomains(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;
-        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)
@@ -2715,8 +2714,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++;
@@ -2884,11 +2883,11 @@ xenDaemonDomainGetVcpus(virDomainPtr dom
         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;
@@ -2905,14 +2904,14 @@ xenDaemonDomainGetVcpus(virDomainPtr dom
                  * 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);
                                 }
@@ -3434,8 +3433,8 @@ xenDaemonNumOfDefinedDomains(virConnectP
 
     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++;
@@ -3464,12 +3463,12 @@ int xenDaemonListDefinedDomains(virConne
 
     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;
     }




More information about the libvir-list mailing list