Exemple #1
0
  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;
    }
  }