summaryrefslogtreecommitdiff
path: root/src/shared/virt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/virt.c')
-rw-r--r--src/shared/virt.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/src/shared/virt.c b/src/shared/virt.c
index fc62c72328..1c86a3dd1e 100644
--- a/src/shared/virt.c
+++ b/src/shared/virt.c
@@ -25,6 +25,7 @@
#include "util.h"
#include "virt.h"
+#include "fileio.h"
/* Returns a short identifier for the various VM implementations */
int detect_vm(const char **id) {
@@ -61,13 +62,28 @@ int detect_vm(const char **id) {
union {
uint32_t sig32[3];
char text[13];
- } sig;
+ } sig = {};
unsigned i;
const char *j, *k;
bool hypervisor;
+ _cleanup_free_ char *hvtype = NULL;
+ int r;
+
+ /* Try high-level hypervisor sysfs file first:
+ *
+ * https://bugs.freedesktop.org/show_bug.cgi?id=61491 */
+ r = read_one_line_file("/sys/hypervisor/type", &hvtype);
+ if (r >= 0) {
+ if (streq(hvtype, "xen")) {
+ if (id)
+ *id = "xen";
+
+ return 1;
+ }
+ } else if (r != -ENOENT)
+ return r;
/* http://lwn.net/Articles/301888/ */
- zero(sig);
#if defined (__i386__)
#define REG_a "eax"
@@ -117,11 +133,11 @@ int detect_vm(const char **id) {
}
for (i = 0; i < ELEMENTSOF(dmi_vendors); i++) {
- char *s;
- int r;
+ _cleanup_free_ char *s = NULL;
const char *found = NULL;
- if ((r = read_one_line_file(dmi_vendors[i], &s)) < 0) {
+ r = read_one_line_file(dmi_vendors[i], &s);
+ if (r < 0) {
if (r != -ENOENT)
return r;
@@ -131,7 +147,6 @@ int detect_vm(const char **id) {
NULSTR_FOREACH_PAIR(j, k, dmi_vendor_table)
if (startswith(s, j))
found = k;
- free(s);
if (found) {
if (id)
@@ -141,7 +156,7 @@ int detect_vm(const char **id) {
}
}
- if (hypervisor) {
+ if (hypervisor || hvtype) {
if (id)
*id = "other";
@@ -153,7 +168,7 @@ int detect_vm(const char **id) {
}
int detect_container(const char **id) {
- char *e = NULL;
+ _cleanup_free_ char *e = NULL;
int r;
/* Unfortunately many of these operations require root access
@@ -201,8 +216,6 @@ int detect_container(const char **id) {
*id = "other";
}
- free(e);
-
return r;
}