diff options
Diffstat (limited to 'winsup/cygwin/ioctl.cc')
-rw-r--r-- | winsup/cygwin/ioctl.cc | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/winsup/cygwin/ioctl.cc b/winsup/cygwin/ioctl.cc new file mode 100644 index 00000000000..5d9ec87d0cb --- /dev/null +++ b/winsup/cygwin/ioctl.cc @@ -0,0 +1,65 @@ +/* ioctl.cc: ioctl routines. + + Copyright 1996, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. + + Written by Doug Evans of Cygnus Support + dje@cygnus.com + +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. */ + +#include "winsup.h" +#include <sys/ioctl.h> +#include <errno.h> +#include "cygerrno.h" +#include "security.h" +#include "path.h" +#include "fhandler.h" +#include "dtable.h" +#include "cygheap.h" +#include "sigproc.h" +#include <sys/termios.h> + +extern "C" int +ioctl (int fd, int cmd, ...) +{ + sigframe thisframe (mainthread); + + cygheap_fdget cfd (fd); + if (cfd < 0) + return -1; + + /* check for optional mode argument */ + va_list ap; + va_start (ap, cmd); + char *argp = va_arg (ap, char *); + va_end (ap); + + debug_printf ("fd %d, cmd %x", fd, cmd); + int res; + if (cfd->is_tty () && cfd->get_device () != FH_PTYM) + switch (cmd) + { + case TCGETA: + res = tcgetattr (fd, (struct termios *) argp); + goto out; + case TCSETA: + res = tcsetattr (fd, TCSANOW, (struct termios *) argp); + goto out; + case TCSETAW: + res = tcsetattr (fd, TCSADRAIN, (struct termios *) argp); + goto out; + case TCSETAF: + res = tcsetattr (fd, TCSAFLUSH, (struct termios *) argp); + goto out; + } + + res = cfd->ioctl (cmd, argp); + +out: + debug_printf ("returning %d", res); + return res; +} |