Hi all,
I'm trying to get a USB->serial adapter serving a login prompt via getty.
Here's the converter in question:
---8<---
uftdi0 at uhub3 port 3 configuration 1 interface 0 "FTDI FT232R USB UART" rev
2.00/6.00 addr 2
ucom0 at uftdi0 portno 1
--->8---
The following line in /etc/ttys:
---8<---
ttyU0 "/usr/libexec/getty std.9600" vt220 on
--->8---
Reboot, no login prompt on the client, even after liberally hammering enter.
This is the same as what happened using a prolific cable, but I had assumed
this was a hardware bug, but now I'm not so sure! I know the above procedure
works fine on a Soekris (just using tty00 in place of ttyU0).
Debugging further, manually echoing ASCII down the line using cuaU0 works fine.
I then ran getty under ktrace:
---8<---
ktrace /usr/libexec/getty std.9600 ttyU0
--->8---
It looks to me like opening the device is hanging:
---8<---
...
20220 getty NAMI "/dev"
20220 getty RET unveil 0
20220 getty CALL kbind(0x7f7fffffb318,24,0xb7092ac1c9c0a609)
20220 getty RET kbind 0
20220 getty CALL kbind(0x7f7fffffb318,24,0xb7092ac1c9c0a609)
20220 getty RET kbind 0
20220 getty CALL kbind(0x7f7fffffa878,24,0xb7092ac1c9c0a609)
20220 getty RET kbind 0
20220 getty CALL kbind(0x7f7fffffb318,24,0xb7092ac1c9c0a609)
20220 getty RET kbind 0
20220 getty CALL chown(0x8bbe8e078f0,0<"root">,0<"wheel">)
20220 getty NAMI "/dev/ttyU0"
20220 getty RET chown 0
20220 getty CALL kbind(0x7f7fffffb318,24,0xb7092ac1c9c0a609)
20220 getty RET kbind 0
20220 getty CALL chmod(0x8bbe8e078f0,0600<S_IRUSR|S_IWUSR>)
20220 getty NAMI "/dev/ttyU0"
20220 getty RET chmod 0
20220 getty CALL kbind(0x7f7fffffb318,24,0xb7092ac1c9c0a609)
20220 getty RET kbind 0
20220 getty CALL revoke(0x8bbe8e078f0)
20220 getty NAMI "/dev/ttyU0"
20220 getty RET revoke 0
20220 getty CALL kbind(0x7f7fffffb318,24,0xb7092ac1c9c0a609)
20220 getty RET kbind 0
20220 getty CALL nanosleep(0x7f7fffffb3b8,0x7f7fffffb3a8)
20220 getty STRU struct timespec { 2 }
20220 getty STRU struct timespec { 0 }
20220 getty RET nanosleep 0
20220 getty CALL kbind(0x7f7fffffb318,24,0xb7092ac1c9c0a609)
20220 getty RET kbind 0
20220 getty CALL open(0x8bbe8e078f0,0x2<O_RDWR>)
20220 getty NAMI "/dev/ttyU0"
--->8---
(That's the end of the trace)
That trace snippet corresponds with this chunk of code:
---8<---
if (strcmp(argv[0], "+") != 0) {
chown(ttyn, 0, 0);
chmod(ttyn, 0600);
revoke(ttyn);
/*
* Delay the open so DTR stays down long enough to be
detected.
*/
sleep(2);
while ((i = open(ttyn, O_RDWR)) == -1) {
--->8---
https://cvsweb.openbsd.org/src/libexec/getty/main.c?rev=1.51&content-type=text/x-cvsweb-markup
Nothing else has the serial line open (but it shouldn't matter anyway, as getty
uses revoke(2) on the device).
---8<---
# fstat | grep ttyU0
# fstat | grep cuaU0
#
--->8---
This little C program hangs too (stoppnig getty first obviously):
---8<---
#include <stdio.h>
#include <err.h>
#include <fcntl.h>
int
main(void)
{
printf("opening\n");
if (open("/dev/ttyU0", O_RDWR) == -1)
err(1, "open");
printf("open ok\n");
}
--->8---
When I kill the program with CTRL+C, a newline is sent to the client.
And the behaviour is the same for a:
```
uplcom0 at uhub3 port 3 configuration 1 interface 0 "Prolific Technology PL2303
Serial" rev 1.10/2.02 addr 2
ucom0 at uplcom0
```
The above C program does not hang on Soekris using /dev/tty00.
I can repro on 6.4-stable/amd64 and -current/amd64.
I'm out of ideas, so can anyone think of any reason why open(2) on /dev/ttyU0
might block indefinitely?
--
Best Regards
Edd Barrett
http://www.theunixzoo.co.uk