summaryrefslogtreecommitdiff
path: root/daemon/getvt.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/getvt.c')
-rw-r--r--daemon/getvt.c310
1 files changed, 0 insertions, 310 deletions
diff --git a/daemon/getvt.c b/daemon/getvt.c
deleted file mode 100644
index c8eddfe2..00000000
--- a/daemon/getvt.c
+++ /dev/null
@@ -1,310 +0,0 @@
-/* GDM - The GNOME Display Manager
- * Copyright (C) 1998, 1999, 2000 Martin K. Petersen <mkp@mkp.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "config.h"
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <dirent.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include "gdm.h"
-#include "misc.h"
-#include "getvt.h"
-#include "gdmconfig.h"
-
-/* Virtual terminals only supported on Linux, FreeBSD, or DragonFly */
-
-#if defined (__linux__) || defined (__FreeBSD__) || defined (__DragonFly__)
-
-#if defined (__linux__)
-#include <sys/vt.h>
-#elif defined (__FreeBSD__) || defined (__DragonFly__)
-#include <sys/consio.h>
-
-static const char*
-__itovty (int val)
-{
- static char str[8];
- char* next = str + sizeof (str) - 1;
-
- *next = '\0';
- do {
- *--next = "0123456789abcdefghigklmnopqrstuv"[val % 32];
- } while (val /= 32);
-
- return next;
-}
-#endif
-
-static int
-open_vt (int vtno)
-{
- char *vtname;
- int fd;
-
-#if defined (__linux__)
- vtname = g_strdup_printf ("/dev/tty%d", vtno);
-#elif defined (__FreeBSD__) || defined (__DragonFly__)
- vtname = g_strdup_printf ("/dev/ttyv%s", __itovty (vtno - 1));
-#endif
- do {
- errno = 0;
- fd = open (vtname, O_RDWR
-#ifdef O_NOCTTY
- |O_NOCTTY
-#endif
- , 0);
- } while G_UNLIKELY (errno == EINTR);
- g_free (vtname);
- return fd;
-}
-
-#if defined (__linux__)
-
-static int
-get_free_vt_linux (int *vtfd)
-{
- int fd, fdv;
- int vtno;
- unsigned short vtmask;
- struct vt_stat vtstat;
-
- *vtfd = -1;
-
- do {
- errno = 0;
- fd = open ("/dev/console", O_WRONLY
-#ifdef O_NOCTTY
- |O_NOCTTY
-#endif
- , 0);
- } while G_UNLIKELY (errno == EINTR);
- if (fd < 0)
- return -1;
-
- if (ioctl (fd, VT_GETSTATE, &vtstat) < 0) {
- VE_IGNORE_EINTR (close (fd));
- return -1;
- }
-
- for (vtno = gdm_get_value_int (GDM_KEY_FIRST_VT), vtmask = 1 << vtno;
- vtstat.v_state & vtmask; vtno++, vtmask <<= 1);
- if (!vtmask) {
- VE_IGNORE_EINTR (close (fd));
- return -1;
- }
-
- fdv = open_vt (vtno);
- if (fdv < 0) {
- VE_IGNORE_EINTR (close (fd));
- return -1;
- }
- *vtfd = fdv;
- return vtno;
-}
-
-#elif defined (__FreeBSD__) || defined (__DragonFly__)
-
-static int
-get_free_vt_freebsd_dragonfly (int *vtfd)
-{
- int fd, fdv;
- int vtno;
- GList *to_close_vts = NULL, *li;
-
- *vtfd = -1;
-
- do {
- errno = 0;
- fd = open ("/dev/console", O_WRONLY
-#ifdef O_NOCTTY
- |O_NOCTTY
-#endif
- , 0);
- } while G_UNLIKELY (errno == EINTR);
- if (fd < 0)
- return -1;
-
- if ((ioctl (fd, VT_OPENQRY, &vtno) < 0) || (vtno == -1)) {
- VE_IGNORE_EINTR (close (fd));
- return -1;
- }
-
- fdv = open_vt (vtno);
- if (fdv < 0) {
- VE_IGNORE_EINTR (close (fd));
- return -1;
- }
-
- while (vtno < gdm_get_value_int (GDM_KEY_FIRST_VT)) {
- int oldvt = vtno;
- to_close_vts = g_list_prepend (to_close_vts,
- GINT_TO_POINTER (fdv));
-
- if (ioctl (fd, VT_OPENQRY, &vtno) == -1) {
- vtno = -1;
- goto cleanup;
- }
-
- if (oldvt == vtno) {
- vtno = -1;
- goto cleanup;
- }
-
- fdv = open_vt (vtno);
- if (fdv < 0) {
- vtno = -1;
- goto cleanup;
- }
- }
-
- *vtfd = fdv;
-
-cleanup:
- for (li = to_close_vts; li != NULL; li = li->next) {
- VE_IGNORE_EINTR (close (GPOINTER_TO_INT (li->data)));
- }
- return vtno;
-}
-
-#endif
-
-char *
-gdm_get_empty_vt_argument (int *fd, int *vt)
-{
- if ( ! gdm_get_value_bool (GDM_KEY_VT_ALLOCATION)) {
- *fd = -1;
- return NULL;
- }
-
-#if defined (__linux__)
- *vt = get_free_vt_linux (fd);
-#elif defined (__FreeBSD__) || defined (__DragonFly__)
- *vt = get_free_vt_freebsd_dragonfly (fd);
-#endif
-
- if (*vt < 0)
- return NULL;
- else
- return g_strdup_printf ("vt%d", *vt);
-}
-
-/* change to an existing vt */
-void
-gdm_change_vt (int vt)
-{
- int fd;
- if (vt < 0)
- return;
-
- do {
- errno = 0;
- fd = open ("/dev/console", O_WRONLY
-#ifdef O_NOCTTY
- |O_NOCTTY
-#endif
- , 0);
- } while G_UNLIKELY (errno == EINTR);
- if (fd < 0)
- return;
-
- ioctl (fd, VT_ACTIVATE, vt);
- ioctl (fd, VT_WAITACTIVE, vt);
-
- VE_IGNORE_EINTR (close (fd));
-}
-
-int
-gdm_get_cur_vt (void)
-{
-#if defined (__linux__)
- struct vt_stat s;
-#elif defined (__FreeBSD__) || defined (__DragonFly__)
- int vtno;
-#endif
- int fd;
-
- do {
- errno = 0;
- fd = open ("/dev/console", O_WRONLY
-#ifdef O_NOCTTY
- |O_NOCTTY
-#endif
- , 0);
- } while G_UNLIKELY (errno == EINTR);
- if (fd < 0)
- return -1;
-#if defined (__linux__)
- ioctl (fd, VT_GETSTATE, &s);
-
- VE_IGNORE_EINTR (close (fd));
-
- /* debug */
- /*
- printf ("current_Active %d\n", (int)s.v_active);
- */
-
- return s.v_active;
-#elif defined (__FreeBSD__) || defined (__DragonFly__)
- if (ioctl (fd, VT_GETACTIVE, &vtno) == -1) {
- VE_IGNORE_EINTR (close (fd));
- return -1;
- }
-
- VE_IGNORE_EINTR (close (fd));
-
- /* debug */
- /*
- printf ("current_Active %d\n", vtno);
- */
-
- return vtno;
-#endif
-}
-
-#else /* here this is just a stub, we don't know how to do this outside
- of linux really */
-
-char *
-gdm_get_empty_vt_argument (int *fd, int *vt)
-{
- *fd = -1;
- *vt = -1;
- return NULL;
-}
-
-void
-gdm_change_vt (int vt)
-{
- return;
-}
-
-int
-gdm_get_cur_vt (void)
-{
- return -1;
-}
-
-#endif