summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_tty.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_tty.cc')
-rw-r--r--winsup/cygwin/fhandler_tty.cc34
1 files changed, 31 insertions, 3 deletions
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index c623c872a..9ecba14d9 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -17,6 +17,7 @@ details. */
#include <stdlib.h>
#include <ctype.h>
#include <limits.h>
+#include <cygwin/kd.h>
#include "cygerrno.h"
#include "security.h"
#include "path.h"
@@ -435,9 +436,12 @@ process_ioctl (void *)
{
WaitForSingleObject (tty_master->ioctl_request_event, INFINITE);
termios_printf ("ioctl() request");
- tty_master->get_ttyp ()->ioctl_retval =
- tty_master->console->ioctl (tty_master->get_ttyp ()->cmd,
- (void *) &tty_master->get_ttyp ()->arg);
+ tty *ttyp = tty_master->get_ttyp ();
+ ttyp->ioctl_retval =
+ tty_master->console->ioctl (ttyp->cmd,
+ (ttyp->cmd == KDSKBMETA)
+ ? (void *) ttyp->arg.value
+ : (void *) &ttyp->arg);
SetEvent (tty_master->ioctl_done_event);
}
}
@@ -1001,6 +1005,8 @@ fhandler_tty_slave::ioctl (unsigned int cmd, void *arg)
case TIOCGWINSZ:
case TIOCSWINSZ:
case TIOCLINUX:
+ case KDGKBMETA:
+ case KDSKBMETA:
break;
case FIONBIO:
set_nonblocking (*(int *) arg);
@@ -1057,6 +1063,28 @@ fhandler_tty_slave::ioctl (unsigned int cmd, void *arg)
*(unsigned char *) arg = get_ttyp ()->arg.value & 0xFF;
}
break;
+ case KDGKBMETA:
+ if (ioctl_request_event)
+ {
+ SetEvent (ioctl_request_event);
+ if (ioctl_done_event)
+ WaitForSingleObject (ioctl_done_event, INFINITE);
+ *(int *) arg = get_ttyp ()->arg.value;
+ }
+ else
+ get_ttyp ()->ioctl_retval = -EINVAL;
+ break;
+ case KDSKBMETA:
+ if (ioctl_request_event)
+ {
+ get_ttyp ()->arg.value = (int) arg;
+ SetEvent (ioctl_request_event);
+ if (ioctl_done_event)
+ WaitForSingleObject (ioctl_done_event, INFINITE);
+ }
+ else
+ get_ttyp ()->ioctl_retval = -EINVAL;
+ break;
}
release_output_mutex ();