[systemd-devel] [PATCH] detect_virtualization: make Virtualization an out value

Thomas H.P. Andersen phomes at gmail.com
Sat Feb 22 05:36:42 PST 2014


From: Thomas Hindoe Paaboel Andersen <phomes at gmail.com>

The return value from detect_virtualization used to be a
Virtualization enum but in cases of error it would also be a
negative errno. This caused a warning in clang when test-architecture
began comparing the return value to -EPERM and -EACCES.
---
 src/core/dbus-manager.c       |  2 +-
 src/core/main.c               |  2 +-
 src/detect-virt/detect-virt.c |  6 +++---
 src/hostname/hostnamectl.c    |  3 ++-
 src/hostname/hostnamed.c      |  2 +-
 src/shared/condition-util.c   |  8 ++++----
 src/shared/virt.c             | 20 ++++++++++++++------
 src/shared/virt.h             |  2 +-
 src/test/test-architecture.c  |  5 +++--
 9 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c
index 75004cb..f5a06ba 100644
--- a/src/core/dbus-manager.c
+++ b/src/core/dbus-manager.c
@@ -84,7 +84,7 @@ static int property_get_virtualization(
         assert(bus);
         assert(reply);
 
-        detect_virtualization(&id);
+        detect_virtualization(&id, NULL);
 
         return sd_bus_message_append(reply, "s", id);
 }
diff --git a/src/core/main.c b/src/core/main.c
index 086e283..5facd17 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -1507,7 +1507,7 @@ int main(int argc, char *argv[]) {
 
                 log_info(PACKAGE_STRING " running in system mode. (" SYSTEMD_FEATURES ")");
 
-                detect_virtualization(&virtualization);
+                detect_virtualization(&virtualization, NULL);
                 if (virtualization)
                         log_info("Detected virtualization '%s'.", virtualization);
 
diff --git a/src/detect-virt/detect-virt.c b/src/detect-virt/detect-virt.c
index 2f8b0eb..698658c 100644
--- a/src/detect-virt/detect-virt.c
+++ b/src/detect-virt/detect-virt.c
@@ -131,9 +131,9 @@ int main(int argc, char *argv[]) {
         case ANY_VIRTUALIZATION: {
                 Virtualization v;
 
-                v = detect_virtualization(&id);
-                if (v < 0) {
-                        log_error("Failed to check for virtualization: %s", strerror(-v));
+                r = detect_virtualization(&id, &v);
+                if (r < 0) {
+                        log_error("Failed to check for virtualization: %s", strerror(-r));
                         return EXIT_FAILURE;
                 }
 
diff --git a/src/hostname/hostnamectl.c b/src/hostname/hostnamectl.c
index e455249..2e1e6d7 100644
--- a/src/hostname/hostnamectl.c
+++ b/src/hostname/hostnamectl.c
@@ -104,7 +104,8 @@ static void print_status_info(StatusInfo *i) {
         if (r >= 0)
                 printf("           Boot ID: " SD_ID128_FORMAT_STR "\n", SD_ID128_FORMAT_VAL(bid));
 
-        if (detect_virtualization(&id) > 0)
+        r = detect_virtualization(&id, NULL);
+        if (r > 0)
                 printf("    Virtualization: %s\n", id);
 
         r = parse_env_file("/etc/os-release", NEWLINE,
diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c
index e57891b..2e36d01 100644
--- a/src/hostname/hostnamed.c
+++ b/src/hostname/hostnamed.c
@@ -125,7 +125,7 @@ static const char* fallback_chassis(void) {
         unsigned t;
         Virtualization v;
 
-        v = detect_virtualization(NULL);
+        r = detect_virtualization(NULL, &v);
 
         if (v == VIRTUALIZATION_VM)
                 return "vm";
diff --git a/src/shared/condition-util.c b/src/shared/condition-util.c
index 4aea3ca..44feabe 100644
--- a/src/shared/condition-util.c
+++ b/src/shared/condition-util.c
@@ -121,7 +121,7 @@ bool condition_test_kernel_command_line(Condition *c) {
 }
 
 bool condition_test_virtualization(Condition *c) {
-        int b;
+        int b, r;
         Virtualization v;
         const char *id;
 
@@ -129,9 +129,9 @@ bool condition_test_virtualization(Condition *c) {
         assert(c->parameter);
         assert(c->type == CONDITION_VIRTUALIZATION);
 
-        v = detect_virtualization(&id);
-        if (v < 0) {
-                log_warning("Failed to detect virtualization, ignoring: %s", strerror(-v));
+        r = detect_virtualization(&id, &v);
+        if (r < 0) {
+                log_warning("Failed to detect virtualization, ignoring: %s", strerror(-r));
                 return c->negate;
         }
 
diff --git a/src/shared/virt.c b/src/shared/virt.c
index c79d35d..73ce9ff 100644
--- a/src/shared/virt.c
+++ b/src/shared/virt.c
@@ -278,20 +278,28 @@ finish:
 }
 
 /* Returns a short identifier for the various VM/container implementations */
-Virtualization detect_virtualization(const char **id) {
+int detect_virtualization(const char **id, Virtualization *type) {
         int r;
 
         r = detect_container(id);
         if (r < 0)
                 return r;
-        if (r > 0)
-                return VIRTUALIZATION_CONTAINER;
+        if (r > 0) {
+                if (type != NULL)
+                        *type = VIRTUALIZATION_CONTAINER;
+                return r;
+        }
 
         r = detect_vm(id);
         if (r < 0)
                 return r;
-        if (r > 0)
-                return VIRTUALIZATION_VM;
+        if (r > 0) {
+                if (type != NULL)
+                         *type = VIRTUALIZATION_VM;
+                return r;
+        }
 
-        return VIRTUALIZATION_NONE;
+        if (type != NULL)
+                *type = VIRTUALIZATION_NONE;
+        return 0;
 }
diff --git a/src/shared/virt.h b/src/shared/virt.h
index aa6ad35..6c9cb0f 100644
--- a/src/shared/virt.h
+++ b/src/shared/virt.h
@@ -32,4 +32,4 @@ typedef enum Virtualization {
         _VIRTUALIZATION_INVALID = -1
 } Virtualization;
 
-Virtualization detect_virtualization(const char **id);
+int detect_virtualization(const char **id, Virtualization *type);
diff --git a/src/test/test-architecture.c b/src/test/test-architecture.c
index b586c0d..bc17b15 100644
--- a/src/test/test-architecture.c
+++ b/src/test/test-architecture.c
@@ -27,10 +27,11 @@
 int main(int argc, char *argv[]) {
         Architecture a;
         Virtualization v;
+        int r;
         const char *id = NULL;
 
-        v = detect_virtualization(&id);
-        if (v == -EPERM || v == -EACCES)
+        r = detect_virtualization(&id, &v);
+        if (r == -EPERM || r == -EACCES)
                 return EXIT_TEST_SKIP;
 
         assert_se(v >= 0);
-- 
1.8.5.3



More information about the systemd-devel mailing list