tty: If no tty option is given, use stdin and make sure it's a vt
authorKristian Høgsberg <krh@bitplanet.net>
Sun, 15 Jan 2012 19:27:10 +0000 (14:27 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Sun, 15 Jan 2012 20:25:01 +0000 (15:25 -0500)
src/compositor-drm.c
src/compositor-openwfd.c
src/tty.c

index a6cedd5..0d2fc57 100644 (file)
@@ -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 };
 
index caecf29..2299d99 100644 (file)
@@ -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 };
        
index 9e55550..d9fce08 100644 (file)
--- 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;
        }