summaryrefslogtreecommitdiff
path: root/sys/dev/wscons
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/wscons')
-rw-r--r--sys/dev/wscons/wskbd.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/sys/dev/wscons/wskbd.c b/sys/dev/wscons/wskbd.c
index 6d3d332858c..ea2cbb21e28 100644
--- a/sys/dev/wscons/wskbd.c
+++ b/sys/dev/wscons/wskbd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: wskbd.c,v 1.108 2021/09/20 17:32:39 anton Exp $ */
+/* $OpenBSD: wskbd.c,v 1.109 2021/10/22 04:59:31 anton Exp $ */
/* $NetBSD: wskbd.c,v 1.80 2005/05/04 01:52:16 augustss Exp $ */
/*
@@ -205,6 +205,8 @@ int wskbd_detach(struct device *, int);
int wskbd_activate(struct device *, int);
int wskbd_displayioctl(struct device *, u_long, caddr_t, int, struct proc *);
+int wskbd_displayioctl_sc(struct wskbd_softc *, u_long, caddr_t, int,
+ struct proc *, int);
void update_leds(struct wskbd_internal *);
void update_modifier(struct wskbd_internal *, u_int, int, int);
@@ -217,7 +219,7 @@ void change_displayparam(struct wskbd_softc *, int, int, int);
#endif
int wskbd_do_ioctl_sc(struct wskbd_softc *, u_long, caddr_t, int,
- struct proc *);
+ struct proc *, int);
void wskbd_deliver_event(struct wskbd_softc *sc, u_int type, int value);
#if NWSMUX > 0
@@ -925,7 +927,14 @@ wskbdread(dev_t dev, struct uio *uio, int flags)
int
wskbdioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
{
- return (wskbd_do_ioctl(wskbd_cd.cd_devs[minor(dev)], cmd, data, flag,p));
+ struct wskbd_softc *sc = wskbd_cd.cd_devs[minor(dev)];
+ int error;
+
+ sc->sc_refcnt++;
+ error = wskbd_do_ioctl_sc(sc, cmd, data, flag, p, 0);
+ if (--sc->sc_refcnt < 0)
+ wakeup(sc);
+ return (error);
}
/* A wrapper around the ioctl() workhorse to make reference counting easy. */
@@ -937,7 +946,7 @@ wskbd_do_ioctl(struct device *dv, u_long cmd, caddr_t data, int flag,
int error;
sc->sc_refcnt++;
- error = wskbd_do_ioctl_sc(sc, cmd, data, flag, p);
+ error = wskbd_do_ioctl_sc(sc, cmd, data, flag, p, 1);
if (--sc->sc_refcnt < 0)
wakeup(sc);
return (error);
@@ -945,7 +954,7 @@ wskbd_do_ioctl(struct device *dv, u_long cmd, caddr_t data, int flag,
int
wskbd_do_ioctl_sc(struct wskbd_softc *sc, u_long cmd, caddr_t data, int flag,
- struct proc *p)
+ struct proc *p, int evsrc)
{
struct wseventvar *evar;
int error;
@@ -983,7 +992,7 @@ wskbd_do_ioctl_sc(struct wskbd_softc *sc, u_long cmd, caddr_t data, int flag,
* Try the keyboard driver for WSKBDIO ioctls. It returns -1
* if it didn't recognize the request.
*/
- error = wskbd_displayioctl(&sc->sc_base.me_dv, cmd, data, flag, p);
+ error = wskbd_displayioctl_sc(sc, cmd, data, flag, p, evsrc);
return (error != -1 ? error : ENOTTY);
}
@@ -992,10 +1001,18 @@ wskbd_do_ioctl_sc(struct wskbd_softc *sc, u_long cmd, caddr_t data, int flag,
* Some of these have no real effect in raw mode, however.
*/
int
-wskbd_displayioctl(struct device *dev, u_long cmd, caddr_t data, int flag,
+wskbd_displayioctl(struct device *dv, u_long cmd, caddr_t data, int flag,
struct proc *p)
{
- struct wskbd_softc *sc = (struct wskbd_softc *)dev;
+ struct wskbd_softc *sc = (struct wskbd_softc *)dv;
+
+ return (wskbd_displayioctl_sc(sc, cmd, data, flag, p, 1));
+}
+
+int
+wskbd_displayioctl_sc(struct wskbd_softc *sc, u_long cmd, caddr_t data,
+ int flag, struct proc *p, int evsrc)
+{
struct wskbd_bell_data *ubdp, *kbdp;
struct wskbd_keyrepeat_data *ukdp, *kkdp;
struct wskbd_map_data *umdp;
@@ -1134,6 +1151,9 @@ getkeyrepeat:
return(error);
case WSKBDIO_GETENCODING:
+ /* Do not advertise encoding to the parent mux. */
+ if (evsrc && (sc->id->t_keymap.layout & KB_NOENCODING))
+ return (ENOTTY);
*((kbd_t *)data) = sc->id->t_keymap.layout & ~KB_DEFAULT;
return(0);