4 Commits

Author SHA1 Message Date
Kim Woelders 50a6b600bf ttynvt version 0.15 2022-08-10 07:25:52 +02:00
Kim Woelders 465f31ba87 Avoid some cast-qual warnings 2022-01-16 20:10:48 +01:00
Frank Rolsted Jensen 90c5387613 Clear pollin flag when input buffer is flushed
The pollin flag must be cleared when the input buffer (pty slave) is
flushed. This ensures that the POLLIN event is not signaled to the application,
when there is not data to read.
2022-01-16 19:43:37 +01:00
Frank Rolsted Jensen 6bf10a6901 Support for software flow control 2021-10-29 17:57:34 +02:00
2 changed files with 13 additions and 19 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
m4_define([pkg_version], [0.14]) m4_define([pkg_version], [0.15])
#m4_define([pkg_revision], [005]) #m4_define([pkg_revision], [005])
m4_define([pkg_version], m4_ifdef([pkg_revision], [pkg_version.pkg_revision], [pkg_version])) m4_define([pkg_version], m4_ifdef([pkg_revision], [pkg_version.pkg_revision], [pkg_version]))
+12 -18
View File
@@ -855,21 +855,13 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
tty->master_suspended = (tty->smcr & TIOCM_CTS) ? 0 : 1; tty->master_suspended = (tty->smcr & TIOCM_CTS) ? 0 : 1;
telnet_rfc2217_ctl(tty->tn, TNS_CTL_CTSRTS); telnet_rfc2217_ctl(tty->tn, TNS_CTL_CTSRTS);
} }
else if ((tio->c_iflag & IXON) && (tio->c_iflag & IXOFF)) else if (tio->c_iflag & (IXON | IXOFF))
{ {
tty->master_suspended = 0; tty->master_suspended = 0;
telnet_rfc2217_ctl(tty->tn, TNS_CTL_XONOFF_OUT); if (tio->c_iflag & IXON)
telnet_rfc2217_ctl(tty->tn, TNS_CTL_XONOFF_IN); telnet_rfc2217_ctl(tty->tn, TNS_CTL_XONOFF_OUT);
} if (tio->c_iflag & IXOFF)
else if (tio->c_iflag & IXON) telnet_rfc2217_ctl(tty->tn, TNS_CTL_XONOFF_IN);
{
tty->master_suspended = 0;
telnet_rfc2217_ctl(tty->tn, TNS_CTL_XONOFF_OUT);
}
else if (tio->c_iflag & IXOFF)
{
tty->master_suspended = 0;
telnet_rfc2217_ctl(tty->tn, TNS_CTL_XONOFF_IN);
} }
else else
{ {
@@ -934,6 +926,7 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
case TCIFLUSH: case TCIFLUSH:
byte = 1; byte = 1;
tty->slave_suspended = 0; /* Re-enable polling of Slave */ tty->slave_suspended = 0; /* Re-enable polling of Slave */
tty->pollin = 0;
break; break;
case TCOFLUSH: case TCOFLUSH:
byte = 2; byte = 2;
@@ -943,6 +936,7 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
byte = 3; byte = 3;
tty->slave_suspended = 0; /* Re-enable polling of Slave */ tty->slave_suspended = 0; /* Re-enable polling of Slave */
tty->pollout = 1; tty->pollout = 1;
tty->pollin = 0;
break; break;
} }
telnet_rfc2217_cfg(tty->tn, TNS_SET_PURGE, &byte, 1); telnet_rfc2217_cfg(tty->tn, TNS_SET_PURGE, &byte, 1);
@@ -958,7 +952,7 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
break; break;
case TIOCMBIS: case TIOCMBIS:
CHECK_BUF_IN(sizeof(int)); CHECK_BUF_IN(sizeof(int));
tiocm = *(unsigned int *)in_buf; tiocm = *(const unsigned int *)in_buf;
fuse_reply_ioctl(req, 0, 0, 0); fuse_reply_ioctl(req, 0, 0, 0);
DBG("%s: cmd=%s tiocm=%#x\n", __func__, _ioctl_name(cmd), tiocm); DBG("%s: cmd=%s tiocm=%#x\n", __func__, _ioctl_name(cmd), tiocm);
if (tiocm & TIOCM_RTS) if (tiocm & TIOCM_RTS)
@@ -974,7 +968,7 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
goto show_mctl; goto show_mctl;
case TIOCMBIC: case TIOCMBIC:
CHECK_BUF_IN(sizeof(int)); CHECK_BUF_IN(sizeof(int));
tiocm = *(unsigned int *)in_buf; tiocm = *(const unsigned int *)in_buf;
fuse_reply_ioctl(req, 0, 0, 0); fuse_reply_ioctl(req, 0, 0, 0);
DBG("%s: cmd=%s tiocm=%#x\n", __func__, _ioctl_name(cmd), tiocm); DBG("%s: cmd=%s tiocm=%#x\n", __func__, _ioctl_name(cmd), tiocm);
if (tiocm & TIOCM_RTS) if (tiocm & TIOCM_RTS)
@@ -990,7 +984,7 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
goto show_mctl; goto show_mctl;
case TIOCMSET: case TIOCMSET:
CHECK_BUF_IN(sizeof(int)); CHECK_BUF_IN(sizeof(int));
tiocm = *(unsigned int *)in_buf; tiocm = *(const unsigned int *)in_buf;
fuse_reply_ioctl(req, 0, 0, 0); fuse_reply_ioctl(req, 0, 0, 0);
DBG("%s: cmd=%s tiocm=%#x\n", __func__, _ioctl_name(cmd), tiocm); DBG("%s: cmd=%s tiocm=%#x\n", __func__, _ioctl_name(cmd), tiocm);
tty->cmcr &= ~(TIOCM_RTS | TIOCM_DTR); tty->cmcr &= ~(TIOCM_RTS | TIOCM_DTR);
@@ -1020,7 +1014,7 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
break; break;
case TIOCSWINSZ: case TIOCSWINSZ:
CHECK_BUF_IN(sizeof(struct winsize)); CHECK_BUF_IN(sizeof(struct winsize));
ws = *(struct winsize *)in_buf; ws = *(const struct winsize *)in_buf;
res = ioctl(tty->fds[FD_SLAVE].fd, TIOCSWINSZ, &ws); res = ioctl(tty->fds[FD_SLAVE].fd, TIOCSWINSZ, &ws);
if (res < 0) if (res < 0)
{ {
@@ -1044,7 +1038,7 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
break; break;
case TIOCSETD: case TIOCSETD:
CHECK_BUF_IN(sizeof(int)); CHECK_BUF_IN(sizeof(int));
val = *(int *)in_buf; val = *(const int *)in_buf;
res = ioctl(tty->fds[FD_SLAVE].fd, TIOCSETD, &val); res = ioctl(tty->fds[FD_SLAVE].fd, TIOCSETD, &val);
if (res < 0) if (res < 0)
fuse_reply_err(req, errno); fuse_reply_err(req, errno);