summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_serial.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_serial.cc')
-rw-r--r--winsup/cygwin/fhandler_serial.cc97
1 files changed, 60 insertions, 37 deletions
diff --git a/winsup/cygwin/fhandler_serial.cc b/winsup/cygwin/fhandler_serial.cc
index 3c6a3bcdc..3910ee97d 100644
--- a/winsup/cygwin/fhandler_serial.cc
+++ b/winsup/cygwin/fhandler_serial.cc
@@ -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, void *buffer)
}
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)
{