mirror of https://github.com/wb2osz/direwolf.git
Fix kissattach 'Device or resource busy'
Sometimes kissattach had an issue using the pseudo terminal on some versions of Linux: 'Error setting line discipline: TIOCSETD: Device or resource busy'. This fix resolves the issue by not reading from the pty's master fd, until kissattach has opened and configured the slave. This is implemented using select() to wait for data before reading from the master fd.
This commit is contained in:
parent
283b768125
commit
35c3c29cc4
15
kiss.c
15
kiss.c
|
@ -884,12 +884,23 @@ static int kiss_get (/* MYFDTYPE fd*/ void )
|
||||||
#else /* Linux/Cygwin version */
|
#else /* Linux/Cygwin version */
|
||||||
|
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
fd_set fd_in;
|
||||||
|
int rc;
|
||||||
|
|
||||||
while ( n == 0 ) {
|
while ( n == 0 ) {
|
||||||
|
/* Reading from master fd of the pty before the client has connected leads to trouble with kissattach. */
|
||||||
|
/* Use select to check if the slave has sent any data before trying to read from it. */
|
||||||
|
FD_ZERO(&fd_in);
|
||||||
|
rc = select(pt_master_fd + 1, &fd_in, NULL, &fd_in, NULL);
|
||||||
|
|
||||||
n = read(pt_master_fd, &ch, (size_t)1);
|
if (rc == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (n != 1) {
|
if (rc == MYFDERROR
|
||||||
|
|| (n = read(pt_master_fd, &ch, (size_t)1)) != 1)
|
||||||
|
{
|
||||||
|
|
||||||
text_color_set(DW_COLOR_ERROR);
|
text_color_set(DW_COLOR_ERROR);
|
||||||
dw_printf ("\nError receiving kiss message from client application. Closing %s.\n\n", pt_slave_name);
|
dw_printf ("\nError receiving kiss message from client application. Closing %s.\n\n", pt_slave_name);
|
||||||
|
|
Loading…
Reference in New Issue