/* * Copyright 1999 Egbert Eich * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of the authors not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. The authors makes no representations * about the suitability of this software for any purpose. It is provided * "as is" without express or implied warranty. * * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include #include #include #include "debug.h" #include "v86bios.h" console open_console(void) { int fd; int VTno; char VTname[11]; console Con = {-1,-1}; struct vt_stat vts; if (NO_CONSOLE) return Con; if ((fd = open("/dev/tty0",O_WRONLY,0)) < 0) return Con; if ((ioctl(fd, VT_OPENQRY, &VTno) < 0) || (VTno == -1)) { fprintf(stderr,"cannot get a vt\n"); return Con; } close(fd); sprintf(VTname,"/dev/tty%i",VTno); if ((fd = open(VTname, O_RDWR|O_NDELAY, 0)) < 0) { fprintf(stderr,"cannot open console\n"); return Con; } if (ioctl(fd, VT_GETSTATE, &vts) == 0) Con.vt = vts.v_active; if (ioctl(fd, VT_ACTIVATE, VTno) != 0) { fprintf(stderr,"cannot activate console\n"); close(fd); return Con; } if (ioctl(fd, VT_WAITACTIVE, VTno) != 0) { fprintf(stderr,"wait for active console failed\n"); close(fd); return Con; } #if 0 if (ioctl(fd, KDSETMODE, KD_GRAPHICS) < 0) { close(fd); return Con; } #endif Con.fd = fd; return Con; } void close_console(console Con) { if (Con.fd == -1) return; #if 0 ioctl(Con.fd, KDSETMODE, KD_TEXT); #endif if (Con.vt >=0) ioctl(Con.fd, VT_ACTIVATE, Con.vt); close(Con.fd); }