Fix running on big endian

RFC2217 options with one byte values were always sent with value = 0.
This commit is contained in:
Kim Woelders
2018-10-22 11:09:12 +02:00
parent 85394b243e
commit effca015a8
3 changed files with 17 additions and 12 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ extern void telnet_rfc2217_handle_opt(tn_ctx_t * tcc, int opt,
extern void telnet_rfc2217_cfg(tn_ctx_t * tcc, int cmd, extern void telnet_rfc2217_cfg(tn_ctx_t * tcc, int cmd,
const void *val, int nd); const void *val, int nd);
extern void telnet_rfc2217_ctl(tn_ctx_t * tcc, int cmd); extern void telnet_rfc2217_ctl(tn_ctx_t * tcc, unsigned int val);
/*RFC2217 modem state*/ /*RFC2217 modem state*/
#define TNS_STATE_CD 0x80 #define TNS_STATE_CD 0x80
+4 -2
View File
@@ -43,10 +43,12 @@ void telnet_rfc2217_cfg(tn_ctx_t * tcc, int cmd, const void *val, int nd)
telnet_set_opt(tcc, TNO_CPCO, cmd, val, nd); telnet_set_opt(tcc, TNO_CPCO, cmd, val, nd);
} }
void telnet_rfc2217_ctl(tn_ctx_t * tcc, int cmd) void telnet_rfc2217_ctl(tn_ctx_t * tcc, unsigned int val)
{ {
unsigned char byte = val;
if (!tcc->mode_rfc2217) if (!tcc->mode_rfc2217)
return; return;
telnet_set_opt(tcc, TNO_CPCO, TNS_SET_CONTROL, &cmd, 1); telnet_set_opt(tcc, TNO_CPCO, TNS_SET_CONTROL, &byte, 1);
} }
+12 -9
View File
@@ -707,6 +707,8 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
int mcr; int mcr;
int val; int val;
int res; int res;
unsigned char byte;
unsigned int byte4;
DBG("%s: cmd=%s arg=%p ibuf=%p:%u obuf=:%u\n", __func__, DBG("%s: cmd=%s arg=%p ibuf=%p:%u obuf=:%u\n", __func__,
_ioctl_name(cmd), arg, in_buf, _ioctl_name(cmd), arg, in_buf,
@@ -720,13 +722,13 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
CHECK_BUF_IN(sizeof(struct termios)); CHECK_BUF_IN(sizeof(struct termios));
{ {
speed_t speed; speed_t speed;
int csize, par, sb; unsigned char csize, par, sb;
memcpy(tio, in_buf, in_bufsz); memcpy(tio, in_buf, in_bufsz);
speed = tio->c_cflag & (CBAUD | CBAUDEX); speed = tio->c_cflag & (CBAUD | CBAUDEX);
val = htonl(baudrate(speed)); byte4 = htonl(baudrate(speed));
telnet_rfc2217_cfg(tty->tn, TNS_SET_BAUDRATE, &val, 4); telnet_rfc2217_cfg(tty->tn, TNS_SET_BAUDRATE, &byte4, 4);
if ((tio->c_cflag & CSIZE) == CS5) if ((tio->c_cflag & CSIZE) == CS5)
csize = 5; csize = 5;
@@ -787,6 +789,7 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
break; break;
case TCGETS: case TCGETS:
CHECK_BUF_OUT(sizeof(struct termios)); CHECK_BUF_OUT(sizeof(struct termios));
ioctl(tty->fds[FD_SLAVE].fd, TCGETS, tio);
fuse_reply_ioctl(req, 0, tio, sizeof(struct termios)); fuse_reply_ioctl(req, 0, tio, sizeof(struct termios));
break; break;
case TIOCINQ: /* Get the number of bytes in the input case TIOCINQ: /* Get the number of bytes in the input
@@ -817,18 +820,18 @@ ttynvt_ioctl(fuse_req_t req, int cmd, void *arg,
fuse_reply_ioctl(req, 0, 0, 0); fuse_reply_ioctl(req, 0, 0, 0);
break; break;
case TCIFLUSH: case TCIFLUSH:
val = 1; byte = 1;
telnet_rfc2217_cfg(tty->tn, TNS_SET_PURGE, &val, 1); telnet_rfc2217_cfg(tty->tn, TNS_SET_PURGE, &byte, 1);
fuse_reply_ioctl(req, 0, 0, 0); fuse_reply_ioctl(req, 0, 0, 0);
break; break;
case TCOFLUSH: case TCOFLUSH:
val = 2; byte = 2;
telnet_rfc2217_cfg(tty->tn, TNS_SET_PURGE, &val, 1); telnet_rfc2217_cfg(tty->tn, TNS_SET_PURGE, &byte, 1);
fuse_reply_ioctl(req, 0, 0, 0); fuse_reply_ioctl(req, 0, 0, 0);
break; break;
case TCIOFLUSH: case TCIOFLUSH:
val = 3; byte = 3;
telnet_rfc2217_cfg(tty->tn, TNS_SET_PURGE, &val, 1); telnet_rfc2217_cfg(tty->tn, TNS_SET_PURGE, &byte, 1);
fuse_reply_ioctl(req, 0, 0, 0); fuse_reply_ioctl(req, 0, 0, 0);
break; break;
case TIOCMGET: case TIOCMGET: