diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c index 7f40857..cf58c01 100644 --- a/hw/xfree86/os-support/linux/lnx_init.c +++ b/hw/xfree86/os-support/linux/lnx_init.c @@ -49,6 +49,7 @@ static Bool KeepTty = FALSE; static int VTnum = -1; static Bool VTSwitch = TRUE; static Bool ShareVTs = FALSE; +Bool NoHwAccess = FALSE; static int activeVT = -1; static int vtPermSave[4]; @@ -80,9 +81,11 @@ saveVtPerms(void) 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]); + if (geteuid() == 0) { + /* Set the terminal permissions back to before we started. */ + (void)chown("/dev/tty0", vtPermSave[0], vtPermSave[1]); + (void)chown(vtname, vtPermSave[2], vtPermSave[3]); + } } static void *console_handler; @@ -210,20 +213,22 @@ xf86OpenConsole(void) xf86Msg(X_WARNING, "xf86OpenConsole: Could not save ownership of VT\n"); - /* change ownership of the vt */ - if (chown(vtname, getuid(), getgid()) < 0) - xf86Msg(X_WARNING,"xf86OpenConsole: chown %s failed: %s\n", - vtname, strerror(errno)); - - /* - * the current VT device we're running on is not "console", we want - * to grab all consoles too - * - * Why is this needed?? - */ - if (chown("/dev/tty0", getuid(), getgid()) < 0) - xf86Msg(X_WARNING,"xf86OpenConsole: chown /dev/tty0 failed: %s\n", - strerror(errno)); + if (geteuid() == 0) { + /* change ownership of the vt */ + if (chown(vtname, getuid(), getgid()) < 0) + xf86Msg(X_WARNING,"xf86OpenConsole: chown %s failed: %s\n", + vtname, strerror(errno)); + + /* + * the current VT device we're running on is not + * "console", we want to grab all consoles too + * + * Why is this needed?? + */ + if (chown("/dev/tty0", getuid(), getgid()) < 0) + xf86Msg(X_WARNING,"xf86OpenConsole: chown /dev/tty0 failed: %s\n", + strerror(errno)); + } } /* @@ -433,6 +438,11 @@ xf86ProcessArgument(int argc, char *argv[], int i) ShareVTs = TRUE; return(1); } + if (!strcmp(argv[i], "-nohwaccess")) + { + NoHwAccess = TRUE; + return(1); + } if ((argv[i][0] == 'v') && (argv[i][1] == 't')) { if (sscanf(argv[i], "vt%2d", &VTnum) == 0) @@ -454,5 +464,6 @@ xf86UseMsg() ErrorF("don't detach controlling tty (for debugging only)\n"); ErrorF("-novtswitch don't immediately switch to new VT\n"); ErrorF("-sharevts share VTs with another X server\n"); + ErrorF("-nohwaccess don't access hardware ports directly\n"); return; } diff --git a/hw/xfree86/os-support/linux/lnx_video.c b/hw/xfree86/os-support/linux/lnx_video.c index 688106a..34a845b 100644 --- a/hw/xfree86/os-support/linux/lnx_video.c +++ b/hw/xfree86/os-support/linux/lnx_video.c @@ -51,6 +51,7 @@ #define MAP_FAILED ((void *)-1) #endif +extern Bool NoHwAccess; static Bool ExtendedEnabled = FALSE; #ifdef __ia64__ @@ -509,6 +510,9 @@ xf86EnableIO(void) int fd; unsigned int ioBase_phys; #endif + /* Fake it... */ + if (NoHwAccess) + return TRUE; if (ExtendedEnabled) return TRUE;