diff options
author | Aaron Zang <Aaron.Zang@Sun.COM> | 2010-05-20 17:56:28 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2010-05-21 09:45:42 -0700 |
commit | 989db930d739483759087b13b8d9a043299feafb (patch) | |
tree | e642bce9992ab66598b3ed70888968e6b1da33be /hw | |
parent | 98553e52a14b97a03aef8dc4fc0300b3f4c2c4b5 (diff) |
Solaris: Use VT_SET_CONSUSER ioctl to set Console User rights profile
When Xorg is started on display :0, this ioctl is called to grant the
user the rights traditionally associated with /dev/console (before VT
support was added), such as access to local peripheral devices.
Also adds a Solaris-specific -C flag to force starting on /dev/console
instead of /dev/vt*, allowing programs like xterm -C to access the
console device.
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/xfree86/os-support/solaris/sun_init.c | 102 |
1 files changed, 80 insertions, 22 deletions
diff --git a/hw/xfree86/os-support/solaris/sun_init.c b/hw/xfree86/os-support/solaris/sun_init.c index 5846866a2..edcc60b88 100644 --- a/hw/xfree86/os-support/solaris/sun_init.c +++ b/hw/xfree86/os-support/solaris/sun_init.c @@ -33,8 +33,21 @@ # include <sys/kd.h> #endif +/* + * Applications see VT number as consecutive integers starting from 1. + * VT number VT device + * ------------------------------------------------------- + * 1 : /dev/vt/0 (Alt + Ctrl + F1) + * 2 : /dev/vt/2 (Alt + Ctrl + F2) + * 3 : /dev/vt/3 (Alt + Ctrl + F3) + * ... ... + */ +#define CONSOLE_VTNO 1 +#define SOL_CONSOLE_DEV "/dev/console" + static Bool KeepTty = FALSE; static Bool Protect0 = FALSE; +static Bool UseConsole = FALSE; #ifdef HAS_USL_VTS static int VTnum = -1; static int xf86StartVT = -1; @@ -112,8 +125,30 @@ xf86OpenConsole(void) vtEnabled = 0; } } +#endif /* HAS_USL_VTS */ + if (UseConsole) + { + strlcpy(consoleDev, SOL_CONSOLE_DEV, sizeof(consoleDev)); + +#ifdef HAS_USL_VTS + xf86Info.vtno = CONSOLE_VTNO; + if (vtEnabled == 0) + { + xf86StartVT = 0; + } + else + { + if (ioctl(fd, VT_GETSTATE, &vtinfo) < 0) + FatalError("xf86OpenConsole: Cannot determine current VT\n"); + xf86StartVT = vtinfo.v_active; + } +#endif /* HAS_USL_VTS */ + goto OPENCONSOLE; + } + +#ifdef HAS_USL_VTS if (vtEnabled == 0) { /* VT not enabled - kernel too old or Sparc platforms @@ -123,32 +158,31 @@ xf86OpenConsole(void) xf86StartVT = 0; xf86Info.vtno = 0; strlcpy(consoleDev, xf86SolarisFbDev, sizeof(consoleDev)); + goto OPENCONSOLE; } - else - { - if (ioctl(fd, VT_GETSTATE, &vtinfo) < 0) - FatalError("xf86OpenConsole: Cannot determine current VT\n"); - xf86StartVT = vtinfo.v_active; + if (ioctl(fd, VT_GETSTATE, &vtinfo) < 0) + FatalError("xf86OpenConsole: Cannot determine current VT\n"); - if (VTnum != -1) - { - xf86Info.vtno = VTnum; - from = X_CMDLINE; - } - else + xf86StartVT = vtinfo.v_active; + + if (VTnum != -1) + { + xf86Info.vtno = VTnum; + from = X_CMDLINE; + } + else + { + if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) || + (xf86Info.vtno == -1)) { - if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) || - (xf86Info.vtno == -1)) - { - FatalError("xf86OpenConsole: Cannot find a free VT\n"); - } + FatalError("xf86OpenConsole: Cannot find a free VT\n"); } - - xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno); - snprintf(consoleDev, PATH_MAX, "/dev/vt/%d", xf86Info.vtno); } + xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno); + snprintf(consoleDev, PATH_MAX, "/dev/vt/%d", xf86Info.vtno); + if (fd != -1) { close(fd); @@ -156,6 +190,7 @@ xf86OpenConsole(void) #endif /* HAS_USL_VTS */ +OPENCONSOLE: if (!KeepTty) setpgrp(); @@ -163,11 +198,10 @@ xf86OpenConsole(void) FatalError("xf86OpenConsole: Cannot open %s (%s)\n", consoleDev, strerror(errno)); -#ifdef HAS_USL_VTS - - /* Change ownership of the vt */ + /* Change ownership of the vt or console */ chown(consoleDev, getuid(), getgid()); +#ifdef HAS_USL_VTS if (vtEnabled) { /* @@ -179,6 +213,13 @@ xf86OpenConsole(void) if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0) xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n"); +#ifdef VT_SET_CONSUSER /* added in snv_139 */ + if (strcmp(display, "0") == 0) + if (ioctl(xf86Info.consoleFd, VT_SET_CONSUSER) != 0) + xf86Msg(X_WARNING, + "xf86OpenConsole: VT_SET_CONSUSER failed\n"); +#endif + if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0) FatalError("xf86OpenConsole: VT_GETMODE failed\n"); @@ -220,6 +261,13 @@ xf86OpenConsole(void) if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0) xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n"); +#ifdef VT_SET_CONSUSER /* added in snv_139 */ + if (strcmp(display, "0") == 0) + if (ioctl(xf86Info.consoleFd, VT_SET_CONSUSER) != 0) + xf86Msg(X_WARNING, + "xf86OpenConsole: VT_SET_CONSUSER failed\n"); +#endif + /* * If the server doesn't have the VT when the reset occurs, * this is to make sure we don't continue until the activate @@ -330,6 +378,15 @@ xf86ProcessArgument(int argc, char **argv, int i) return 1; } + /* + * Use /dev/console as the console device. + */ + if (!strcmp(argv[i], "-C")) + { + UseConsole = TRUE; + return 1; + } + #ifdef HAS_USL_VTS if ((argv[i][0] == 'v') && (argv[i][1] == 't')) @@ -364,4 +421,5 @@ void xf86UseMsg() ErrorF("-dev <fb> Framebuffer device\n"); ErrorF("-keeptty Don't detach controlling tty\n"); ErrorF(" (for debugging only)\n"); + ErrorF("-C Use /dev/console as the console device\n"); } |