[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