mirror of
https://repo.or.cz/socat.git
synced 2024-12-22 23:42:34 +00:00
Substituted ISPEED_OFFSET mechanism for cfsetispeed() calls
This commit is contained in:
parent
1301cacad3
commit
ea42d022c6
9 changed files with 112 additions and 84 deletions
2
CHANGES
2
CHANGES
|
@ -41,6 +41,8 @@ corrections:
|
||||||
Termios options TAB0,TAB1,TAB2,TAB3, and XTABS did not have an effect.
|
Termios options TAB0,TAB1,TAB2,TAB3, and XTABS did not have an effect.
|
||||||
Thanks to Alan Walters for reporting this bug.
|
Thanks to Alan Walters for reporting this bug.
|
||||||
|
|
||||||
|
Substituted cumbersom ISPEED_OFFSET mechanism for cfsetispeed() calls
|
||||||
|
|
||||||
testing:
|
testing:
|
||||||
test.sh: Show a warning when phase-1 (insecure phase) of a security
|
test.sh: Show a warning when phase-1 (insecure phase) of a security
|
||||||
test fails
|
test fails
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
"1.7.3.2"
|
"1.7.3.2+termios"
|
||||||
|
|
29
compat.h
29
compat.h
|
@ -350,6 +350,35 @@ typedef int sig_atomic_t;
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if _WITH_TERMIOS
|
||||||
|
#if !defined(HAVE_BASIC_SPEED_T) || !HAVE_BASIC_SPEED_T
|
||||||
|
# undef HAVE_BASIC_SPEED_T
|
||||||
|
# define HAVE_BASIC_SPEED_T 4
|
||||||
|
#endif
|
||||||
|
#ifndef F_speed
|
||||||
|
# if HAVE_BASIC_SPEED_T==1
|
||||||
|
#define F_speed "%hd"
|
||||||
|
# elif HAVE_BASIC_SPEED_T==2
|
||||||
|
#define F_speed "%hu"
|
||||||
|
# elif HAVE_BASIC_SPEED_T==3
|
||||||
|
#define F_speed "%""d"
|
||||||
|
# elif HAVE_BASIC_SPEED_T==4
|
||||||
|
#define F_speed "%u"
|
||||||
|
# elif HAVE_BASIC_SPEED_T==5
|
||||||
|
#define F_speed "%ld"
|
||||||
|
# elif HAVE_BASIC_SPEED_T==6
|
||||||
|
#define F_speed "%lu"
|
||||||
|
# elif HAVE_BASIC_SPEED_T==7
|
||||||
|
#define F_speed "%Ld"
|
||||||
|
# elif HAVE_BASIC_SPEED_T==8
|
||||||
|
#define F_speed "%Lu"
|
||||||
|
# else
|
||||||
|
#error "HAVE_BASIC_SPEED_T is out of range:" HAVE_BASIC_SPEED_T
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#endif /* _WITH_TERMIOS */
|
||||||
|
|
||||||
/* all unsigned; default; unsigned long */
|
/* all unsigned; default; unsigned long */
|
||||||
#if !defined(HAVE_TYPEOF_ST_INO) || !HAVE_TYPEOF_ST_INO
|
#if !defined(HAVE_TYPEOF_ST_INO) || !HAVE_TYPEOF_ST_INO
|
||||||
# undef HAVE_TYPEOF_ST_INO
|
# undef HAVE_TYPEOF_ST_INO
|
||||||
|
|
33
config.h.in
33
config.h.in
|
@ -321,6 +321,10 @@
|
||||||
/* fdset may have component fds_bits or __fds_bits */
|
/* fdset may have component fds_bits or __fds_bits */
|
||||||
#undef HAVE_FDS_BITS
|
#undef HAVE_FDS_BITS
|
||||||
|
|
||||||
|
/* struct termios may have components c_ispeed,c_ospeed */
|
||||||
|
#undef HAVE_STRUCT_TERMIOS_C_ISPEED
|
||||||
|
#undef HAVE_STRUCT_TERMIOS_C_OSPEED
|
||||||
|
|
||||||
/* Define if you have the sa_family_t */
|
/* Define if you have the sa_family_t */
|
||||||
#undef HAVE_TYPE_SA_FAMILY_T
|
#undef HAVE_TYPE_SA_FAMILY_T
|
||||||
|
|
||||||
|
@ -330,20 +334,6 @@
|
||||||
/* define if you have struct sock_extended_err */
|
/* define if you have struct sock_extended_err */
|
||||||
#undef HAVE_STRUCT_SOCK_EXTENDED_ERR
|
#undef HAVE_STRUCT_SOCK_EXTENDED_ERR
|
||||||
|
|
||||||
/* Define if your struct termios has component c_ispeed */
|
|
||||||
#undef HAVE_TERMIOS_ISPEED
|
|
||||||
|
|
||||||
/* the offset of c_ispeed in struct termios - usable in an speed_t array.
|
|
||||||
Applies only when HAVE_TERMIOS_ISPEED is set */
|
|
||||||
#undef ISPEED_OFFSET
|
|
||||||
|
|
||||||
/* the offset of c_ospeed in struct termios - see ISPEED_OFFSET */
|
|
||||||
#ifdef ISPEED_OFFSET
|
|
||||||
# define OSPEED_OFFSET (ISPEED_OFFSET+1)
|
|
||||||
#else
|
|
||||||
# undef OSPEED_OFFSET
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Define if your termios.h likes _SVID3 defined */
|
/* Define if your termios.h likes _SVID3 defined */
|
||||||
#undef _SVID3
|
#undef _SVID3
|
||||||
|
|
||||||
|
@ -422,6 +412,20 @@
|
||||||
/* Define if you have the unsetenv function. not on HP-UX */
|
/* Define if you have the unsetenv function. not on HP-UX */
|
||||||
#undef HAVE_UNSETENV
|
#undef HAVE_UNSETENV
|
||||||
|
|
||||||
|
/* Define if you have the cfsetispeed,cfgetispeed,cfsetspeed,cfgetospeed function */
|
||||||
|
#undef HAVE_CFSETISPEED
|
||||||
|
#undef HAVE_CFSETOSPEED
|
||||||
|
|
||||||
|
#if HAVE_CFSETISPEED
|
||||||
|
# define HAVE_TERMIOS_ISPEED 1
|
||||||
|
#endif
|
||||||
|
#if HAVE_CFSETOSPEED
|
||||||
|
# define HAVE_TERMIOS_OSPEED 1
|
||||||
|
#endif
|
||||||
|
#if defined(HAVE_TERMIOS_ISPEED) && defined(HAVE_TERMIOS_OSPEED)
|
||||||
|
# define HAVE_TERMIOS_SPEED 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Define if you have the SSLv2 client and server method functions. not in new openssl */
|
/* Define if you have the SSLv2 client and server method functions. not in new openssl */
|
||||||
#undef HAVE_SSLv2_client_method
|
#undef HAVE_SSLv2_client_method
|
||||||
#undef HAVE_SSLv2_server_method
|
#undef HAVE_SSLv2_server_method
|
||||||
|
@ -558,6 +562,7 @@
|
||||||
#undef HAVE_BASIC_OFF_T
|
#undef HAVE_BASIC_OFF_T
|
||||||
#undef HAVE_BASIC_OFF64_T
|
#undef HAVE_BASIC_OFF64_T
|
||||||
#undef HAVE_BASIC_DEV_T
|
#undef HAVE_BASIC_DEV_T
|
||||||
|
#undef HAVE_BASIC_SPEED_T
|
||||||
|
|
||||||
#undef HAVE_BASIC_SOCKLEN_T
|
#undef HAVE_BASIC_SOCKLEN_T
|
||||||
|
|
||||||
|
|
69
configure.in
69
configure.in
|
@ -749,6 +749,9 @@ AC_CHECK_FUNCS(grantpt unlockpt)
|
||||||
# GR AC_CHECK_FUNCS only checks linking, not prototype. This may lead to implicit
|
# GR AC_CHECK_FUNCS only checks linking, not prototype. This may lead to implicit
|
||||||
# function declarations and to SIGSEGV on systems with 32bit int and 64bit pointer
|
# function declarations and to SIGSEGV on systems with 32bit int and 64bit pointer
|
||||||
|
|
||||||
|
dnl Search for cfsetispeed(),cfgetispeed(),cfsetspeed(),cfgetospeed() functions
|
||||||
|
AC_CHECK_FUNCS(cfsetispeed cfgetispeed cfsetospeed cfgetospeed)
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
# check for prototype and existence of functions that return a pointer
|
# check for prototype and existence of functions that return a pointer
|
||||||
# defines in config.h: HAVE_PROTOTYPE_LIB_$1
|
# defines in config.h: HAVE_PROTOTYPE_LIB_$1
|
||||||
|
@ -915,7 +918,6 @@ AC_MSG_RESULT($sc_cv_type_uint64)
|
||||||
|
|
||||||
|
|
||||||
### fds_bits
|
### fds_bits
|
||||||
|
|
||||||
AC_MSG_CHECKING(for fdset->fds_bits)
|
AC_MSG_CHECKING(for fdset->fds_bits)
|
||||||
AC_TRY_COMPILE([#include <sys/types.h>
|
AC_TRY_COMPILE([#include <sys/types.h>
|
||||||
#if HAVE_SYS_SELECT_H
|
#if HAVE_SYS_SELECT_H
|
||||||
|
@ -925,6 +927,24 @@ AC_TRY_COMPILE([#include <sys/types.h>
|
||||||
[AC_MSG_RESULT(yes); AC_DEFINE(HAVE_FDS_BITS)],
|
[AC_MSG_RESULT(yes); AC_DEFINE(HAVE_FDS_BITS)],
|
||||||
[AC_MSG_RESULT(no);])
|
[AC_MSG_RESULT(no);])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(for struct termios . c_ispeed)
|
||||||
|
AC_TRY_COMPILE([#include <unistd.h>
|
||||||
|
#if HAVE_TERMIOS_H
|
||||||
|
#include <termios.h>
|
||||||
|
#endif],
|
||||||
|
[struct termios s; s.c_ispeed=0;],
|
||||||
|
[AC_MSG_RESULT(yes); AC_DEFINE(HAVE_STRUCT_TERMIOS_C_ISPEED)],
|
||||||
|
[AC_MSG_RESULT(no);])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING(for struct termios . c_ospeed)
|
||||||
|
AC_TRY_COMPILE([#include <unistd.h>
|
||||||
|
#if HAVE_TERMIOS_H
|
||||||
|
#include <termios.h>
|
||||||
|
#endif],
|
||||||
|
[struct termios s; s.c_ospeed=0;],
|
||||||
|
[AC_MSG_RESULT(yes); AC_DEFINE(HAVE_STRUCT_TERMIOS_C_OSPEED)],
|
||||||
|
[AC_MSG_RESULT(no);])
|
||||||
|
|
||||||
AC_MSG_CHECKING(for sa_family_t)
|
AC_MSG_CHECKING(for sa_family_t)
|
||||||
AC_CACHE_VAL(sc_cv_type_sa_family_t,
|
AC_CACHE_VAL(sc_cv_type_sa_family_t,
|
||||||
[AC_TRY_COMPILE([#include <sys/types.h>
|
[AC_TRY_COMPILE([#include <sys/types.h>
|
||||||
|
@ -963,50 +983,6 @@ if test $sc_cv_struct_sigaction_sa_sigaction = yes; then
|
||||||
fi
|
fi
|
||||||
AC_MSG_RESULT($sc_cv_struct_sigaction_sa_sigaction)
|
AC_MSG_RESULT($sc_cv_struct_sigaction_sa_sigaction)
|
||||||
|
|
||||||
### struct termios .c_ispeed
|
|
||||||
AC_MSG_CHECKING(for termios.c_ispeed)
|
|
||||||
AC_CACHE_VAL(sc_cv_termios_ispeed,
|
|
||||||
[AC_TRY_COMPILE([#include <termios.h>],
|
|
||||||
[struct termios t; t.c_ispeed=0;],
|
|
||||||
[sc_cv_termios_ispeed=yes],
|
|
||||||
[sc_cv_termios_ispeed=no])])
|
|
||||||
if test $sc_cv_termios_ispeed = yes; then
|
|
||||||
AC_DEFINE(HAVE_TERMIOS_ISPEED)
|
|
||||||
fi
|
|
||||||
AC_MSG_RESULT($sc_cv_termios_ispeed)
|
|
||||||
|
|
||||||
if test $sc_cv_termios_ispeed = yes; then
|
|
||||||
AC_MSG_CHECKING(for offset of c_ispeed in struct termios)
|
|
||||||
LIBS1="$LIBS"; LIBS="" # avoid libwrap allow_severity undefined
|
|
||||||
AC_CACHE_VAL(ac_cv_ispeed_offset,
|
|
||||||
[conftestspeedoff="conftestspeedoff.out"
|
|
||||||
AC_TRY_RUN([
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <termios.h>
|
|
||||||
#include <string.h>
|
|
||||||
int main(){
|
|
||||||
struct termios t;
|
|
||||||
FILE *f;
|
|
||||||
if ((f=fopen("$conftestspeedoff","w"))==NULL){
|
|
||||||
fprintf(stderr,"\\"$conftestspeedoff\\": %s\n",strerror(errno)); exit(-1);
|
|
||||||
}
|
|
||||||
fprintf(f, "%d", ((char*)&t.c_ispeed-(char*)&t)/sizeof(speed_t));
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
],
|
|
||||||
[ac_cv_ispeed_offset=`cat $conftestspeedoff`],
|
|
||||||
[ac_cv_ispeed_offset=-1],
|
|
||||||
[ac_cv_ispeed_offset="((unsigned long)&((struct termios *)0)->c_ispeed / sizeof(speed_t))"]
|
|
||||||
)])
|
|
||||||
LIBS="$LIBS1"
|
|
||||||
AC_MSG_RESULT($ac_cv_ispeed_offset)
|
|
||||||
if test "$ac_cv_ispeed_offset" != -1; then
|
|
||||||
AC_DEFINE_UNQUOTED(ISPEED_OFFSET, $ac_cv_ispeed_offset)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# there is another issue with termios: OSR requires "#define _SVID3 ..."
|
# there is another issue with termios: OSR requires "#define _SVID3 ..."
|
||||||
# for reasonable termios support. We check this situation using IMAXBEL
|
# for reasonable termios support. We check this situation using IMAXBEL
|
||||||
AC_MSG_CHECKING(if _SVID3 is helpful)
|
AC_MSG_CHECKING(if _SVID3 is helpful)
|
||||||
|
@ -1817,6 +1793,9 @@ AC_BASIC_TYPE([#include <sys/types.h>
|
||||||
# oh god, __dev_t in Linux 2.4 is struct{int[2];}, not handled here yet.
|
# oh god, __dev_t in Linux 2.4 is struct{int[2];}, not handled here yet.
|
||||||
AC_BASIC_TYPE([#include <sys/stat.h>], dev_t, HAVE_BASIC_DEV_T, sc_cv_type_dev_basic)
|
AC_BASIC_TYPE([#include <sys/stat.h>], dev_t, HAVE_BASIC_DEV_T, sc_cv_type_dev_basic)
|
||||||
|
|
||||||
|
AC_BASIC_TYPE([#include <unistd.h>
|
||||||
|
#include <termios.h>], speed_t, HAVE_BASIC_SPEED_T, sc_cv_type_spee_t)
|
||||||
|
|
||||||
AC_TYPEOF_COMPONENT([#include <sys/stat.h>], struct stat, st_ino, HAVE_TYPEOF_ST_INO, sc_cv_type_stat_stino_basic)
|
AC_TYPEOF_COMPONENT([#include <sys/stat.h>], struct stat, st_ino, HAVE_TYPEOF_ST_INO, sc_cv_type_stat_stino_basic)
|
||||||
AC_TYPEOF_COMPONENT([#include <sys/stat.h>], struct stat, st_nlink, HAVE_TYPEOF_ST_NLINK, sc_cv_type_stat_stnlink_basic)
|
AC_TYPEOF_COMPONENT([#include <sys/stat.h>], struct stat, st_nlink, HAVE_TYPEOF_ST_NLINK, sc_cv_type_stat_stnlink_basic)
|
||||||
AC_TYPEOF_COMPONENT([#include <sys/stat.h>], struct stat, st_size, HAVE_TYPEOF_ST_SIZE, sc_cv_type_stat_stsize_basic)
|
AC_TYPEOF_COMPONENT([#include <sys/stat.h>], struct stat, st_size, HAVE_TYPEOF_ST_SIZE, sc_cv_type_stat_stsize_basic)
|
||||||
|
|
17
sycls.c
17
sycls.c
|
@ -1472,10 +1472,18 @@ int Tcgetattr(int fd, struct termios *termios_p) {
|
||||||
cp += sprintf(cp, "%02x,", termios_p->c_cc[i]);
|
cp += sprintf(cp, "%02x,", termios_p->c_cc[i]);
|
||||||
}
|
}
|
||||||
sprintf(cp, "%02x", termios_p->c_cc[i]);
|
sprintf(cp, "%02x", termios_p->c_cc[i]);
|
||||||
|
#if HAVE_STRUCT_TERMIOS_C_ISPEED && HAVE_STRUCT_TERMIOS_C_OSPEED
|
||||||
|
Debug8("tcgetattr(, {%08x,%08x,%08x,%08x, "F_speed","F_speed", %s}) -> %d",
|
||||||
|
termios_p->c_iflag, termios_p->c_oflag,
|
||||||
|
termios_p->c_cflag, termios_p->c_lflag,
|
||||||
|
termios_p->c_ispeed, termios_p->c_ospeed,
|
||||||
|
chars, result);
|
||||||
|
#else
|
||||||
Debug6("tcgetattr(, {%08x,%08x,%08x,%08x,%s}) -> %d",
|
Debug6("tcgetattr(, {%08x,%08x,%08x,%08x,%s}) -> %d",
|
||||||
termios_p->c_iflag, termios_p->c_oflag,
|
termios_p->c_iflag, termios_p->c_oflag,
|
||||||
termios_p->c_cflag, termios_p->c_lflag,
|
termios_p->c_cflag, termios_p->c_lflag,
|
||||||
chars, result);
|
chars, result);
|
||||||
|
#endif
|
||||||
errno = _errno;
|
errno = _errno;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1490,9 +1498,18 @@ int Tcsetattr(int fd, int optional_actions, struct termios *termios_p) {
|
||||||
cp += sprintf(cp, "%02x,", termios_p->c_cc[i]);
|
cp += sprintf(cp, "%02x,", termios_p->c_cc[i]);
|
||||||
}
|
}
|
||||||
sprintf(cp, "%02x", termios_p->c_cc[i]);
|
sprintf(cp, "%02x", termios_p->c_cc[i]);
|
||||||
|
#if HAVE_STRUCT_TERMIOS_C_ISPEED && HAVE_STRUCT_TERMIOS_C_OSPEED
|
||||||
|
Debug9("tcsetattr(%d, %d, {%08x,%08x,%08x,%08x, "F_speed","F_speed", %s})",
|
||||||
|
fd, optional_actions,
|
||||||
|
termios_p->c_iflag, termios_p->c_oflag,
|
||||||
|
termios_p->c_cflag, termios_p->c_lflag,
|
||||||
|
termios_p->c_ispeed, termios_p->c_ospeed,
|
||||||
|
chars);
|
||||||
|
#else
|
||||||
Debug7("tcsetattr(%d, %d, {%08x,%08x,%08x,%08x,%s})", fd, optional_actions,
|
Debug7("tcsetattr(%d, %d, {%08x,%08x,%08x,%08x,%s})", fd, optional_actions,
|
||||||
termios_p->c_iflag, termios_p->c_oflag,
|
termios_p->c_iflag, termios_p->c_oflag,
|
||||||
termios_p->c_cflag, termios_p->c_lflag, chars);
|
termios_p->c_cflag, termios_p->c_lflag, chars);
|
||||||
|
#endif
|
||||||
result = tcsetattr(fd, optional_actions, termios_p);
|
result = tcsetattr(fd, optional_actions, termios_p);
|
||||||
_errno = errno;
|
_errno = errno;
|
||||||
Debug1("tcsetattr() -> %d", result);
|
Debug1("tcsetattr() -> %d", result);
|
||||||
|
|
|
@ -272,14 +272,12 @@ const struct optdesc opt_sane = { "sane", NULL, OPT_SANE, GROUP_TER
|
||||||
const struct optdesc opt_termios_cfmakeraw = { "termios-cfmakeraw", "cfmakeraw", OPT_TERMIOS_CFMAKERAW, GROUP_TERMIOS, PH_FD, TYPE_CONST, OFUNC_TERMIOS_SPEC };
|
const struct optdesc opt_termios_cfmakeraw = { "termios-cfmakeraw", "cfmakeraw", OPT_TERMIOS_CFMAKERAW, GROUP_TERMIOS, PH_FD, TYPE_CONST, OFUNC_TERMIOS_SPEC };
|
||||||
const struct optdesc opt_termios_rawer = { "termios-rawer", "rawer", OPT_TERMIOS_RAWER, GROUP_TERMIOS, PH_FD, TYPE_CONST, OFUNC_TERMIOS_SPEC };
|
const struct optdesc opt_termios_rawer = { "termios-rawer", "rawer", OPT_TERMIOS_RAWER, GROUP_TERMIOS, PH_FD, TYPE_CONST, OFUNC_TERMIOS_SPEC };
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS_ISPEED
|
#if HAVE_TERMIOS_ISPEED
|
||||||
#if defined(ISPEED_OFFSET) && (ISPEED_OFFSET != -1)
|
const struct optdesc opt_ispeed = { "ispeed", NULL, OPT_ISPEED, GROUP_TERMIOS, PH_FD, TYPE_UINT, OFUNC_TERMIOS_SPEED, 0/*in*/ };
|
||||||
#if defined(OSPEED_OFFSET) && (OSPEED_OFFSET != -1)
|
|
||||||
const struct optdesc opt_ispeed = { "ispeed", NULL, OPT_ISPEED, GROUP_TERMIOS, PH_FD, TYPE_UINT, OFUNC_TERMIOS_SPEED, ISPEED_OFFSET };
|
|
||||||
const struct optdesc opt_ospeed = { "ospeed", NULL, OPT_OSPEED, GROUP_TERMIOS, PH_FD, TYPE_UINT, OFUNC_TERMIOS_SPEED, OSPEED_OFFSET };
|
|
||||||
#endif
|
#endif
|
||||||
|
#if HAVE_TERMIOS_OSPEED
|
||||||
|
const struct optdesc opt_ospeed = { "ospeed", NULL, OPT_OSPEED, GROUP_TERMIOS, PH_FD, TYPE_UINT, OFUNC_TERMIOS_SPEED, 1/*out*/ };
|
||||||
#endif
|
#endif
|
||||||
#endif /* HAVE_TERMIOS_ISPEED */
|
|
||||||
|
|
||||||
|
|
||||||
int xiotermiosflag_applyopt(int fd, struct opt *opt) {
|
int xiotermiosflag_applyopt(int fd, struct opt *opt) {
|
||||||
|
@ -302,9 +300,6 @@ bool _xiotermios_doit = false; /* _data has been retrieved and manipulated, set
|
||||||
union {
|
union {
|
||||||
struct termios termarg;
|
struct termios termarg;
|
||||||
tcflag_t flags[4];
|
tcflag_t flags[4];
|
||||||
#ifdef HAVE_TERMIOS_ISPEED
|
|
||||||
speed_t speeds[sizeof(struct termios)/sizeof(speed_t)];
|
|
||||||
#endif
|
|
||||||
} _xiotermios_data;
|
} _xiotermios_data;
|
||||||
|
|
||||||
int xiotermios_setflag(int fd, int word, tcflag_t mask) {
|
int xiotermios_setflag(int fd, int word, tcflag_t mask) {
|
||||||
|
@ -360,8 +355,8 @@ int xiotermios_char(int fd, int n, unsigned char c) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_TERMIOS_ISPEED
|
#if HAVE_TERMIOS_ISPEED || HAVE_TERMIOS_OSPEED
|
||||||
int xiotermios_speed(int fd, int n, unsigned int speed) {
|
int xiotermios_speed(int fd, int n, speed_t speed) {
|
||||||
if (!_xiotermios_doit) {
|
if (!_xiotermios_doit) {
|
||||||
if (Tcgetattr(fd, &_xiotermios_data.termarg) < 0) {
|
if (Tcgetattr(fd, &_xiotermios_data.termarg) < 0) {
|
||||||
Error3("tcgetattr(%d, %p): %s",
|
Error3("tcgetattr(%d, %p): %s",
|
||||||
|
@ -370,7 +365,18 @@ int xiotermios_speed(int fd, int n, unsigned int speed) {
|
||||||
}
|
}
|
||||||
_xiotermios_doit = true;
|
_xiotermios_doit = true;
|
||||||
}
|
}
|
||||||
_xiotermios_data.speeds[n] = speed;
|
if (n == 0) {
|
||||||
|
if (cfsetispeed(&_xiotermios_data.termarg, speed) < 0) {
|
||||||
|
Error3("cfsetispeed(%p, "F_speed"): %s",
|
||||||
|
&_xiotermios_data.termarg, speed, strerror(errno));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (cfsetospeed(&_xiotermios_data.termarg, speed) < 0) {
|
||||||
|
Error3("cfsetospeed(%p, "F_speed"): %s",
|
||||||
|
&_xiotermios_data.termarg, speed, strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Tcgetattr(fd, &_xiotermios_data.termarg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /* HAVE_TERMIOS_ISPEED */
|
#endif /* HAVE_TERMIOS_ISPEED */
|
||||||
|
|
|
@ -62,16 +62,6 @@ int xioinitialize(void) {
|
||||||
assert(tdata.termarg.c_oflag == tdata.flags[1]);
|
assert(tdata.termarg.c_oflag == tdata.flags[1]);
|
||||||
assert(tdata.termarg.c_cflag == tdata.flags[2]);
|
assert(tdata.termarg.c_cflag == tdata.flags[2]);
|
||||||
assert(tdata.termarg.c_lflag == tdata.flags[3]);
|
assert(tdata.termarg.c_lflag == tdata.flags[3]);
|
||||||
#if HAVE_TERMIOS_ISPEED && (ISPEED_OFFSET != -1) && (OSPEED_OFFSET != -1)
|
|
||||||
#if defined(ISPEED_OFFSET) && (ISPEED_OFFSET != -1)
|
|
||||||
#if defined(OSPEED_OFFSET) && (OSPEED_OFFSET != -1)
|
|
||||||
tdata.termarg.c_ispeed = 0x56789abc;
|
|
||||||
tdata.termarg.c_ospeed = 0x6789abcd;
|
|
||||||
assert(tdata.termarg.c_ispeed == tdata.speeds[ISPEED_OFFSET]);
|
|
||||||
assert(tdata.termarg.c_ospeed == tdata.speeds[OSPEED_OFFSET]);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -790,7 +790,7 @@ const struct optname optionnames[] = {
|
||||||
IF_IP6 ("ipv6only", &opt_ipv6_v6only)
|
IF_IP6 ("ipv6only", &opt_ipv6_v6only)
|
||||||
#endif
|
#endif
|
||||||
IF_TERMIOS("isig", &opt_isig)
|
IF_TERMIOS("isig", &opt_isig)
|
||||||
#if defined(HAVE_TERMIOS_ISPEED) && defined(ISPEED_OFFSET) && (ISPEED_OFFSET != -1)
|
#if HAVE_TERMIOS_ISPEED
|
||||||
IF_TERMIOS("ispeed", &opt_ispeed)
|
IF_TERMIOS("ispeed", &opt_ispeed)
|
||||||
#endif
|
#endif
|
||||||
IF_TERMIOS("istrip", &opt_istrip)
|
IF_TERMIOS("istrip", &opt_istrip)
|
||||||
|
@ -1113,7 +1113,7 @@ const struct optname optionnames[] = {
|
||||||
IF_OPENSSL("openssl-pseudo", &opt_openssl_pseudo)
|
IF_OPENSSL("openssl-pseudo", &opt_openssl_pseudo)
|
||||||
IF_OPENSSL("openssl-verify", &opt_openssl_verify)
|
IF_OPENSSL("openssl-verify", &opt_openssl_verify)
|
||||||
IF_TERMIOS("opost", &opt_opost)
|
IF_TERMIOS("opost", &opt_opost)
|
||||||
#if defined(HAVE_TERMIOS_ISPEED) && defined(OSPEED_OFFSET) && (OSPEED_OFFSET != -1)
|
#if HAVE_TERMIOS_OSPEED
|
||||||
IF_TERMIOS("ospeed", &opt_ospeed)
|
IF_TERMIOS("ospeed", &opt_ospeed)
|
||||||
#endif
|
#endif
|
||||||
IF_ANY ("owner", &opt_user)
|
IF_ANY ("owner", &opt_user)
|
||||||
|
|
Loading…
Reference in a new issue