X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fvirt.c;h=1c86a3dd1e62dee901b4c482203b8b3a3e91839b;hb=7fd1b19bc9e9f5574f2877936b8ac267c7706947;hp=fc62c72328e381341850d021dbd076fb6d5e73ee;hpb=96ede2601f27cd5fe52eed96b873bef55cd0ce23;p=elogind.git diff --git a/src/shared/virt.c b/src/shared/virt.c index fc62c7232..1c86a3dd1 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; }