diff options
| author | mycroft <mycroft@NetBSD.org> | 1999-10-19 00:03:18 +0000 |
|---|---|---|
| committer | mycroft <mycroft@NetBSD.org> | 1999-10-19 00:03:18 +0000 |
| commit | 02bd5fa80ef277d653b701fa72f97211047567aa (patch) | |
| tree | d1bdd508f055a7ff107152b324eb74bea2eee3ab /sys/dev | |
| parent | 652f0f8841f5a87cd6504244d5a08cfdc18a4ae2 (diff) | |
Split wsdisplay_usl_ioctl() into two functions -- one which is screen-dependent
and one which isn't. The latter is now used for ttyEcfg, enabling the
VT-switching ioctls to work on it. (This allows Linux X servers to work when
/emul/linux/dev/tty0 is linked to /dev/ttyEcfg.)
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/wscons/wsdisplay.c | 12 | ||||
| -rw-r--r-- | sys/dev/wscons/wsdisplay_compat_usl.c | 116 | ||||
| -rw-r--r-- | sys/dev/wscons/wsdisplayvar.h | 7 |
3 files changed, 82 insertions, 53 deletions
diff --git a/sys/dev/wscons/wsdisplay.c b/sys/dev/wscons/wsdisplay.c index 5b264ec60da..c9da0cff4ba 100644 --- a/sys/dev/wscons/wsdisplay.c +++ b/sys/dev/wscons/wsdisplay.c @@ -1,4 +1,4 @@ -/* $NetBSD: wsdisplay.c,v 1.30 1999/10/12 16:47:41 jdolecek Exp $ */ +/* $NetBSD: wsdisplay.c,v 1.31 1999/10/19 00:03:18 mycroft Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -33,7 +33,7 @@ static const char _copyright[] __attribute__ ((unused)) = "Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved."; static const char _rcsid[] __attribute__ ((unused)) = - "$NetBSD: wsdisplay.c,v 1.30 1999/10/12 16:47:41 jdolecek Exp $"; + "$NetBSD: wsdisplay.c,v 1.31 1999/10/19 00:03:18 mycroft Exp $"; #include <sys/param.h> #include <sys/conf.h> @@ -890,6 +890,12 @@ wsdisplayioctl(dev, cmd, data, flag, p) unit = WSDISPLAYUNIT(dev); sc = wsdisplay_cd.cd_devs[unit]; +#ifdef WSDISPLAY_COMPAT_USL + error = wsdisplay_usl_ioctl1(sc, cmd, data, flag, p); + if (error >= 0) + return (error); +#endif + if (ISWSDISPLAYCTL(dev)) return (wsdisplay_cfg_ioctl(sc, cmd, data, flag, p)); @@ -912,7 +918,7 @@ wsdisplayioctl(dev, cmd, data, flag, p) } #ifdef WSDISPLAY_COMPAT_USL - error = wsdisplay_usl_ioctl(sc, scr, cmd, data, flag, p); + error = wsdisplay_usl_ioctl2(sc, scr, cmd, data, flag, p); if (error >= 0) return (error); #endif diff --git a/sys/dev/wscons/wsdisplay_compat_usl.c b/sys/dev/wscons/wsdisplay_compat_usl.c index 6a18a149c7b..1ac3758e220 100644 --- a/sys/dev/wscons/wsdisplay_compat_usl.c +++ b/sys/dev/wscons/wsdisplay_compat_usl.c @@ -1,4 +1,4 @@ -/* $NetBSD: wsdisplay_compat_usl.c,v 1.9 1999/05/30 21:13:04 christos Exp $ */ +/* $NetBSD: wsdisplay_compat_usl.c,v 1.10 1999/10/19 00:03:18 mycroft Exp $ */ /* * Copyright (c) 1998 @@ -288,7 +288,71 @@ usl_attachtimeout(arg) } int -wsdisplay_usl_ioctl(sc, scr, cmd, data, flag, p) +wsdisplay_usl_ioctl1(sc, cmd, data, flag, p) + struct wsdisplay_softc *sc; + u_long cmd; + caddr_t data; + int flag; + struct proc *p; +{ + int idx, maxidx; + + switch (cmd) { + case VT_OPENQRY: + maxidx = wsdisplay_maxscreenidx(sc); + for (idx = 0; idx <= maxidx; idx++) { + if (wsdisplay_screenstate(sc, idx) == 0) { + *(int *)data = idx + 1; + return (0); + } + } + return (ENXIO); + case VT_GETACTIVE: + idx = wsdisplay_getactivescreen(sc); + *(int *)data = idx + 1; + return (0); + case VT_ACTIVATE: + idx = *(int *)data - 1; + return (wsdisplay_switch((struct device *)sc, idx, 1)); + case VT_WAITACTIVE: + idx = *(int *)data - 1; + return (wsscreen_switchwait(sc, idx)); + case VT_GETSTATE: +#define ss ((struct vt_stat *)data) + idx = wsdisplay_getactivescreen(sc); + ss->v_active = idx + 1; + ss->v_state = 0; + maxidx = wsdisplay_maxscreenidx(sc); + for (idx = 0; idx <= maxidx; idx++) + if (wsdisplay_screenstate(sc, idx) == EBUSY) + ss->v_state |= (1 << (idx + 1)); +#undef s + return (0); + +#ifdef WSDISPLAY_COMPAT_PCVT + case VGAPCVTID: +#define id ((struct pcvtid *)data) + strcpy(id->name, "pcvt"); + id->rmajor = 3; + id->rminor = 32; +#undef id + return (0); +#endif +#ifdef WSDISPLAY_COMPAT_SYSCONS + case CONS_GETVERS: + *(int *)data = 0x200; /* version 2.0 */ + return (0); +#endif + + default: + return (-1); + } + + return (0); +} + +int +wsdisplay_usl_ioctl2(sc, scr, cmd, data, flag, p) struct wsdisplay_softc *sc; struct wsscreen *scr; u_long cmd; @@ -296,7 +360,7 @@ wsdisplay_usl_ioctl(sc, scr, cmd, data, flag, p) int flag; struct proc *p; { - int res, idx, maxidx; + int res; struct usl_syncdata *sd; int req, intarg; struct wskbd_bell_data bd; @@ -345,36 +409,7 @@ wsdisplay_usl_ioctl(sc, scr, cmd, data, flag, p) } #undef d return (0); - case VT_OPENQRY: - maxidx = wsdisplay_maxscreenidx(sc); - for (idx = 0; idx <= maxidx; idx++) { - if (wsdisplay_screenstate(sc, idx) == 0) { - *(int *)data = idx + 1; - return (0); - } - } - return (ENXIO); - case VT_GETACTIVE: - idx = wsdisplay_getactivescreen(sc); - *(int *)data = idx + 1; - return (0); - case VT_ACTIVATE: - idx = *(int *)data - 1; - return (wsdisplay_switch((struct device *)sc, idx, 1)); - case VT_WAITACTIVE: - idx = *(int *)data - 1; - return (wsscreen_switchwait(sc, idx)); - case VT_GETSTATE: -#define ss ((struct vt_stat *)data) - idx = wsdisplay_getactivescreen(sc); - ss->v_active = idx + 1; - ss->v_state = 0; - maxidx = wsdisplay_maxscreenidx(sc); - for (idx = 0; idx <= maxidx; idx++) - if (wsdisplay_screenstate(sc, idx) == EBUSY) - ss->v_state |= (1 << (idx + 1)); -#undef s - return (0); + case KDENABIO: if (suser(p->p_ucred, &p->p_acflag) || securelevel > 1) return (EPERM); @@ -396,21 +431,6 @@ wsdisplay_usl_ioctl(sc, scr, cmd, data, flag, p) /* XXX ignore for now */ return (0); -#ifdef WSDISPLAY_COMPAT_PCVT - case VGAPCVTID: -#define id ((struct pcvtid *)data) - strcpy(id->name, "pcvt"); - id->rmajor = 3; - id->rminor = 32; -#undef id - return (0); -#endif -#ifdef WSDISPLAY_COMPAT_SYSCONS - case CONS_GETVERS: - *(int *)data = 0x200; /* version 2.0 */ - return (0); -#endif - default: return (-1); diff --git a/sys/dev/wscons/wsdisplayvar.h b/sys/dev/wscons/wsdisplayvar.h index 3ba1e97ae55..32fc11afa88 100644 --- a/sys/dev/wscons/wsdisplayvar.h +++ b/sys/dev/wscons/wsdisplayvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: wsdisplayvar.h,v 1.12 1999/10/12 16:47:41 jdolecek Exp $ */ +/* $NetBSD: wsdisplayvar.h,v 1.13 1999/10/19 00:03:18 mycroft Exp $ */ /* * Copyright (c) 1996, 1997 Christopher G. Demetriou. All rights reserved. @@ -183,7 +183,10 @@ int wsdisplay_internal_ioctl __P((struct wsdisplay_softc *sc, u_long cmd, caddr_t data, int flag, struct proc *p)); -int wsdisplay_usl_ioctl __P((struct wsdisplay_softc *, struct wsscreen *, +int wsdisplay_usl_ioctl1 __P((struct wsdisplay_softc *, + u_long, caddr_t, int, struct proc *)); + +int wsdisplay_usl_ioctl2 __P((struct wsdisplay_softc *, struct wsscreen *, u_long, caddr_t, int, struct proc *)); int wsdisplay_cfg_ioctl __P((struct wsdisplay_softc *sc, |
