#include <signal.h>
#include <linux/kd.h>
#include <linux/vt.h>
+#include <linux/major.h>
#include <sys/ioctl.h>
#include "compositor.h"
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;
}