util: fix tty_is_vc_resolve() in a container where /sys/class/tty/console/active is misleading

This commit is contained in:
Lennart Poettering
2012-04-22 01:59:11 +02:00
parent d29b05a461
commit 3d9a412243
4 changed files with 22 additions and 10 deletions
+16 -2
View File
@@ -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);
}
+1
View File
@@ -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);