summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-04-22 01:59:11 +0200
committerLennart Poettering <lennart@poettering.net>2012-04-22 01:59:11 +0200
commit3d9a412243035beeaaf3465a62065444a5adf21c (patch)
treeda4fbcd887a2baa3d514c33975a322226ba392ff
parentd29b05a4619c000918cbb9f1b9661bc53659c0b2 (diff)
util: fix tty_is_vc_resolve() in a container where /sys/class/tty/console/active is misleading
-rw-r--r--TODO3
-rw-r--r--src/core/condition.c10
-rw-r--r--src/shared/util.c18
-rw-r--r--src/shared/util.h1
4 files changed, 22 insertions, 10 deletions
diff --git a/TODO b/TODO
index a008fe6150..62b5ebf6e4 100644
--- a/TODO
+++ b/TODO
@@ -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);