1 Commits

Author SHA1 Message Date
Frank Rolsted Jensen 9cff495183 Support for software flow control 2021-10-28 11:35:11 +02:00
2 changed files with 19 additions and 13 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
m4_define([pkg_version], [0.15]) m4_define([pkg_version], [0.14])
#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]))
+18 -12
View File
@@ -855,13 +855,21 @@ 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 | IXOFF)) else if ((tio->c_iflag & IXON) && (tio->c_iflag & IXOFF))
{ {
tty->master_suspended = 0; tty->master_suspended = 0;
if (tio->c_iflag & IXON) telnet_rfc2217_ctl(tty->tn, TNS_CTL_XONOFF_OUT);
telnet_rfc2217_ctl(tty->tn, TNS_CTL_XONOFF_OUT); telnet_rfc2217_ctl(tty->tn, TNS_CTL_XONOFF_IN);
if (tio->c_iflag & IXOFF) }
telnet_rfc2217_ctl(tty->tn, TNS_CTL_XONOFF_IN); else if (tio->c_iflag & IXON)
{
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
{ {
@@ -926,7 +934,6 @@ 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;
@@ -936,7 +943,6 @@ 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);
@@ -952,7 +958,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 = *(const unsigned int *)in_buf; tiocm = *(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)
@@ -968,7 +974,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 = *(const unsigned int *)in_buf; tiocm = *(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)
@@ -984,7 +990,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 = *(const unsigned int *)in_buf; tiocm = *(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);
@@ -1014,7 +1020,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 = *(const struct winsize *)in_buf; ws = *(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)
{ {
@@ -1038,7 +1044,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 = *(const int *)in_buf; val = *(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);