public int ioctl(int fd, int cmd, int[] arg) { Port port = getPort(fd); if (port == null) return -1; try { if (cmd == FIONREAD) { clearCommErrors(port); arg[0] = port.m_COMSTAT.cbInQue; return 0; } else if (cmd == TIOCMSET) { int a = arg[0]; if ((a & TIOCM_DTR) != 0) port.MSR |= TIOCM_DTR; else port.MSR &= ~TIOCM_DTR; if (!EscapeCommFunction(port.m_Comm, ((a & TIOCM_DTR) != 0) ? SETDTR : CLRDTR)) port.fail(); if ((a & TIOCM_RTS) != 0) port.MSR |= TIOCM_RTS; else port.MSR &= ~TIOCM_RTS; if (!EscapeCommFunction(port.m_Comm, ((a & TIOCM_RTS) != 0) ? SETRTS : CLRRTS)) port.fail(); return 0; } else if (cmd == TIOCMGET) { int[] stat = {0}; if (!GetCommModemStatus(port.m_Comm, stat)) port.fail(); int s = stat[0]; int a = arg[0]; if ((s & MS_RLSD_ON) != 0) a |= TIOCM_CAR; else a &= ~TIOCM_CAR; if ((s & MS_RING_ON) != 0) a |= TIOCM_RNG; else a &= ~TIOCM_RNG; if ((s & MS_DSR_ON) != 0) a |= TIOCM_DSR; else a &= ~TIOCM_DSR; if ((s & MS_CTS_ON) != 0) a |= TIOCM_CTS; else a &= ~TIOCM_CTS; if ((port.MSR & TIOCM_DTR) != 0) a |= TIOCM_DTR; else a &= ~TIOCM_DTR; if ((port.MSR & TIOCM_RTS) != 0) a |= TIOCM_RTS; else a &= ~TIOCM_RTS; arg[0] = a; return 0; } else { m_ErrNo = ENOTSUP; return -1; } } catch (Fail f) { return -1; } }