summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-01-15 14:27:10 -0500
committerKristian Høgsberg <krh@bitplanet.net>2012-01-15 15:25:01 -0500
commit1201b75bec3404a7e250b21928fe748e2d51813a (patch)
treed429a88538c5792a9b1d21698f692b0b39a4dcbb
parent2f6219f12738555104161a6fc37d8d4edb35f62b (diff)
tty: If no tty option is given, use stdin and make sure it's a vt
-rw-r--r--src/compositor-drm.c2
-rw-r--r--src/compositor-openwfd.c2
-rw-r--r--src/tty.c23
3 files changed, 20 insertions, 7 deletions
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index a6cedd5..0d2fc57 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -932,7 +932,7 @@ backend_init(struct wl_display *display, char *options)
int connector = 0, i;
const char *seat;
char *p, *value;
- int tty = 1;
+ int tty = 0;
static char * const tokens[] = { "connector", "seat", "tty", NULL };
diff --git a/src/compositor-openwfd.c b/src/compositor-openwfd.c
index caecf29..2299d99 100644
--- a/src/compositor-openwfd.c
+++ b/src/compositor-openwfd.c
@@ -675,7 +675,7 @@ backend_init(struct wl_display *display, char *options)
int connector = 0, i;
const char *seat;
char *p, *value;
- int tty = 1;
+ int tty = 0;
static char * const tokens[] = { "connector", "seat", "tty", NULL };
diff --git a/src/tty.c b/src/tty.c
index 9e55550..d9fce08 100644
--- a/src/tty.c
+++ b/src/tty.c
@@ -29,6 +29,7 @@
#include <signal.h>
#include <linux/kd.h>
#include <linux/vt.h>
+#include <linux/major.h>
#include <sys/ioctl.h>
#include "compositor.h"
@@ -97,21 +98,33 @@ tty_create(struct weston_compositor *compositor, tty_vt_func_t vt_func,
int ret;
struct tty *tty;
struct wl_event_loop *loop;
+ struct stat buf;
char filename[16];
tty = malloc(sizeof *tty);
if (tty == NULL)
return NULL;
- snprintf(filename, sizeof filename, "/dev/tty%d", tty_nr);
- fprintf(stderr, "compositor: using %s\n", filename);
-
memset(tty, 0, sizeof *tty);
tty->compositor = compositor;
tty->vt_func = vt_func;
- tty->fd = open(filename, O_RDWR | O_NOCTTY);
+ if (tty_nr > 0) {
+ snprintf(filename, sizeof filename, "/dev/tty%d", tty_nr);
+ fprintf(stderr, "compositor: using %s\n", filename);
+ tty->fd = open(filename, O_RDWR | O_NOCTTY | O_CLOEXEC);
+ } else {
+ tty->fd = fcntl(0, F_DUPFD_CLOEXEC, 0);
+ }
+
if (tty->fd <= 0) {
- fprintf(stderr, "failed to open active tty: %m\n");
+ fprintf(stderr, "failed to open tty: %m\n");
+ return NULL;
+ }
+
+ if (fstat(tty->fd, &buf) < 0 ||
+ major(buf.st_rdev) != TTY_MAJOR || minor(buf.st_rdev) == 0) {
+ fprintf(stderr, "stdin not a vt (%d, %d)\n",
+ major(buf.st_dev), minor(buf.st_dev));
return NULL;
}