chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ask-password: also accept Backspace as first keypress as silent mode switch
[elogind.git]
/
src
/
util.c
diff --git
a/src/util.c
b/src/util.c
index 38d630e6a0f7061c76ca277ab20d6cc3ba331bc7..fada69cf1a981893f85998ac2da465865a2d0074 100644
(file)
--- a/
src/util.c
+++ b/
src/util.c
@@
-61,6
+61,20
@@
#include "exit-status.h"
#include "hashmap.h"
#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 */
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);
assert(path);
- if ((fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, 06
66
)) < 0)
+ if ((fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, 06
44
)) < 0)
return -errno;
close_nointr_nofail(fd);
return -errno;
close_nointr_nofail(fd);
@@
-3945,33
+3959,32
@@
int detect_vm(const char **id) {
return 0;
}
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;
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)
if (id)
- *id =
cached_id
;
+ *id =
"chroot"
;
return 1;
}
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"))) {
}
if ((f = fopen("/proc/self/cgroup", "r"))) {
@@
-3991,36
+4004,49
@@
int detect_virtualization(const char **id) {
if (!streq(p, ":ns:/")) {
fclose(f);
if (!streq(p, ":ns:/")) {
fclose(f);
- r = 1;
- _id = "ns";
- goto finish;
+ if (id)
+ *id = "pidns";
+
+ return 1;
}
}
fclose(f);
}
}
}
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:
r = detect_vm(&_id);
finish:
- if (r < 0)
- return r;
- else if (r > 0)
+ if (r > 0) {
cached_id = _id;
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;
}
return r;
}