Commit ef2df9f4 authored by Lennart Poettering's avatar Lennart Poettering
Browse files

util: add detect_container()

parent da5b3bad
......@@ -3945,33 +3945,32 @@ int detect_vm(const char **id) {
return 0;
}
/* Returns a short identifier for the various VM/container implementations */
int detect_virtualization(const char **id) {
int r;
static __thread const char *cached_id = NULL;
const char *_id;
int detect_container(const char **id) {
FILE *f;
if (cached_id) {
/* Unfortunately many of these operations require root access
* in one way or another */
if (cached_id == (const char*) -1)
return 0;
if (geteuid() != 0)
return -EPERM;
if (running_in_chroot() > 0) {
if (id)
*id = cached_id;
*id = "chroot";
return 1;
}
/* Unfortunately most of these operations require root access
* in one way or another */
if (geteuid() != 0)
return -EPERM;
/* /proc/vz exists in container and outside of the container,
* /proc/bc only outside of the container. */
if (access("/proc/vz", F_OK) >= 0 &&
access("/proc/bc", F_OK) < 0) {
if ((r = running_in_chroot()) > 0) {
_id = "chroot";
r = 1;
goto finish;
if (id)
*id = "openvz";
return 1;
}
if ((f = fopen("/proc/self/cgroup", "r"))) {
......@@ -3991,36 +3990,49 @@ int detect_virtualization(const char **id) {
if (!streq(p, ":ns:/")) {
fclose(f);
r = 1;
_id = "ns";
goto finish;
if (id)
*id = "ns";
return 1;
}
}
fclose(f);
}
/* /proc/vz exists in container and outside of the container,
* /proc/bc only outside of the container. */
if (access("/proc/vz", F_OK) >= 0 &&
access("/proc/bc", F_OK) < 0) {
_id = "openvz";
r = 1;
goto finish;
return 0;
}
/* Returns a short identifier for the various VM/container implementations */
int detect_virtualization(const char **id) {
static __thread const char *cached_id = NULL;
const char *_id;
int r;
if (cached_id) {
if (cached_id == (const char*) -1)
return 0;
if (id)
*id = cached_id;
return 1;
}
if ((r = detect_container(&_id)) != 0)
goto finish;
r = detect_vm(&_id);
finish:
if (r < 0)
return r;
else if (r > 0)
if (r > 0) {
cached_id = _id;
else
cached_id = (const char*) -1;
if (id)
*id = _id;
if (id)
*id = _id;
} else if (r == 0)
cached_id = (const char*) -1;
return r;
}
......
......@@ -380,6 +380,7 @@ bool tty_is_vc(const char *tty);
const char *default_term_for_tty(const char *tty);
int detect_vm(const char **id);
int detect_container(const char **id);
int detect_virtualization(const char **id);
void execute_directory(const char *directory, DIR *_d, char *argv[]);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment