Date: Mon, 9 Oct 1995 11:19:40 +1000 (EST) From: raoul@cssc-syd.tansu.com.au (Raoul Golan) To: freebsd-questions@freebsd.org Subject: Question on read syscall on serial port Message-ID: <199510090119.LAA07559@kiwi.cssc-syd.tansu.com.au>
next in thread | raw e-mail | index | archive | help
Hello people, I'm reading from a modem on /dev/cua*. It's a blocking read, which means I expect it to wait there until data is available, or until the modem loses carrier, or until an error occurs. At the moment, when the modem loses carrier, the read syscall returns a count of 0 data read, but it does not set errno to anything (it leaves errno with the same value it had before the call). Is there any way (via an ioctl, a fcntl, an stty(?) or via some modem configuration parameter) of having the read syscall put some value into errno, such as ENOENT or EIO, when the modem loses carrier? I ask this because in the tip code there is a loop that exits only once errno is set to these values. This means that after the modem's lost carrier my tip session fails to exit. The code is as follows: /* while some condition */ cnt = read(FD, buf, BUFSIZ); if (cnt <= 0) { /* lost carrier */ if (cnt < 0 && errno == EIO) { sigblock(sigmask(SIGTERM)); intTERM(); /*NOTREACHED*/ } else if (cnt == 0 && errno == ENOENT) { kill(getppid(),SIGUSR1); sigblock(sigmask(SIGTERM)); intTERM(); /*NOTREACHED*/ } else { printf("%d %d\r",cnt,errno); fflush(stdout); } continue; } /* end */ Thanks, Raoul.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199510090119.LAA07559>