diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-04-22 01:59:11 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-04-22 01:59:11 +0200 |
commit | 3d9a412243035beeaaf3465a62065444a5adf21c (patch) | |
tree | da4fbcd887a2baa3d514c33975a322226ba392ff | |
parent | d29b05a4619c000918cbb9f1b9661bc53659c0b2 (diff) |
util: fix tty_is_vc_resolve() in a container where /sys/class/tty/console/active is misleading
-rw-r--r-- | TODO | 3 | ||||
-rw-r--r-- | src/core/condition.c | 10 | ||||
-rw-r--r-- | src/shared/util.c | 18 | ||||
-rw-r--r-- | src/shared/util.h | 1 |
4 files changed, 22 insertions, 10 deletions
@@ -20,6 +20,9 @@ Bugfixes: * properly handle .mount unit state tracking when two mount points are stacked one on top of another on the exact same mount point. Features: + +* Add pretty name for seats in logind + * nspawn wants dev_setup() for /dev/fd/ and friends? * selinux: merge systemd selinux access controls (dwalsh) diff --git a/src/core/condition.c b/src/core/condition.c index 3b246f1a64..5d44039e5d 100644 --- a/src/core/condition.c +++ b/src/core/condition.c @@ -223,14 +223,8 @@ bool condition_test(Condition *c) { case CONDITION_PATH_IS_MOUNT_POINT: return (path_is_mount_point(c->parameter, true) > 0) == !c->negate; - case CONDITION_PATH_IS_READ_WRITE: { - struct statvfs st; - - if (statvfs(c->parameter, &st) < 0) - return c->negate; - - return !(st.f_flag & ST_RDONLY) == !c->negate; - } + case CONDITION_PATH_IS_READ_WRITE: + return (path_is_read_only_fs(c->parameter) > 0) == c->negate; case CONDITION_DIRECTORY_NOT_EMPTY: { int k; diff --git a/src/shared/util.c b/src/shared/util.c index 15c7f4d325..43948ccbd8 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -56,6 +56,7 @@ #include <glob.h> #include <grp.h> #include <sys/mman.h> +#include <sys/statvfs.h> #include "macro.h" #include "util.h" @@ -4319,8 +4320,10 @@ bool tty_is_vc_resolve(const char *tty) { if (startswith(tty, "/dev/")) tty += 5; - /* Resolve where /dev/console is pointing to */ - if (streq(tty, "console")) + /* Resolve where /dev/console is pointing to, if /sys is + * actually ours (i.e. not read-only-mounted which is a sign + * for container setups) */ + if (streq(tty, "console") && path_is_read_only_fs("/sys") <= 0) if (read_one_line_file("/sys/class/tty/console/active", &active) >= 0) { /* If multiple log outputs are configured the * last one is what /dev/console points to */ @@ -6145,3 +6148,14 @@ int setrlimit_closest(int resource, const struct rlimit *rlim) { return 0; } + +int path_is_read_only_fs(const char *path) { + struct statvfs st; + + assert(path); + + if (statvfs(path, &st) < 0) + return -errno; + + return !!(st.f_flag & ST_RDONLY); +} diff --git a/src/shared/util.h b/src/shared/util.h index efb2c7d324..76bc7b3572 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -350,6 +350,7 @@ ssize_t loop_read(int fd, void *buf, size_t nbytes, bool do_poll); ssize_t loop_write(int fd, const void *buf, size_t nbytes, bool do_poll); int path_is_mount_point(const char *path, bool allow_symlink); +int path_is_read_only_fs(const char *path); bool is_device_path(const char *path); |