diff options
author | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:38:33 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2000-02-17 19:38:33 +0000 |
commit | 1fd5e000ace55b323124c7e556a7a864b972a5c4 (patch) | |
tree | dc4fcf1e5e22a040716ef92c496b8d94959b2baa /winsup/cygwin/termios.cc | |
parent | 369d8a8fd5e887eca547bf34bccfdf755c9e5397 (diff) | |
download | cygnal-1fd5e000ace55b323124c7e556a7a864b972a5c4.tar.gz cygnal-1fd5e000ace55b323124c7e556a7a864b972a5c4.tar.bz2 cygnal-1fd5e000ace55b323124c7e556a7a864b972a5c4.zip |
import winsup-2000-02-17 snapshot
Diffstat (limited to 'winsup/cygwin/termios.cc')
-rw-r--r-- | winsup/cygwin/termios.cc | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/winsup/cygwin/termios.cc b/winsup/cygwin/termios.cc new file mode 100644 index 000000000..69aaf1943 --- /dev/null +++ b/winsup/cygwin/termios.cc @@ -0,0 +1,274 @@ +/* termios.cc: termios for WIN32. + + Copyright 1996, 1997, 1998, 2000 Cygnus Solutions. + + Written by Doug Evans and Steve Chamberlain of Cygnus Support + dje@cygnus.com, sac@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 <errno.h> +#include "winsup.h" + +/* tcsendbreak: POSIX 7.2.2.1 */ +extern "C" +int +tcsendbreak (int fd, int duration) +{ + int res = -1; + + if (dtable.not_open (fd)) + { + set_errno (EBADF); + goto out; + } + + fhandler_base *fh; + fh = dtable[fd]; + + if (!fh->is_tty ()) + set_errno (ENOTTY); + else + { + if ((res = fh->bg_check (-SIGTTOU)) > 0) + res = fh->tcsendbreak (duration); + } + +out: + syscall_printf ("%d = tcsendbreak (%d, %d )", res, fd, duration); + return res; +} + +/* tcdrain: POSIX 7.2.2.1 */ +extern "C" +int +tcdrain (int fd) +{ + int res = -1; + + termios_printf ("tcdrain"); + + if (dtable.not_open (fd)) + { + set_errno (EBADF); + goto out; + } + + fhandler_base *fh; + fh = dtable[fd]; + + if (!fh->is_tty ()) + set_errno (ENOTTY); + else + { + if ((res = fh->bg_check (-SIGTTOU)) > 0) + res = fh->tcdrain (); + } + +out: + syscall_printf ("%d = tcdrain (%d)", res, fd); + return res; +} + +/* tcflush: POSIX 7.2.2.1 */ +extern "C" +int +tcflush (int fd, int queue) +{ + int res = -1; + + if (dtable.not_open (fd)) + { + set_errno (EBADF); + goto out; + } + + fhandler_base *fh; + fh = dtable[fd]; + + if (!fh->is_tty ()) + set_errno (ENOTTY); + else + { + if ((res = fh->bg_check (-SIGTTOU)) > 0) + res = fh->tcflush (queue); + } + +out: + termios_printf ("%d = tcflush (%d, %d)", res, fd, queue); + return res; +} + +/* tcflow: POSIX 7.2.2.1 */ +extern "C" +int +tcflow (int fd, int action) +{ + int res = -1; + + if (dtable.not_open (fd)) + { + set_errno (EBADF); + goto out; + } + + fhandler_base *fh; + fh = dtable[fd]; + + if (!fh->is_tty ()) + set_errno (ENOTTY); + else + { + if ((res = fh->bg_check (-SIGTTOU)) > 0) + res = fh->tcflow (action); + } + +out: + syscall_printf ("%d = tcflow (%d, %d)", res, fd, action); + return res; +} + +/* tcsetattr: POSIX96 7.2.1.1 */ +extern "C" +int +tcsetattr (int fd, int a, const struct termios *t) +{ + int res = -1; + + t = __tonew_termios (t); + if (dtable.not_open (fd)) + { + set_errno (EBADF); + goto out; + } + + fhandler_base *fh; + fh = dtable[fd]; + + if (!fh->is_tty ()) + set_errno (ENOTTY); + else + { + if ((res = fh->bg_check (-SIGTTOU)) > 0) + res = fh->tcsetattr (a, t); + } + +out: + termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d", + t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN], + t->c_cc[VTIME]); + termios_printf ("%d = tcsetattr (%d, %d, %x)", res, fd, a, t); + return res; +} + +/* tcgetattr: POSIX 7.2.1.1 */ +extern "C" +int +tcgetattr (int fd, struct termios *in_t) +{ + int res = -1; + struct termios *t = __makenew_termios (in_t); + + if (dtable.not_open (fd)) + set_errno (EBADF); + else if (!dtable[fd]->is_tty ()) + set_errno (ENOTTY); + else + { + if ((res = dtable[fd]->tcgetattr (t)) == 0) + (void) __toapp_termios (in_t, t); + } + + if (res) + termios_printf ("%d = tcgetattr (%d, %x)", res, fd, in_t); + else + termios_printf ("iflag %x, oflag %x, cflag %x, lflag %x, VMIN %d, VTIME %d", + t->c_iflag, t->c_oflag, t->c_cflag, t->c_lflag, t->c_cc[VMIN], + t->c_cc[VTIME]); + + return res; +} + +/* tcgetpgrp: POSIX 7.2.3.1 */ +extern "C" +int +tcgetpgrp (int fd) +{ + int res = -1; + + if (dtable.not_open (fd)) + set_errno (EBADF); + else if (!dtable[fd]->is_tty ()) + set_errno (ENOTTY); + else + res = dtable[fd]->tcgetpgrp (); + + termios_printf ("%d = tcgetpgrp (%d)", res, fd); + return res; +} + +/* tcsetpgrp: POSIX 7.2.4.1 */ +extern "C" +int +tcsetpgrp (int fd, pid_t pgid) +{ + int res = -1; + + if (dtable.not_open (fd)) + set_errno (EBADF); + else if (!dtable[fd]->is_tty ()) + set_errno (ENOTTY); + else + res = dtable[fd]->tcsetpgrp (pgid); + + termios_printf ("%d = tcsetpgrp (%d, %x)", res, fd, pgid); + return res; +} + +/* NIST PCTS requires not macro-only implementation */ +#undef cfgetospeed +#undef cfgetispeed +#undef cfsetospeed +#undef cfsetispeed + +/* cfgetospeed: POSIX96 7.1.3.1 */ +extern "C" +speed_t +cfgetospeed (struct termios *tp) +{ + return __tonew_termios(tp)->c_ospeed; +} + +/* cfgetispeed: POSIX96 7.1.3.1 */ +extern "C" +speed_t +cfgetispeed (struct termios *tp) +{ + return __tonew_termios(tp)->c_ispeed; +} + +/* cfsetospeed: POSIX96 7.1.3.1 */ +extern "C" +int +cfsetospeed (struct termios *in_tp, speed_t speed) +{ + struct termios *tp = __tonew_termios (in_tp); + tp->c_ospeed = speed; + (void) __toapp_termios (in_tp, tp); + return 0; +} + +/* cfsetispeed: POSIX96 7.1.3.1 */ +extern "C" +int +cfsetispeed (struct termios *in_tp, speed_t speed) +{ + struct termios *tp = __tonew_termios (in_tp); + tp->c_ispeed = speed; + (void) __toapp_termios (in_tp, tp); + return 0; +} |