summaryrefslogtreecommitdiff
path: root/src/util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-09-23 04:38:39 +0200
committerLennart Poettering <lennart@poettering.net>2011-09-23 16:28:27 +0200
commit65bc2c21140d20e757b0aed9bb23286939426abb (patch)
treeea1be9f787323ba98113382965745e31c51c17f4 /src/util.c
parent3bb1c6b04f93841c10d2cb1c4e2945d5a0bb8ff1 (diff)
util: detect systemd-nspawn without relying on ns cgroup tree
Diffstat (limited to 'src/util.c')
-rw-r--r--src/util.c51
1 files changed, 48 insertions, 3 deletions
diff --git a/src/util.c b/src/util.c
index 36c8938c2f..33b6fd4809 100644
--- a/src/util.c
+++ b/src/util.c
@@ -4384,7 +4384,7 @@ int detect_vm(const char **id) {
if (hypervisor) {
if (id)
- *id = "other";
+ *id = "other-vm";
return 1;
}
@@ -4421,7 +4421,51 @@ int detect_container(const char **id) {
return 1;
}
- if ((f = fopen("/proc/self/cgroup", "re"))) {
+ f = fopen("/proc/1/environ", "re");
+ if (f) {
+ bool done = false;
+
+ do {
+ char line[LINE_MAX];
+ unsigned i;
+
+ for (i = 0; i < sizeof(line)-1; i++) {
+ int c;
+
+ c = getc(f);
+ if (_unlikely_(c == EOF)) {
+ done = true;
+ break;
+ } else if (c == 0)
+ break;
+
+ line[i] = c;
+ }
+ line[i] = 0;
+
+ if (streq(line, "container=lxc")) {
+ fclose(f);
+ *id = "lxc";
+ return 1;
+
+ } else if (streq(line, "container=systemd-nspawn")) {
+ fclose(f);
+ *id = "systemd-nspawn";
+ return 1;
+
+ } else if (startswith(line, "container=")) {
+ fclose(f);
+ *id = "other-container";
+ return 1;
+ }
+
+ } while (!done);
+
+ fclose(f);
+ }
+
+ f = fopen("/proc/self/cgroup", "re");
+ if (f) {
for (;;) {
char line[LINE_MAX], *p;
@@ -4429,7 +4473,8 @@ int detect_container(const char **id) {
if (!fgets(line, sizeof(line), f))
break;
- if (!(p = strchr(strstrip(line), ':')))
+ p = strchr(strstrip(line), ':');
+ if (!p)
continue;
if (strncmp(p, ":ns:", 4))