X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Futil.c;h=2a5f3074b650f0cf538256c4eb10e9b11f924637;hp=38d630e6a0f7061c76ca277ab20d6cc3ba331bc7;hb=43515ba0cecda2be8244a9f75078ac4a561092d9;hpb=f9b9232be9db82cc729a56a2e99ecb27be546aac diff --git a/src/util.c b/src/util.c index 38d630e6a..2a5f3074b 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); @@ -3568,7 +3582,6 @@ char *normalize_env_assignment(const char *s) { free(p); if (!value) { - free(p); free(name); return NULL; } @@ -3945,33 +3958,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 +4003,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; } @@ -4162,6 +4187,10 @@ bool nulstr_contains(const char*nulstr, const char *needle) { return false; } +bool plymouth_running(void) { + return access("/run/plymouth/pid", F_OK) >= 0; +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime", @@ -4182,7 +4211,7 @@ static const char *const sigchld_code_table[] = { DEFINE_STRING_TABLE_LOOKUP(sigchld_code, int); -static const char *const log_facility_table[LOG_NFACILITIES] = { +static const char *const log_facility_unshifted_table[LOG_NFACILITIES] = { [LOG_FAC(LOG_KERN)] = "kern", [LOG_FAC(LOG_USER)] = "user", [LOG_FAC(LOG_MAIL)] = "mail", @@ -4205,7 +4234,7 @@ static const char *const log_facility_table[LOG_NFACILITIES] = { [LOG_FAC(LOG_LOCAL7)] = "local7" }; -DEFINE_STRING_TABLE_LOOKUP(log_facility, int); +DEFINE_STRING_TABLE_LOOKUP(log_facility_unshifted, int); static const char *const log_level_table[] = { [LOG_EMERG] = "emerg",