O_NDELAY and CLOCAL
Dennis Bednar
dennis at rlgvax.UUCP
Wed Jan 8 15:21:25 AEST 1986
I have uncovered some bugs in C-kermit that I think relate to
the use of the open() O_NDELAY and fcntl() to turn off O_NDELAY.
Bug #1 is replicated as follows:
# the following are commands typed in during interactive mode
# this is a comment line
set modem hayes
set line /dev/tty20 # opens with O_NDELAY
set speed 1200
set esc 1
set modem dir # change dialup line *back* to hardwired
connect
(C-Kermit will print a Communications line failure message.)
(The bug is caused by the second set modem dir command)
(Doing a connect without the extra set modem dir is okay).
Bug # 2 is replicated as follows:
# the following are commands typed in during interactive mode
set modem hayes
# assume line tty23 does NOT have any wire plugged into it
set line /dev/tty23 # opens with O_NDELAY, evident by debug code
set esc 1
set sp 1200
dial 6483300 # dial code turns on CLOCAL
# dial code turns off O_NDELAY
# dial code attempts to tell modem to dial
# but there is no modem, in fact,
# there is no carrier since there is
# no device on that port
# dial code fails to dial
# dial code turns off CLOCAL
# dial code prints message that cannot phone
quit # at this point kermit hangs on the
# close() system call, verified
# by running gcore(1), and then
# adb on the core.pid file
# PS, doing a set line command
# for a different port will also
# tickle the bug, since kermit
# first closes any open ttyfd
# before opening a new tty line
Why should kermit hang on a close?
PS, one of control-\ or the escape char (I forget) is needed
to interrupt.
I tried to use an ioctl() to flush the output queues before
the close, but that didn't help. Could it be that
RTS is stuck high waiting for CTS?
I would like to know exactly what the O_NDELAY bit does, and
exactly what the CLOCAL bit does.
Heres what I understand so far:
open with O_NDELAY returns an open file descriptor
even though carrier may not be present.
More questions:
Now if you write, without carrier, does write block,
return 0, or return -1?
Now if you read, without carrier, does read block,
return 0, or return -1?
What is the purpose of using fcntl() to turn off the
O_NDELAY, later, after the tty port is open? Now after
you read or write, how does it change the value of
the return code returned, assuming no carrier?
What exactly does the CLOCAL bit do? Our local OS
expert says that
CLOCAL = 1 = assumes direct line that doesn't
provide carrier, so pretend as if I got it,
(turn on a bit in the tty structure) even
though carrier may not be really present.
CLOCAL = 1 = assume dialup line with modem,
which, means that carrier must be present
to do i/o.
If so, then it seems that both O_NDELAY and CLOCAL
both have something to do with carrier. This seems
confusing to me.
Does CLOCAL have anything to do with RTS/CTS (request
to send/ clear to send) handshaking?
I was tempted to write an interactive test program to put a tty port
through its paces and emperically find the answer to these
questions, but I don't have the time, and I'm stuck on another
project.
--
Dennis Bednar Computer Consoles Inc. Reston VA 703-648-3300
{decvax,ihnp4,harpo,allegra}!seismo!rlgvax!dennis
dennis at rlgvax.UUCP
More information about the Comp.unix.wizards
mailing list