On Feb 27 22:38, Åke Rehnman wrote: > Hi, > > I recently ran in to some troubles with the TIOCINQ ioctl. I am wondering if > the cygwin implementation is correct... It seems if there were any existing > framing overrun errors etc etc before calling the TIOCINQ ioctl it is > returning an error (EINVAL). Reading through linux implmentation of TIOCINQ > does simply return number of pending chars without any clearing or checking > for errors. > > I suggest the whole if (ev & CE_FRAME ...... ) is removed. > > Excerpt from fhandler_serial.cc: > > /* ioctl: */ > int > fhandler_serial::ioctl (unsigned int cmd, void *buf) > { > . > . > if (!ClearCommError (get_handle (), &ev, &st)) > { > __seterrno (); > res = -1; > } > . > . > . > case TIOCINQ: > if (ev & CE_FRAME || ev & CE_IOE || ev & CE_OVERRUN || ev & CE_RXOVER > || ev & CE_RXPARITY) > { > set_errno (EINVAL); /* FIXME: Use correct errno */ > res = -1; > } > else > ipbuf = st.cbInQue; > break;
I'm not familiar with serial I/O and the code is pretty stable(*). - Is it a safe bet that ClearCommError returns valid values in st.cbInQue even if one of the error conditions occur? Maybe the right thing to do is to return 0 in certain error cases...? - Did you actually try if this fixes your problem? It's pretty simple to build the Cygwin DLL https://cygwin.com/faq.html#faq.programming.building-cygwin Corinna (*) euphemistically for "nobody looked into the code for a long time" -- Corinna Vinschen Cygwin Maintainer
signature.asc
Description: PGP signature