diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-04-22 14:48:46 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-04-22 15:00:42 +0200 |
commit | ab94af9201496ea3aa59bbf2a01eb750fbd1c08a (patch) | |
tree | b62a3fcbea3779855a964e37e1415c75ad1c8816 /src/shared/virt.c | |
parent | nspawn: add --uuid= switch to allow setting the machine id for the container (diff) | |
download | systemd-ab94af9201496ea3aa59bbf2a01eb750fbd1c08a.tar.xz systemd-ab94af9201496ea3aa59bbf2a01eb750fbd1c08a.zip |
util: unify getenv() logic for other PID
Diffstat (limited to '')
-rw-r--r-- | src/shared/virt.c | 77 |
1 files changed, 22 insertions, 55 deletions
diff --git a/src/shared/virt.c b/src/shared/virt.c index b74c513d12..6e44794496 100644 --- a/src/shared/virt.c +++ b/src/shared/virt.c @@ -153,7 +153,8 @@ int detect_vm(const char **id) { } int detect_container(const char **id) { - FILE *f; + char *e = NULL; + int r; /* Unfortunately many of these operations require root access * in one way or another */ @@ -180,63 +181,29 @@ int detect_container(const char **id) { return 1; } - 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); - - if (id) - *id = "lxc"; - return 1; - - } else if (streq(line, "container=lxc-libvirt")) { - fclose(f); - - if (id) - *id = "lxc-libvirt"; - return 1; + r = getenv_for_pid(1, "container", &e); + if (r <= 0) + return r; - } else if (streq(line, "container=systemd-nspawn")) { - fclose(f); - - if (id) - *id = "systemd-nspawn"; - return 1; - - } else if (startswith(line, "container=")) { - fclose(f); - - if (id) - *id = "other"; - return 1; - } - - } while (!done); - - fclose(f); + /* We only recognize a selected few here, since we want to + * enforce a redacted namespace */ + if (streq(e, "lxc")) { + if (id) + *id = "lxc"; + } else if (streq(e, "lxc-libvirt")) { + if (id) + *id = "lxc-libvirt"; + } else if (streq(e, "systemd-nspawn")) { + if (id) + *id = "systemd-nspawn"; + } else { + if (id) + *id = "other"; } - return 0; + free(e); + + return r; } /* Returns a short identifier for the various VM/container implementations */ |