Dear Takashi Yano!
Den 22 March 2015 klockan 14:32 skrev Takashi Yano detta:
> Thank you for your reply.
>
> With your patch, I have confirmed the problem has disappeared.
>
> However, I am a little bit concerned about calling pty_get_char(0)
> twice in the case of TIOCPKT_FLUSHWRITE or TIOCPKT_IOCTL.
>
> Is it intentional behaviour?
A relevant observation. When acting on TIOCPKT_IOCTL the call sequence
pty_get_char (0);
copy_termbuf (); /* Pty buffer is now emtied. */
localstat ();
discards the packet preamble, then copies payload and resets the
buffer. This will make sure that any following pty_get_char(0)
becomes a no-op as no data is left. The remark above was introduced
to the development head to record this observation, but I left it
out in my comment to the list as is has no effect on the program.
The case of TIOCPKT_FLUSHWRITE is different, as only the network
buffer is touched, apart from the single pty_get_char(0). Now it
seems that your worry is justified. According to pty(7D) on Solaris
When a pseudo-terminal is in packet mode, the controller
device will return data preceded by TIOCPKT_DATA (= 0),
or a single byte reflecting control status information.
This means that TIOCPKT_FLUSHWRITE arrives isolated, so also in this
case the pty buffer is empty after the first pty_get_char(0) and the
second becomes a no-op again. However, even though the control byte
was flushed, is is still preserved in the variable 'c', so the
next test is still correct even if (TIOCPKT_FLUSHWRITE | TIOCPKT_STOP)
had been received. Neither of TIOCPKT_NOSTOP and TIOCPKT_STOP touches
the pty buffer, so no harmful side effect is possible. The code would
look better without this first pty_get_char(0), so I might remove it
for better understanding and quality.
I thank you for your interest and care in this matter.
Best regards,
Mats Erik Andersson