From e2ad7a18f99d403ab9c7a8984272b6c098cec960 Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Tue, 8 Jul 2014 12:05:13 -0400 Subject: [PATCH] Revert "evas/drm: Remove obsolete tty open function" This reverts commit 1db13194a23e8ed0afa01474031cc8e2d4fc4049. Revert this commit as this is needed to run the evas engine in standalone situations like expedite. --- src/modules/evas/engines/drm/evas_drm.c | 85 +++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/src/modules/evas/engines/drm/evas_drm.c b/src/modules/evas/engines/drm/evas_drm.c index d26874f57d..e5bd74d1be 100644 --- a/src/modules/evas/engines/drm/evas_drm.c +++ b/src/modules/evas/engines/drm/evas_drm.c @@ -8,6 +8,63 @@ * pass any 'user data' to the signal handlers :( */ static Evas_Engine_Info_Drm *siginfo; +static int +_evas_drm_tty_open(Evas_Engine_Info_Drm *info) +{ + int tty = STDIN_FILENO; + + /* check if the current stdin is a valid tty */ + if (!isatty(tty)) + { + /* if not, try to open the curren tty */ + if ((tty = open("/dev/tty", (O_RDWR | O_CLOEXEC))) < 0) + { + int tty0 = -1, num = -1; + char name[16]; + + /* if that fails, try tty0 */ + if ((tty0 = open("/dev/tty0", (O_WRONLY | O_CLOEXEC))) < 0) + { + CRI("Could not open tty0: %m"); + return -1; + } + + /* try to find a non-opened tty */ + if ((ioctl(tty0, VT_OPENQRY, &num) < 0) || (num < 0)) + { + CRI("Could not find a non-opened tty"); + close(tty0); + return -1; + } + + snprintf(name, sizeof(name), "/dev/tty%d", num); + + /* try to open this tty */ + if ((tty = open(name, (O_RDWR | O_CLOEXEC))) < 0) + { + CRI("Could not open tty: %s", name); + close(tty0); + return -1; + } + + /* set flag that evas should close this tty */ + info->info.own_tty = EINA_TRUE; + + /* close /dev/tty0 */ + close(tty0); + } + } + else + { + /* set flag that evas should close this tty */ + info->info.own_tty = EINA_TRUE; + } + + DBG("Opened Tty %d", tty); + + return tty; +} + static int _evas_drm_crtc_find(int fd, drmModeRes *res, drmModeConnector *conn) { @@ -260,9 +317,30 @@ evas_drm_init(Evas_Engine_Info_Drm *info) setvbuf(stdout, NULL, _IONBF, 0); + /* check if we already opened the tty */ + if (info->info.tty < 0) + { + /* try to open the current tty */ + if ((info->info.tty = _evas_drm_tty_open(info)) < 0) + { + /* check if we already opened the card. if so, close it */ + if ((info->info.fd >= 0) && (info->info.own_fd)) + { + close(info->info.fd); + info->info.fd = -1; + } + + return EINA_FALSE; + } + } + /* with the tty opened, we need to set it up */ if (!_evas_drm_tty_setup(info)) { + /* setup of tty failed, close it */ + if ((info->info.tty >= 0) && (info->info.own_tty)) + close(info->info.tty); + return EINA_FALSE; } @@ -275,6 +353,13 @@ evas_drm_shutdown(Evas_Engine_Info_Drm *info) /* check for valid engine info */ if (!info) return EINA_TRUE; + /* check if we already opened the tty. if so, close it */ + if ((info->info.tty >= 0) && (info->info.own_tty)) + { + close(info->info.tty); + info->info.tty = -1; + } + return EINA_TRUE; }