From 42a4e2e06248428764912b5e19a31bbd5519437e Mon Sep 17 00:00:00 2001 From: Kim Woelders Date: Fri, 18 Jun 2021 07:18:01 +0200 Subject: [PATCH] ttynvt_ioctl(): Cleanups around TCSET.. handling Avoid nested switches and unnecessary block level. --- src/ttynvt.c | 120 +++++++++++++++++++++++---------------------------- 1 file changed, 55 insertions(+), 65 deletions(-) diff --git a/src/ttynvt.c b/src/ttynvt.c index 3c345ae..ab26eb8 100644 --- a/src/ttynvt.c +++ b/src/ttynvt.c @@ -803,76 +803,66 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg, case TCSETSF: case TCSETSW: case TCSETS: - /* BEWARE of termios/termios2 buf structure difference! */ + CHECK_BUF_IN(sizeof(struct termios)); + memcpy(tio, in_buf, in_bufsz); + byte4 = htonl(_tio_baud(tio)); + goto do_tcset; case TCSETSF2: case TCSETSW2: case TCSETS2: + CHECK_BUF_IN(sizeof(struct termios2)); + memcpy(tio, in_buf, in_bufsz); + byte4 = htonl(_tio2_baud(tio)); + goto do_tcset; + do_tcset: + /* BEWARE of termios/termios2 buf structure difference! */ + telnet_rfc2217_cfg(tty->tn, TNS_SET_BAUDRATE, &byte4, 4); + + byte = _tio_csize(tio); + telnet_rfc2217_cfg(tty->tn, TNS_SET_DATASIZE, &byte, 1); + + byte = _tio_parity(tio); + telnet_rfc2217_cfg(tty->tn, TNS_SET_PARITY, &byte, 1); + + byte = _tio_stopb(tio); + telnet_rfc2217_cfg(tty->tn, TNS_SET_STOPSIZE, &byte, 1); + + if (tio->c_cflag & CRTSCTS) { - switch (cmd) - { - case TCSETSF: - case TCSETSW: - case TCSETS: - CHECK_BUF_IN(sizeof(struct termios)); - memcpy(tio, in_buf, in_bufsz); - byte4 = htonl(_tio_baud(tio)); - break; - case TCSETSF2: - case TCSETSW2: - case TCSETS2: - CHECK_BUF_IN(sizeof(struct termios2)); - memcpy(tio, in_buf, in_bufsz); - byte4 = htonl(_tio2_baud(tio)); - break; - } - telnet_rfc2217_cfg(tty->tn, TNS_SET_BAUDRATE, &byte4, 4); - - byte = _tio_csize(tio); - telnet_rfc2217_cfg(tty->tn, TNS_SET_DATASIZE, &byte, 1); - - byte = _tio_parity(tio); - telnet_rfc2217_cfg(tty->tn, TNS_SET_PARITY, &byte, 1); - - byte = _tio_stopb(tio); - telnet_rfc2217_cfg(tty->tn, TNS_SET_STOPSIZE, &byte, 1); - - if (tio->c_cflag & CRTSCTS) - { - tty->master_suspended = (tty->smcr & TIOCM_CTS) ? 0 : 1; - telnet_rfc2217_ctl(tty->tn, TNS_CTL_CTSRTS); - } - else - { - tty->master_suspended = 0; - telnet_rfc2217_ctl(tty->tn, TNS_CTL_NOFLOW); - } - - if (!(tty->cmcr & TIOCM_DTR) && _tio_baud(tio) != 0) - { - tty->cmcr |= TIOCM_DTR; - telnet_rfc2217_ctl(tty->tn, TNS_CTL_DTR_ON); - } - - switch (cmd) - { - case TCSETSF: - case TCSETSW: - case TCSETS: - _show_termios("TCSETS", tio); - break; - case TCSETSF2: - case TCSETSW2: - case TCSETS2: - _show_termios2("TCSETS2", tio); - break; - } - ioctl(tty->fds[FD_SLAVE].fd, cmd, tio); - - if (cmd == TCSETSF || cmd == TCSETSF2) - tty->slave_suspended = 0; /* Re-enable polling of Slave */ - - fuse_reply_ioctl(req, 0, 0, 0); + tty->master_suspended = (tty->smcr & TIOCM_CTS) ? 0 : 1; + telnet_rfc2217_ctl(tty->tn, TNS_CTL_CTSRTS); } + else + { + tty->master_suspended = 0; + telnet_rfc2217_ctl(tty->tn, TNS_CTL_NOFLOW); + } + + if (!(tty->cmcr & TIOCM_DTR) && _tio_baud(tio) != 0) + { + tty->cmcr |= TIOCM_DTR; + telnet_rfc2217_ctl(tty->tn, TNS_CTL_DTR_ON); + } + + switch (cmd) + { + case TCSETSF: + case TCSETSW: + case TCSETS: + _show_termios("TCSETS", tio); + break; + case TCSETSF2: + case TCSETSW2: + case TCSETS2: + _show_termios2("TCSETS2", tio); + break; + } + ioctl(tty->fds[FD_SLAVE].fd, cmd, tio); + + if (cmd == TCSETSF || cmd == TCSETSF2) + tty->slave_suspended = 0; /* Re-enable polling of Slave */ + + fuse_reply_ioctl(req, 0, 0, 0); break; case TCGETS: CHECK_BUF_OUT(sizeof(struct termios));