X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Futil.c;h=fada69cf1a981893f85998ac2da465865a2d0074;hp=38d630e6a0f7061c76ca277ab20d6cc3ba331bc7;hb=871c44a747a8bf4465cbfda445216e9ac66d4a40;hpb=f9b9232be9db82cc729a56a2e99ecb27be546aac diff --git a/src/util.c b/src/util.c index 38d630e6a..fada69cf1 100644 --- a/src/util.c +++ b/src/util.c @@ -61,6 +61,20 @@ #include "exit-status.h" #include "hashmap.h" +size_t page_size(void) { + static __thread size_t pgsz = 0; + long r; + + if (pgsz) + return pgsz; + + assert_se((r = sysconf(_SC_PAGESIZE)) > 0); + + pgsz = (size_t) r; + + return pgsz; +} + bool streq_ptr(const char *a, const char *b) { /* Like streq(), but tries to make sense of NULL pointers */ @@ -3524,7 +3538,7 @@ int touch(const char *path) { assert(path); - if ((fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, 0666)) < 0) + if ((fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, 0644)) < 0) return -errno; close_nointr_nofail(fd); @@ -3945,33 +3959,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 +4004,49 @@ int detect_virtualization(const char **id) { if (!streq(p, ":ns:/")) { fclose(f); - r = 1; - _id = "ns"; - goto finish; + if (id) + *id = "pidns"; + + 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; }