--- winsup/cygwin/include/sys/termios.h.orig 2005-05-01 20:50:10.000000000 -0700 +++ winsup/cygwin/include/sys/termios.h 2005-08-01 02:22:34.361969600 -0700 @@ -1,6 +1,6 @@ /* sys/termios.h - Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. + Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005 Red Hat, Inc. This file is part of Cygwin. @@ -14,6 +14,8 @@ details. */ #define _SYS_TERMIOS_H #define TIOCMGET 0x5415 +#define TIOCMBIS 0x5416 +#define TIOCMBIC 0x5417 #define TIOCMSET 0x5418 #define TIOCINQ 0x541B --- winsup/cygwin/fhandler.h.orig 2005-07-29 10:04:46.000000000 -0700 +++ winsup/cygwin/fhandler.h 2005-08-01 11:46:07.884528000 -0700 @@ -722,6 +722,7 @@ class fhandler_serial: public fhandler_b int tcdrain (); int tcflow (int); int ioctl (unsigned int cmd, void *); + int switch_modem_lines (int set, int clr); int tcsetattr (int a, const struct termios *t); int tcgetattr (struct termios *t); _off64_t lseek (_off64_t, int) { return 0; } --- winsup/cygwin/fhandler_serial.cc.orig 2005-07-06 13:05:00.000000000 -0700 +++ winsup/cygwin/fhandler_serial.cc 2005-08-01 11:50:49.269139200 -0700 @@ -376,6 +376,56 @@ fhandler_serial::tcflow (int action) } +/* switch_modem_lines: set or clear RTS and/or DTR */ +int +fhandler_serial::switch_modem_lines (int set, int clr) +{ + int res = 0; + + if (set & TIOCM_RTS) + { + if (EscapeCommFunction (get_handle (), SETRTS)) + rts = TIOCM_RTS; + else + { + __seterrno (); + res = -1; + } + } + else if (clr & TIOCM_RTS) + { + if (EscapeCommFunction (get_handle (), CLRRTS)) + rts = 0; + else + { + __seterrno (); + res = -1; + } + } + if (set & TIOCM_DTR) + { + if (EscapeCommFunction (get_handle (), SETDTR)) + rts = TIOCM_DTR; + else + { + __seterrno (); + res = -1; + } + } + else if (clr & TIOCM_DTR) + { + if (EscapeCommFunction (get_handle (), CLRDTR)) + rts = 0; + else + { + __seterrno (); + res = -1; + } + } + + return res; +} + /* ioctl: */ int fhandler_serial::ioctl (unsigned int cmd, void *buffer) @@ -432,44 +482,17 @@ fhandler_serial::ioctl (unsigned int cmd } break; case TIOCMSET: - if (ipbuffer & TIOCM_RTS) - { - if (EscapeCommFunction (get_handle (), SETRTS)) - rts = TIOCM_RTS; - else - { - __seterrno (); - res = -1; - } - } - else - { - if (EscapeCommFunction (get_handle (), CLRRTS)) - rts = 0; - else - { - __seterrno (); - res = -1; - } - } - if (ipbuffer & TIOCM_DTR) - { - if (EscapeCommFunction (get_handle (), SETDTR)) - dtr = TIOCM_DTR; - else - { - __seterrno (); - res = -1; - } - } - else if (EscapeCommFunction (get_handle (), CLRDTR)) - dtr = 0; - else - { - __seterrno (); - res = -1; - } + if (switch_modem_lines (ipbuffer, ~ ipbuffer)) + res = -1; break; + case TIOCMBIS: + if (switch_modem_lines (ipbuffer, 0)) + res = -1; + break; + case TIOCMBIC: + if (switch_modem_lines (0, ipbuffer)) + res = -1; + break; case TIOCCBRK: if (ClearCommBreak (get_handle ()) == 0) {