Index: fhandler.h =================================================================== RCS file: /cvs/src/src/winsup/cygwin/fhandler.h,v retrieving revision 1.166 diff -u -p -r1.166 fhandler.h --- fhandler.h 9 Jul 2003 01:33:06 -0000 1.166 +++ fhandler.h 17 Jul 2003 06:05:21 -0000 @@ -762,6 +762,7 @@ class dev_console int nargs_; unsigned rarg; bool saw_question_mark; + bool metabit; char my_title_buf [TITLESIZE + 1]; Index: fhandler_console.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/fhandler_console.cc,v retrieving revision 1.111 diff -u -p -r1.111 fhandler_console.cc --- fhandler_console.cc 16 Jun 2003 03:24:10 -0000 1.111 +++ fhandler_console.cc 17 Jul 2003 06:05:21 -0000 @@ -19,6 +19,7 @@ details. */ #include #include #include +#include #include "cygerrno.h" #include "security.h" #include "fhandler.h" @@ -373,6 +374,11 @@ fhandler_console::read (void *pv, size_t meta = (control_key_state & dev_state->meta_mask) != 0; if (!meta) toadd = tmp + 1; + else if (dev_state->metabit) + { + tmp[1] |= 0x80; + toadd = tmp + 1; + } else { tmp[0] = '\033'; @@ -714,6 +720,20 @@ fhandler_console::ioctl (unsigned int cm return 0; case TIOCSWINSZ: (void) bg_check (SIGTTOU); + return 0; + case KDGKBMETA: + *(int *) buf = (dev_state->metabit) ? K_METABIT : K_ESCPREFIX; + return 0; + case KDSKBMETA: + if ((int) buf == K_METABIT) + dev_state->metabit = TRUE; + else if ((int) buf == K_ESCPREFIX) + dev_state->metabit = FALSE; + else + { + set_errno (EINVAL); + return -1; + } return 0; } Index: fhandler_tty.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/fhandler_tty.cc,v retrieving revision 1.100 diff -u -p -r1.100 fhandler_tty.cc --- fhandler_tty.cc 3 Jul 2003 21:22:17 -0000 1.100 +++ fhandler_tty.cc 17 Jul 2003 06:05:22 -0000 @@ -26,6 +26,7 @@ details. */ #include "cygheap.h" #include "shared_info.h" #include "cygwin/cygserver.h" +#include "cygwin/kd.h" #include "cygthread.h" /* Tty master stuff */ @@ -417,9 +418,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_min *ttyp = tty_master->get_ttyp (); + /* KDSKBMETA use the arg as a int value. */ + void *arg = (ttyp->cmd != KDSKBMETA) + ? &ttyp->arg : (void *) ttyp->arg.value; + if (tty_master->console->ioctl (ttyp->cmd, arg) < 0) + ttyp->ioctl_retval = -get_errno (); SetEvent (tty_master->ioctl_done_event); } } @@ -996,42 +1000,66 @@ fhandler_tty_slave::ioctl (unsigned int raise (SIGTTOU); } + get_ttyp ()->cmd = cmd; + get_ttyp ()->ioctl_retval = 0; switch (cmd) { case TIOCGWINSZ: case TIOCSWINSZ: 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; + goto out; + 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; + goto out; case FIONBIO: set_nonblocking (*(int *) arg); goto out; default: - set_errno (EINVAL); - return -1; + get_ttyp ()->ioctl_retval = -EINVAL; + goto out; } acquire_output_mutex (INFINITE); - get_ttyp ()->cmd = cmd; - get_ttyp ()->ioctl_retval = 0; switch (cmd) { case TIOCGWINSZ: - get_ttyp ()->arg.winsize = get_ttyp ()->winsize; if (ioctl_request_event) - SetEvent (ioctl_request_event); - *(struct winsize *) arg = get_ttyp ()->arg.winsize; - if (ioctl_done_event) - WaitForSingleObject (ioctl_done_event, INFINITE); - get_ttyp ()->winsize = get_ttyp ()->arg.winsize; + { + SetEvent (ioctl_request_event); + if (ioctl_done_event) + WaitForSingleObject (ioctl_done_event, INFINITE); + *(struct winsize *) arg = + get_ttyp ()->winsize = get_ttyp ()->arg.winsize; + } + else + *(struct winsize *) arg = get_ttyp ()->winsize; break; case TIOCSWINSZ: if (get_ttyp ()->winsize.ws_row != ((struct winsize *) arg)->ws_row || get_ttyp ()->winsize.ws_col != ((struct winsize *) arg)->ws_col) { - get_ttyp ()->arg.winsize = *(struct winsize *) arg; if (ioctl_request_event) { - get_ttyp ()->ioctl_retval = -1; + get_ttyp ()->arg.winsize = *(struct winsize *) arg; SetEvent (ioctl_request_event); } else @@ -1048,8 +1076,14 @@ fhandler_tty_slave::ioctl (unsigned int release_output_mutex (); out: - termios_printf ("%d = ioctl (%x)", get_ttyp ()->ioctl_retval, cmd); - return get_ttyp ()->ioctl_retval; + int retval = get_ttyp ()->ioctl_retval; + if (retval < 0) + { + set_errno (-retval); + retval = -1; + } + termios_printf ("%d = ioctl (%x)", retval, cmd); + return retval; } /******************************************************* --- /dev/null 2003-07-17 15:06:34.000000000 +0900 +++ include/cygwin/kd.h 2003-07-15 11:53:19.000000000 +0900 @@ -0,0 +1,20 @@ +/* cygwin/kd.h + + Copyright 2003 Red Hat Inc. + Written by Kazuhiro Fujieda + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#ifndef _CYGWIN_KD_H_ +#define _CYGWIN_KD_H_ + +#define KDGKBMETA 0x4b62 +#define KDSKBMETA 0x4b63 +#define K_METABIT 0x03 +#define K_ESCPREFIX 0x04 + +#endif