diff options
author | Kevin E Martin <kem@kem.org> | 2004-09-17 15:38:19 +0000 |
---|---|---|
committer | Kevin E Martin <kem@kem.org> | 2004-09-17 15:38:19 +0000 |
commit | 0e3171a83a79c1495b842daf07b3eeee4c9fd612 (patch) | |
tree | 165558ee6a9a2735616787fbc4a07f77a9af81f0 /hw/xfree86/os-support/linux | |
parent | 516f452e78170bc643117a71bd2246a83b071316 (diff) |
Update the XORG_DATE for the release.XORG-6_8_1
Update cygwin release version.
Update documentation for release.
Diffstat (limited to 'hw/xfree86/os-support/linux')
-rw-r--r-- | hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c | 4 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx.h | 2 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnxResource.c | 13 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_KbdMap.c | 2 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_agp.c | 10 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_apm.c | 2 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_axp.c | 2 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_ev56.c | 2 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_init.c | 78 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_io.c | 16 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_jstk.c | 2 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_kbd.c | 17 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_kbd.h | 2 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_kmod.c | 2 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_mouse.c | 175 | ||||
-rw-r--r-- | hw/xfree86/os-support/linux/lnx_pci.c | 2 |
16 files changed, 274 insertions, 57 deletions
diff --git a/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c b/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c index 6203cc3c3..e9cb6125a 100644 --- a/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c +++ b/hw/xfree86/os-support/linux/int10/vm86/linux_vm86.c @@ -1,3 +1,5 @@ +/* $XFree86$ */ + #include "xf86.h" #include "xf86_OSproc.h" #include "xf86_ansic.h" @@ -173,7 +175,7 @@ vm86_GP_fault(xf86Int10InfoPtr pInt) case 0x0f: xf86DrvMsg(pInt->scrnIndex, X_ERROR, - "CPU 0x0f Trap at CS:EIP=0x%4.4x:0x%8.8x\n", X86_CS, X86_EIP); + "CPU 0x0f Trap at CS:EIP=0x%4.4x:0x%8.8lx\n", X86_CS, X86_EIP); goto op0ferr; default: diff --git a/hw/xfree86/os-support/linux/lnx.h b/hw/xfree86/os-support/linux/lnx.h index f2dd16267..b2adcd514 100644 --- a/hw/xfree86/os-support/linux/lnx.h +++ b/hw/xfree86/os-support/linux/lnx.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx.h,v 3.3 2002/11/25 14:05:04 eich Exp $ */ +/* $XFree86: Exp $ */ #ifndef LNX_H_ # ifdef __alpha__ diff --git a/hw/xfree86/os-support/linux/lnxResource.c b/hw/xfree86/os-support/linux/lnxResource.c index 04e2f07c0..25ef8cc91 100644 --- a/hw/xfree86/os-support/linux/lnxResource.c +++ b/hw/xfree86/os-support/linux/lnxResource.c @@ -190,7 +190,8 @@ xf86AccResFromOS(resPtr ret) defined(__s390__) || \ defined(__hppa__) - /* XXX this isn't exactly correct but it will get the server working + /* + * XXX this isn't exactly correct but it will get the server working * for now until we get something better. */ @@ -203,7 +204,7 @@ xf86BusAccWindowsFromOS(void) RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); ret = xf86AddResToList(ret, &range, -1); -#ifdef __sparc__ +#if defined(__sparc__) || defined(__powerpc__) RANGE(range, 0x00000000, 0x00ffffff, ResExcIoBlock); #else RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); @@ -221,7 +222,7 @@ xf86PciBusAccWindowsFromOS(void) RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); ret = xf86AddResToList(ret, &range, -1); -#ifdef __sparc__ +#if defined(__sparc__) || defined(__powerpc__) RANGE(range, 0x00000000, 0x00ffffff, ResExcIoBlock); #else RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); @@ -230,7 +231,7 @@ xf86PciBusAccWindowsFromOS(void) return ret; } -#ifdef INCLUDE_UNUSED */ +#ifdef INCLUDE_UNUSED resPtr xf86IsaBusAccWindowsFromOS(void) @@ -241,7 +242,7 @@ xf86IsaBusAccWindowsFromOS(void) RANGE(range, 0x00000000, 0xffffffff, ResExcMemBlock); ret = xf86AddResToList(ret, &range, -1); -#ifdef __sparc__ +#if defined(__sparc__) || defined(__powerpc__) RANGE(range, 0x00000000, 0x00ffffff, ResExcIoBlock); #else RANGE(range, 0x00000000, 0x0000ffff, ResExcIoBlock); @@ -267,7 +268,7 @@ xf86AccResFromOS(resPtr ret) ret = xf86AddResToList(ret, &range, -1); RANGE(range, 0x00000000, 0x00000000, ResExcIoBlock); ret = xf86AddResToList(ret, &range, -1); -#ifdef __sparc__ +#if defined(__sparc__) || defined(__powerpc__) RANGE(range, 0x00ffffff, 0x00ffffff, ResExcIoBlock); #else RANGE(range, 0x0000ffff, 0x0000ffff, ResExcIoBlock); diff --git a/hw/xfree86/os-support/linux/lnx_KbdMap.c b/hw/xfree86/os-support/linux/lnx_KbdMap.c index 25639d72d..993679d81 100644 --- a/hw/xfree86/os-support/linux/lnx_KbdMap.c +++ b/hw/xfree86/os-support/linux/lnx_KbdMap.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_KbdMap.c,v 1.1 2002/10/11 01:40:35 dawes Exp $ */ +/* $XFree86$ */ /* * Slightly modified xf86KbdLnx.c which is diff --git a/hw/xfree86/os-support/linux/lnx_agp.c b/hw/xfree86/os-support/linux/lnx_agp.c index 05e299b11..58f1062da 100644 --- a/hw/xfree86/os-support/linux/lnx_agp.c +++ b/hw/xfree86/os-support/linux/lnx_agp.c @@ -263,14 +263,14 @@ xf86BindGARTMemory(int screenNum, int key, unsigned long offset) if (offset % AGP_PAGE_SIZE != 0) { xf86DrvMsg(screenNum, X_WARNING, "xf86BindGARTMemory: " - "offset (0x%x) is not page-aligned (%d)\n", + "offset (0x%lx) is not page-aligned (%d)\n", offset, AGP_PAGE_SIZE); return FALSE; } pageOffset = offset / AGP_PAGE_SIZE; xf86DrvMsgVerb(screenNum, X_INFO, 3, - "xf86BindGARTMemory: bind key %d at 0x%08x " + "xf86BindGARTMemory: bind key %d at 0x%08lx " "(pgoffset %d)\n", key, offset, pageOffset); bind.pg_start = pageOffset; @@ -279,7 +279,7 @@ xf86BindGARTMemory(int screenNum, int key, unsigned long offset) if (ioctl(gartFd, AGPIOC_BIND, &bind) != 0) { xf86DrvMsg(screenNum, X_WARNING, "xf86BindGARTMemory: " "binding of gart memory with key %d\n" - "\tat offset 0x%x failed (%s)\n", + "\tat offset 0x%lx failed (%s)\n", key, offset, strerror(errno)); return FALSE; } @@ -332,8 +332,8 @@ xf86EnableAGP(int screenNum, CARD32 mode) setup.agp_mode = mode; if (ioctl(gartFd, AGPIOC_SETUP, &setup) != 0) { xf86DrvMsg(screenNum, X_WARNING, "xf86EnableAGP: " - "AGPIOC_SETUP with mode %d failed (%s)\n", - mode, strerror(errno)); + "AGPIOC_SETUP with mode %ld failed (%s)\n", + (unsigned long)mode, strerror(errno)); return FALSE; } diff --git a/hw/xfree86/os-support/linux/lnx_apm.c b/hw/xfree86/os-support/linux/lnx_apm.c index f2f326959..1f9142a6b 100644 --- a/hw/xfree86/os-support/linux/lnx_apm.c +++ b/hw/xfree86/os-support/linux/lnx_apm.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_apm.c,v 3.13 2002/10/16 01:24:28 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_apm.c,v 3.12 2001/12/24 22:54:31 dawes Exp $ */ #include "X.h" #include "os.h" diff --git a/hw/xfree86/os-support/linux/lnx_axp.c b/hw/xfree86/os-support/linux/lnx_axp.c index 5813ef4e9..106aa2804 100644 --- a/hw/xfree86/os-support/linux/lnx_axp.c +++ b/hw/xfree86/os-support/linux/lnx_axp.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_axp.c,v 1.5 2002/11/25 14:05:04 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_axp.c,v 1.3 2001/02/15 11:03:56 alanh Exp $ */ #include <stdio.h> #include "X.h" diff --git a/hw/xfree86/os-support/linux/lnx_ev56.c b/hw/xfree86/os-support/linux/lnx_ev56.c index bfcb0d70f..8381fec27 100644 --- a/hw/xfree86/os-support/linux/lnx_ev56.c +++ b/hw/xfree86/os-support/linux/lnx_ev56.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_ev56.c,v 3.7 2002/11/25 14:05:04 eich Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_ev56.c,v 3.5 2000/02/17 13:45:49 dawes Exp $ */ #include "X.h" #include "input.h" diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c index 0ac8c6a8b..ea305e38d 100644 --- a/hw/xfree86/os-support/linux/lnx_init.c +++ b/hw/xfree86/os-support/linux/lnx_init.c @@ -1,3 +1,4 @@ +/* $XdotOrg: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c,v 3.15 2003/12/02 20:45:13 dawes Exp $ */ /* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c,v 3.14 2001/10/31 22:50:30 tsi Exp $ */ /* * Copyright 1992 by Orest Zborowski <obz@Kodak.com> @@ -7,19 +8,19 @@ * 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 names of Orest Zborowski and David Wexelblat - * not be used in advertising or publicity pertaining to distribution of + * documentation, and that the names of Orest Zborowski and David Wexelblat + * not be used in advertising or publicity pertaining to distribution of * the software without specific, written prior permission. Orest Zborowski - * and David Wexelblat make no representations about the suitability of this - * software for any purpose. It is provided "as is" without express or + * and David Wexelblat make no representations about the suitability of this + * software for any purpose. It is provided "as is" without express or * implied warranty. * - * OREST ZBOROWSKI AND DAVID WEXELBLAT DISCLAIMS ALL WARRANTIES WITH REGARD - * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS, IN NO EVENT SHALL OREST ZBOROWSKI OR DAVID WEXELBLAT 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 + * OREST ZBOROWSKI AND DAVID WEXELBLAT DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL OREST ZBOROWSKI OR DAVID WEXELBLAT 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. * */ @@ -35,6 +36,8 @@ #include "xf86_OSlib.h" #include "lnx.h" +#include <sys/stat.h> + #ifdef USE_DEV_FB extern char *getenv(const char *); #include <linux/fb.h> @@ -45,13 +48,44 @@ static Bool KeepTty = FALSE; static int VTnum = -1; static int activeVT = -1; +static int vtPermSave[4]; +static char vtname[11]; + +static int +saveVtPerms(void) +{ + /* We need to use stat to get permissions. */ + struct stat svtp; + + /* Do them numerically ordered, hard coded tty0 first. */ + if (stat("/dev/tty0", &svtp) != 0) + return 0; + vtPermSave[0] = (int)svtp.st_uid; + vtPermSave[1] = (int)svtp.st_gid; + + /* Now check the console we are dealing with. */ + if (stat(vtname, &svtp) != 0) + return 0; + vtPermSave[2] = (int)svtp.st_uid; + vtPermSave[3] = (int)svtp.st_gid; + + return 1; +} + +static void +restoreVtPerms(void) +{ + /* Set the terminal permissions back to before we started. */ + chown("/dev/tty0", vtPermSave[0], vtPermSave[1]); + chown(vtname, vtPermSave[2], vtPermSave[3]); +} + void xf86OpenConsole(void) { int i, fd = -1; int result; struct vt_mode VT; - char vtname[11]; struct vt_stat vts; MessageType from = X_PROBED; #ifdef USE_DEV_FB @@ -61,7 +95,7 @@ xf86OpenConsole(void) char *tty0[] = { "/dev/tty0", "/dev/vc/0", NULL }; char *vcs[] = { "/dev/vc/%d", "/dev/tty%d", NULL }; - if (serverGeneration == 1) + if (serverGeneration == 1) { /* check if we're run with euid==0 */ if (geteuid() != 0) @@ -124,6 +158,15 @@ xf86OpenConsole(void) xf86Info.vtno, strerror(errno)); } + /* + * Grab the vt ownership before we overwrite it. + * Hard coded /dev/tty0 into this function as well for below. + */ + if (!saveVtPerms()){ + xf86Msg(X_WARNING, + "xf86OpenConsole: Could not save ownership of VT\n"); + } + /* change ownership of the vt */ chown(vtname, getuid(), getgid()); @@ -171,7 +214,7 @@ xf86OpenConsole(void) xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n"); } SYSCALL(result = ioctl(xf86Info.consoleFd, VT_GETMODE, &VT)); - if (result < 0) + if (result < 0) { FatalError("xf86OpenConsole: VT_GETMODE failed\n"); } @@ -181,7 +224,7 @@ xf86OpenConsole(void) VT.mode = VT_PROCESS; VT.relsig = SIGUSR1; VT.acqsig = SIGUSR1; - if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0) + if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0) { FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n"); } @@ -202,7 +245,7 @@ xf86OpenConsole(void) close(fbfd); #endif } - else + else { /* serverGeneration != 1 */ /* @@ -247,6 +290,9 @@ xf86CloseConsole() activeVT = -1; } close(xf86Info.consoleFd); /* make the vt-manager happy */ + + restoreVtPerms(); /* restore the permissions */ + return; } @@ -254,7 +300,7 @@ int xf86ProcessArgument(int argc, char *argv[], int i) { /* - * Keep server from detaching from controlling tty. This is useful + * Keep server from detaching from controlling tty. This is useful * when debugging (so the server can receive keyboard signals. */ if (!strcmp(argv[i], "-keeptty")) diff --git a/hw/xfree86/os-support/linux/lnx_io.c b/hw/xfree86/os-support/linux/lnx_io.c index 303c6e3d3..dda1ff8ef 100644 --- a/hw/xfree86/os-support/linux/lnx_io.c +++ b/hw/xfree86/os-support/linux/lnx_io.c @@ -90,10 +90,9 @@ KDKBDREP_ioctl_ok(int rate, int delay) { /* don't change, just test */ kbdrep_s.rate = -1; kbdrep_s.delay = -1; - if (ioctl( 0, KDKBDREP, &kbdrep_s )) { + if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) { return 0; } - /* do the change */ if (rate == 0) /* switch repeat off */ kbdrep_s.rate = 0; @@ -105,7 +104,7 @@ KDKBDREP_ioctl_ok(int rate, int delay) { if (kbdrep_s.delay < 1) kbdrep_s.delay = 1; - if (ioctl( 0, KDKBDREP, &kbdrep_s )) { + if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) { return 0; } @@ -130,8 +129,9 @@ KIOCSRATE_ioctl_ok(int rate, int delay) { if (kbdrate_s.rate > 50) kbdrate_s.rate = 50; - if (ioctl( fd, KIOCSRATE, &kbdrate_s )) - return 0; + if (ioctl( fd, KIOCSRATE, &kbdrate_s )) { + return 0; + } close( fd ); @@ -143,12 +143,7 @@ KIOCSRATE_ioctl_ok(int rate, int delay) { #undef rate -#if NeedFunctionPrototypes void xf86SetKbdRepeat(char rad) -#else -void xf86SetKbdRepeat(rad) -char rad; -#endif { #ifdef __sparc__ int rate = 500; /* Default rate */ @@ -178,7 +173,6 @@ char rad; if (xf86Info.kbdDelay >= 0) delay = xf86Info.kbdDelay; - if(KDKBDREP_ioctl_ok(rate, delay)) /* m68k? */ return; diff --git a/hw/xfree86/os-support/linux/lnx_jstk.c b/hw/xfree86/os-support/linux/lnx_jstk.c index 2423bd45e..90a8bc106 100644 --- a/hw/xfree86/os-support/linux/lnx_jstk.c +++ b/hw/xfree86/os-support/linux/lnx_jstk.c @@ -23,7 +23,7 @@ * */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_jstk.c,v 3.13 1998/07/25 16:56:43 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_jstk.c,v 3.8.2.1 1998/06/05 16:23:12 dawes Exp $ */ static const char rcs_id[] = "Id: lnx_jstk.c,v 1.1 1995/12/20 14:06:09 lepied Exp"; diff --git a/hw/xfree86/os-support/linux/lnx_kbd.c b/hw/xfree86/os-support/linux/lnx_kbd.c index 1344cecec..68f3af38b 100644 --- a/hw/xfree86/os-support/linux/lnx_kbd.c +++ b/hw/xfree86/os-support/linux/lnx_kbd.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kbd.c,v 1.3 2003/08/19 17:32:34 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kbd.c,v 1.4 2003/11/03 05:11:52 tsi Exp $ */ /* * Copyright (c) 2002 by The XFree86 Project, Inc. @@ -27,7 +27,7 @@ static KbdProtocolRec protocols[] = { {"standard", PROT_STD }, - { NULL, PROT_UNKNOWN } + { NULL, PROT_UNKNOWN_KBD } }; extern Bool VTSwitchEnabled; @@ -117,7 +117,7 @@ KDKBDREP_ioctl_ok(int rate, int delay) { /* don't change, just test */ kbdrep_s.rate = -1; kbdrep_s.delay = -1; - if (ioctl( 0, KDKBDREP, &kbdrep_s )) { + if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) { return 0; } @@ -132,8 +132,8 @@ KDKBDREP_ioctl_ok(int rate, int delay) { if (kbdrep_s.delay < 1) kbdrep_s.delay = 1; - if (ioctl( 0, KDKBDREP, &kbdrep_s )) { - return 0; + if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) { + return 0; } return 1; /* success! */ @@ -157,8 +157,9 @@ KIOCSRATE_ioctl_ok(int rate, int delay) { if (kbdrate_s.rate > 50) kbdrate_s.rate = 50; - if (ioctl( fd, KIOCSRATE, &kbdrate_s )) - return 0; + if (ioctl( fd, KIOCSRATE, &kbdrate_s )) { + return 0; + } close( fd ); @@ -446,7 +447,7 @@ OpenKeyboard(InputInfoPtr pInfo) { KbdDevPtr pKbd = (KbdDevPtr) pInfo->private; int i; - KbdProtocolId prot = PROT_UNKNOWN; + KbdProtocolId prot = PROT_UNKNOWN_KBD; char *s; s = xf86SetStrOption(pInfo->options, "Protocol", NULL); diff --git a/hw/xfree86/os-support/linux/lnx_kbd.h b/hw/xfree86/os-support/linux/lnx_kbd.h index ac783bfbc..7b9cd434e 100644 --- a/hw/xfree86/os-support/linux/lnx_kbd.h +++ b/hw/xfree86/os-support/linux/lnx_kbd.h @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kbd.h,v 1.1 2002/10/11 01:40:35 dawes Exp $ */ +/* $XFree86$ */ extern void KbdGetMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap); diff --git a/hw/xfree86/os-support/linux/lnx_kmod.c b/hw/xfree86/os-support/linux/lnx_kmod.c index 0cb69b209..cf18bcab6 100644 --- a/hw/xfree86/os-support/linux/lnx_kmod.c +++ b/hw/xfree86/os-support/linux/lnx_kmod.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kmod.c,v 3.6 2001/10/31 22:50:30 tsi Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kmod.c,v 3.5 2001/10/01 13:44:14 eich Exp $ */ #include <errno.h> #include <fcntl.h> diff --git a/hw/xfree86/os-support/linux/lnx_mouse.c b/hw/xfree86/os-support/linux/lnx_mouse.c index 8bc7e6331..3d0d30f52 100644 --- a/hw/xfree86/os-support/linux/lnx_mouse.c +++ b/hw/xfree86/os-support/linux/lnx_mouse.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_mouse.c,v 1.1 1999/05/17 13:17:18 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_mouse.c,v 1.2 2003/10/08 14:58:30 dawes Exp $ */ /* * Copyright 1999 by The XFree86 Project, Inc. @@ -8,6 +8,10 @@ #include "xf86.h" #include "xf86Xinput.h" #include "xf86OSmouse.h" +#include "xf86_OSlib.h" +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> static int SupportedInterfaces(void) @@ -15,6 +19,172 @@ SupportedInterfaces(void) return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_XPS2 | MSE_AUTO; } +static const char * +DefaultProtocol(void) +{ + return "Auto"; +} + +#define DEFAULT_MOUSE_DEV "/dev/mouse" +#define DEFAULT_PS2_DEV "/dev/psaux" +#define DEFAULT_GPM_DATA_DEV "/dev/gpmdata" +#define DEFAULT_GPM_CTL_DEV "/dev/gpmdata" + +static const char *mouseDevs[] = { + DEFAULT_MOUSE_DEV, + DEFAULT_PS2_DEV, + DEFAULT_GPM_DATA_DEV, + NULL +}; + +typedef enum { + MOUSE_PROTO_UNKNOWN = 0, + MOUSE_PROTO_SERIAL, + MOUSE_PROTO_PS2, + MOUSE_PROTO_MSC, + MOUSE_PROTO_GPM +} protocolTypes; + +static struct { + protocolTypes proto; + const char *name; +} devproto[] = { + { MOUSE_PROTO_UNKNOWN, NULL }, + { MOUSE_PROTO_PS2, "PS/2" }, + { MOUSE_PROTO_MSC, "MouseSystems" }, + { MOUSE_PROTO_GPM, "GPM" } +}; + +static const char * +FindDevice(InputInfoPtr pInfo, const char *protocol, int flags) +{ + int fd = -1; + const char **pdev; + + for (pdev = mouseDevs; *pdev; pdev++) { + SYSCALL (fd = open(*pdev, O_RDWR | O_NONBLOCK | O_EXCL)); + if (fd == -1) { +#ifdef DEBUG + ErrorF("Cannot open %s (%s)\n", *pdev, strerror(errno)); +#endif + } else + break; + } + + if (*pdev) { + close(fd); + /* Set the Device option. */ + pInfo->conf_idev->commonOptions = + xf86AddNewOption(pInfo->conf_idev->commonOptions, "Device", *pdev); + xf86Msg(X_INFO, "%s: Setting Device option to \"%s\"\n", + pInfo->name, *pdev); + } + + return *pdev; +} + +static const char * +GuessProtocol(InputInfoPtr pInfo, int flags) +{ + int fd = -1; + const char *dev; + char *realdev; + struct stat sbuf; + int i; + int proto = MOUSE_PROTO_UNKNOWN; + + dev = xf86SetStrOption(pInfo->conf_idev->commonOptions, "Device", NULL); + if (!dev) { +#ifdef DEBUG + ErrorF("xf86SetStrOption failed to return the device name\n"); +#endif + return NULL; + } + /* Look at the device name to guess the protocol. */ + realdev = NULL; + if (strcmp(dev, DEFAULT_MOUSE_DEV) == 0) { + if (lstat(dev, &sbuf) != 0) { +#ifdef DEBUG + ErrorF("lstat failed for %s (%s)\n", dev, strerror(errno)); +#endif + return NULL; + } + if (S_ISLNK(sbuf.st_mode)) { + realdev = xnfalloc(PATH_MAX + 1); + i = readlink(dev, realdev, PATH_MAX); + if (i <= 0) { +#ifdef DEBUG + ErrorF("readlink failed for %s (%s)\n", dev, strerror(errno)); +#endif + xfree(realdev); + return NULL; + } + realdev[i] = '\0'; + } + } + if (!realdev) + realdev = xnfstrdup(dev); + else { + /* If realdev doesn't contain a '/' then prepend "/dev/" */ + if (!strchr(realdev, '/')) { + char *tmp = xnfalloc(strlen(realdev) + 5 + 1); + sprintf(tmp, "/dev/%s", realdev); + xfree(realdev); + realdev = tmp; + } + } + + if (strcmp(realdev, DEFAULT_PS2_DEV) == 0) + proto = MOUSE_PROTO_PS2; + else if (strcmp(realdev, DEFAULT_GPM_DATA_DEV) == 0) + proto = MOUSE_PROTO_MSC; + else if (strcmp(realdev, DEFAULT_GPM_CTL_DEV) == 0) + proto = MOUSE_PROTO_GPM; + xfree(realdev); + /* + * If the protocol can't be guessed from the device name, + * try to characterise it. + */ + if (proto == MOUSE_PROTO_UNKNOWN) { + SYSCALL (fd = open(dev, O_RDWR | O_NONBLOCK | O_EXCL)); + if (isatty(fd)) { + /* Serial PnP has already failed, so give up. */ + } else { + if (fstat(fd, &sbuf) != 0) { +#ifdef DEBUG + ErrorF("fstat failed for %s (%s)\n", dev, strerror(errno)); +#endif + close(fd); + return NULL; + } + if (S_ISFIFO(sbuf.st_mode)) { + /* Assume GPM data in MSC format. */ + proto = MOUSE_PROTO_MSC; + } else { + /* Default to PS/2 */ + proto = MOUSE_PROTO_PS2; + } + } + close(fd); + } + if (proto == MOUSE_PROTO_UNKNOWN) { + xf86Msg(X_ERROR, "%s: GuessProtocol: Cannot find mouse protocol.\n", + pInfo->name); + return NULL; + } else { + for (i = 0; i < sizeof(devproto)/sizeof(devproto[0]); i++) { + if (devproto[i].proto == proto) { + xf86Msg(X_INFO, + "%s: GuessProtocol: " + "setting mouse protocol to \"%s\"\n", + pInfo->name, devproto[i].name); + return devproto[i].name; + } + } + } + return NULL; +} + OSMouseInfoPtr xf86OSMouseInit(int flags) { @@ -24,6 +194,9 @@ xf86OSMouseInit(int flags) if (!p) return NULL; p->SupportedInterfaces = SupportedInterfaces; + p->DefaultProtocol = DefaultProtocol; + p->FindDevice = FindDevice; + p->GuessProtocol = GuessProtocol; return p; } diff --git a/hw/xfree86/os-support/linux/lnx_pci.c b/hw/xfree86/os-support/linux/lnx_pci.c index 5477b9130..41f76fd16 100644 --- a/hw/xfree86/os-support/linux/lnx_pci.c +++ b/hw/xfree86/os-support/linux/lnx_pci.c @@ -1,4 +1,4 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_pci.c,v 3.9 2003/02/17 15:29:22 dawes Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_pci.c,v 3.8 2002/04/09 15:59:37 tsi Exp $ */ #include <stdio.h> #include "X.h" |