diff options
Diffstat (limited to 'daemon/getvt.c')
-rw-r--r-- | daemon/getvt.c | 408 |
1 files changed, 0 insertions, 408 deletions
diff --git a/daemon/getvt.c b/daemon/getvt.c deleted file mode 100644 index 569ff773..00000000 --- a/daemon/getvt.c +++ /dev/null @@ -1,408 +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 <X11/Xlib.h> -#include <X11/Xatom.h> - -#include "gdm.h" -#include "misc.h" -#include "getvt.h" -#include "display.h" - -#include "gdm-common.h" -#include "gdm-daemon-config.h" -#include "gdm-log.h" - -/* - * Get the VT number associated with the display via the XFree86_VT - * Atom. - */ -long -gdm_get_current_vtnum (Display *display) -{ - Atom prop; - Atom actualtype; - int actualformat; - unsigned long nitems; - unsigned long bytes_after; - unsigned char *buf; - unsigned long num; - - prop = XInternAtom (display, "XFree86_VT", False); - if (prop == None) { - gdm_debug ("no XFree86_VT atom\n"); - return -1; - } - if (XGetWindowProperty (display, DefaultRootWindow (display), prop, 0, 1, - False, AnyPropertyType, &actualtype, &actualformat, - &nitems, &bytes_after, &buf)) { - gdm_debug ("no XFree86_VT property\n"); - return -1; - } - if (nitems != 1) { - gdm_debug ("%lu items in XFree86_VT property!\n", nitems); - XFree (buf); - return -1; - } - - switch (actualtype) { - case XA_CARDINAL: - case XA_INTEGER: - case XA_WINDOW: - switch (actualformat) { - case 8: - num = (*(uint8_t *)(void *)buf); - break; - case 16: - num = (*(uint16_t *)(void *)buf); - break; - case 32: - num = (*(uint32_t *)(void *)buf); - break; - default: - gdm_debug ("format %d in XFree86_VT property!\n", actualformat); - XFree (buf); - return -1; - } - break; - default: - gdm_debug ("type %lx in XFree86_VT property!\n", actualtype); - XFree (buf); - return -1; - } - XFree (buf); - return num; -} - -#if defined (GDM_USE_SYS_VT) -#include <sys/vt.h> -#elif defined (GDM_USE_CONSIO_VT) -#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 - - -gchar * -gdm_get_vt_device (int vtno) -{ - gchar *vtname = NULL; - -#if defined (GDM_USE_SYS_VT) -#ifdef __sun - vtname = g_strdup_printf ("/dev/vt/%d", vtno); -#else - vtname = g_strdup_printf ("/dev/tty%d", vtno); -#endif -#elif defined (GDM_USE_CONSIO_VT) - vtname = g_strdup_printf ("/dev/ttyv%s", __itovty (vtno - 1)); -#endif - - return vtname; -} - -#if defined (GDM_USE_SYS_VT) || defined (GDM_USE_CONSIO_VT) - -#ifdef __sun -#define GDMCONSOLEDEVICE "/dev/vt/0" -#else -#define GDMCONSOLEDEVICE "/dev/console" -#endif - - -static int -open_vt (int vtno) -{ - char *vtname = NULL; - int fd = -1; - - vtname = gdm_get_vt_device (vtno); - - 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 (GDM_USE_SYS_VT) - -static int -get_free_vt_sys (int *vtfd) -{ - int fd, fdv; - int vtno; - unsigned short vtmask; - struct vt_stat vtstat; - - *vtfd = -1; - - do { - errno = 0; - fd = open (GDMCONSOLEDEVICE, - 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_daemon_config_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 (GDM_USE_CONSIO_VT) - -static int -get_free_vt_consio (int *vtfd) -{ - int fd, fdv; - int vtno; - GList *to_close_vts = NULL, *li; - - *vtfd = -1; - - do { - errno = 0; - fd = open (GDMCONSOLEDEVICE, - 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_daemon_config_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_daemon_config_get_value_bool (GDM_KEY_VT_ALLOCATION)) { - *fd = -1; - return NULL; - } - -#if defined (GDM_USE_SYS_VT) - *vt = get_free_vt_sys (fd); -#elif defined (GDM_USE_CONSIO_VT) - *vt = get_free_vt_consio (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; - int rc; - if (vt < 0) - return; - - do { - errno = 0; - fd = open (GDMCONSOLEDEVICE, - O_WRONLY -#ifdef O_NOCTTY - |O_NOCTTY -#endif - , 0); - } while G_UNLIKELY (errno == EINTR); - if (fd < 0) - return; - - rc = ioctl (fd, VT_ACTIVATE, vt); - rc = ioctl (fd, VT_WAITACTIVE, vt); - - VE_IGNORE_EINTR (close (fd)); -} - -int -gdm_get_current_vt (void) -{ -#if defined (GDM_USE_SYS_VT) - struct vt_stat s; -#elif defined (GDM_USE_CONSIO_VT) - int vtno; -#endif - int fd; - - do { - errno = 0; - fd = open (GDMCONSOLEDEVICE, - O_WRONLY -#ifdef O_NOCTTY - |O_NOCTTY -#endif - , 0); - } while G_UNLIKELY (errno == EINTR); - if (fd < 0) - return -1; -#if defined (GDM_USE_SYS_VT) - 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 (GDM_USE_CONSIO_VT) - 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 /* GDM_USE_SYS_VT || GDM_USE_CONSIO_VT - Here this is just - * a stub, we do not know how to support this on other - * platforms - */ - -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_current_vt (void) -{ - return -1; -} - -#endif |