On Sat, Feb 08, 2025 at 08:55:31AM +0800, Zhaoming Luo wrote: > On Fri, Feb 07, 2025 at 01:57:01PM +0100, Samuel Thibault wrote: > > Zhaoming Luo, le ven. 07 févr. 2025 18:44:50 +0800, a ecrit: > > > This is V2 of figuring out the issue. V1 is abandoned due to my mistake, > > > but this time I can confirm the source of issue. This time I ran > > > rpctrace directly on vim, and used two printfs to locate the isatty(). > > > > > > ``` > > > printf ("Start isatty!\n"); > > > if (mch_isatty(in)) > > > channel->ch_to_be_closed |= (1U << PART_IN); > > > printf ("Finish isatty!\n"); > > > ``` > > > > > > rpctrace output: > > > ``` > > > ... > > > 30<--44(pid920)->io_write_request ("Start isatty!\n" -1) = 0 14 > > > 56<--24(pid920)->term_getctty () = 0x4000002d (Operation not supported) > > > 30<--44(pid920)->io_write_request ("Finish isatty!\n" -1) = 0 15 > > > ... > > > ``` > > > > > > The error seems to be from [2]. > > > > Indeed, if it was plugged to another translator you'd get a mig bad id > > error. > > > > My guess is that it's cred->pi.class != tty_class that fails, indeed: > > > > int ret = openpty(&master, &slave, s, &term, &win); > > printf("%d\n", isatty(master)); > > printf("%d\n", isatty(slave)); > > > > says 0 for master on the Hurd while it says 1 on Linux > > > > The pi.class != tty_class condition was previously because of a lookup, > > but nowadays with the protected payloads we didn't need a lookup any > > more and it was replaced with a check that we find cred in the proper > > place. I'd say we should also accept the class being pty_class, it > > does not seem it would harm: in the uses of term_getctty that I can see, > > it matches the obtained cttyid with the one of the process, or it's an > > explicit request. > > Ok, I will submit a patch so EOPNOSUPP will be returned when > cred->pi.class != pty_class is also true. >
I got stuck at the patch since I'm not sure whether I should add a condition like: ``` if (!cred || cred->pi.bucket != term_bucket - || cred->pi.class != tty_class) + || (cred->pi.class != tty_class && cred->pi.class != pty_class)) return EOPNOTSUPP; ``` Or directly remove cred->pi.class != tty_class. Please feel free to submit the patch, I can confirm that accepting pty_class can pass the vim test Test_keep_pty_open (and a few other tests \o/). Zhaoming