On Tue, Feb 04, 2025 at 09:12:18AM +0100, Samuel Thibault wrote:
>
> Only out_io and err_io are supposed to be readable. Or did they mean
> from the point of view of the executed process. Again, it means check
> what exactly happens to end up with "all readable fds are closed"
>
Try to keep the consistency of the mail list thread so I reply to this
email.
The investigation shows that the code[0] avoiding closing channel was
not executed because the conditional statement[1] didn't return true as
expected.
I tried to run `rpctrace -o rpclog ./vim --clean` and
`let job = job_start('python3' . ' -c "import time;time.sleep(5)"', {'out_io':
'null', 'err_io': 'null', 'pty': 1})
to collect the rpc log. However, it just hanged with a lot of
`rpctrace: get an unknown send right from process 8898` and made my
terminal messy.
Intead I wrote the following program to reproduce the error:
```
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int
main ()
{
int f;
int is_term;
f = open ("/dev/ttyp4", 0);
if (f == -1)
{
printf ("open() failed\n");
return 0;
}
printf ("fd: %d\n", f);
is_term = isatty (f);
if (is_term == 1)
printf ("Its refering to a terminal!\n");
else
printf ("Its not refering to a terminal!\n");
return 0;
}
```
The /dev/ttyp4 is what vim tried to check in mch_isatty:
```
...
10.220000 : Starting job: python3 -c import time;time.sleep(5)
10.220000 on 0: Created channel
10.220000 on 0: using pty /dev/ttyp4 on fd 4
10.220000 : SafeState: Start triggering
...
```
The rpctrace log is:
```
15<--38(pid8634)->dir_lookup ("dev/ttyp4" 0 0) = 0 1 "" 52<--47(pid8634)
52<--47(pid8634)->term_getctty () = 0x40000009 (Bad file descriptor)
52<--47(pid8634)->term_getctty () = 0x40000009 (Bad file descriptor)
23<--33(pid8634)->io_stat_request () = 0 {14 805 0 0 0 1686195767 0 8397200 1
1001 5 0 0 1738719524 0 1738719524 0 1738719524 0 512 8 0 0 0 0 0 0 0 0 0 0
0}
30<--42(pid8634)->io_write_request ("Its not refering to a terminal!\n" -1) = 0
32
```
So it seems it is from the source code[2].
On GNU/Linux the program successfully opened '/dev/pts/8' (this is what
vim tried to open).
[0]: https://github.com/vim/vim/blob/master/src/channel.c#L1395
[1]: https://github.com/vim/vim/blob/master/src/channel.c#L1394
[2]: https://git.savannah.gnu.org/cgit/hurd/hurd.git/tree/term/users.c#n367
Zhaoming