* fhandler_tty.cc (fhandler_tty_slave::ioctl): Properly set ioctl_request event

when window size changes.  Store failing errno in ioctl_retval (needed?).
This commit is contained in:
Christopher Faylor 2003-09-27 03:14:07 +00:00
parent 63726a5eb4
commit a3cbb4a7e0
3 changed files with 49 additions and 22 deletions

View file

@ -1,3 +1,9 @@
2003-09-26 Christopher Faylor <cgf@redhat.com>
* fhandler_tty.cc (fhandler_tty_slave::ioctl): Properly set
ioctl_request event when window size changes. Store failing errno in
ioctl_retval (needed?).
2003-09-26 Pavel Tsekov <ptsekov@gmx.net>
* fhandler_console.c (fhandler_console::read): Record the state of the

View file

@ -1057,34 +1057,29 @@ fhandler_tty_slave::ioctl (unsigned int cmd, void *arg)
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;
SetEvent (ioctl_request_event);
}
if (!ioctl_request_event)
get_ttyp ()->ioctl_retval = -EINVAL;
else
{
get_ttyp ()->arg.winsize = *(struct winsize *) arg;
SetEvent (ioctl_request_event);
get_ttyp ()->winsize = *(struct winsize *) arg;
kill (-get_ttyp ()->getpgid (), SIGWINCH);
if (ioctl_done_event)
WaitForSingleObject (ioctl_done_event, INFINITE);
}
if (ioctl_done_event)
WaitForSingleObject (ioctl_done_event, INFINITE);
}
break;
case TIOCLINUX:
int val = * (unsigned char *) arg;
if (val == 6 && ioctl_request_event && ioctl_done_event)
{
get_ttyp ()->arg.value = val;
SetEvent (ioctl_request_event);
WaitForSingleObject (ioctl_done_event, INFINITE);
* (unsigned char *) arg = get_ttyp ()->arg.value & 0xFF;
}
int val = *(unsigned char *) arg;
if (val != 6 || !ioctl_request_event || !ioctl_done_event)
get_ttyp ()->ioctl_retval = -EINVAL;
else
{
get_ttyp ()->ioctl_retval = -1;
set_errno (EINVAL);
get_ttyp ()->arg.value = val;
SetEvent (ioctl_request_event);
WaitForSingleObject (ioctl_done_event, INFINITE);
*(unsigned char *) arg = get_ttyp ()->arg.value & 0xFF;
}
break;
}
@ -1092,8 +1087,14 @@ fhandler_tty_slave::ioctl (unsigned int cmd, void *arg)
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;
}
/*******************************************************
@ -1250,7 +1251,7 @@ fhandler_pty_master::ioctl (unsigned int cmd, void *arg)
switch (cmd)
{
case TIOCPKT:
pktmode = * (int *) arg;
pktmode = *(int *) arg;
break;
case TIOCGWINSZ:
*(struct winsize *) arg = get_ttyp ()->winsize;
@ -1259,7 +1260,7 @@ fhandler_pty_master::ioctl (unsigned int cmd, void *arg)
if (get_ttyp ()->winsize.ws_row != ((struct winsize *) arg)->ws_row
|| get_ttyp ()->winsize.ws_col != ((struct winsize *) arg)->ws_col)
{
get_ttyp ()->winsize = * (struct winsize *) arg;
get_ttyp ()->winsize = *(struct winsize *) arg;
kill (-get_ttyp ()->getpgid (), SIGWINCH);
}
break;

View file

@ -0,0 +1,20 @@
/* cygwin/kd.h
Copyright 2003 Red Hat Inc.
Written by Kazuhiro Fujieda <fujieda@jaist.ac.jp>
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