aboutsummaryrefslogtreecommitdiff
path: root/net/socat
diff options
context:
space:
mode:
authorEmanuel Haupt <ehaupt@FreeBSD.org>2018-05-07 08:13:07 +0000
committerEmanuel Haupt <ehaupt@FreeBSD.org>2018-05-07 08:13:07 +0000
commitde66077a3460ecb6afcb9120c899e0a460795622 (patch)
tree0d1e5a71b3b816eefe8c3c63fcd68a035f8d3a0d /net/socat
parent95676bf4228979b1d1f8565a2d0bc07a0c3084e5 (diff)
downloadports-de66077a3460ecb6afcb9120c899e0a460795622.tar.gz
ports-de66077a3460ecb6afcb9120c899e0a460795622.zip
Reinstate a patch from r384479 that was accidentally removed in r432474. It
restores support to bridge a serial port across tcp. Notified by: leres, Alexandre.Fenyo@secu-independants.fr (via mail) MFH: 2018Q2 (blanket)
Notes
Notes: svn path=/head/; revision=469273
Diffstat (limited to 'net/socat')
-rw-r--r--net/socat/Makefile2
-rw-r--r--net/socat/files/patch-xioopts.c73
2 files changed, 74 insertions, 1 deletions
diff --git a/net/socat/Makefile b/net/socat/Makefile
index 262f1bd0614d..b72f861ca223 100644
--- a/net/socat/Makefile
+++ b/net/socat/Makefile
@@ -3,7 +3,7 @@
PORTNAME= socat
PORTVERSION= 1.7.3.2
-PORTREVISION= 2
+PORTREVISION= 3
CATEGORIES= net ipv6
MASTER_SITES= http://www.dest-unreach.org/socat/download/ \
LOCAL/ehaupt
diff --git a/net/socat/files/patch-xioopts.c b/net/socat/files/patch-xioopts.c
new file mode 100644
index 000000000000..1a257fc36a31
--- /dev/null
+++ b/net/socat/files/patch-xioopts.c
@@ -0,0 +1,73 @@
+--- xioopts.c.orig 2015-01-24 10:15:22 UTC
++++ xioopts.c
+@@ -2971,6 +2971,25 @@ int retropt_bind(struct opt *opts,
+ OFUNC_TERMIOS_FLAG, OFUNC_TERMIOS_PATTERN, and some OFUNC_SPEC */
+ int applyopts(int fd, struct opt *opts, enum e_phase phase) {
+ struct opt *opt;
++#ifdef HAVE_TERMIOS_ISPEED
++ int ispeed_major = -1, ospeed_major = -1;
++ unsigned int ispeed_value, ospeed_value;
++ bool speed_done = false;
++
++ opt = opts; while (opt && opt->desc != ODESC_END) {
++ if (opt->desc == ODESC_DONE ||
++ (phase != PH_ALL && opt->desc->phase != phase)) {
++ ++opt; continue; }
++ if (opt->desc->optcode == OPT_ISPEED) {
++ ispeed_major = opt->desc->major;
++ ispeed_value = opt->value.u_uint; }
++ if (opt->desc->optcode == OPT_OSPEED) {
++ ospeed_major = opt->desc->major;
++ ospeed_value = opt->value.u_uint; }
++ ++opt;
++ continue;
++ }
++#endif /* HAVE_TERMIOS_ISPEED */
+
+ opt = opts; while (opt && opt->desc != ODESC_END) {
+ if (opt->desc == ODESC_DONE ||
+@@ -3605,21 +3624,29 @@ int applyopts(int fd, struct opt *opts,
+
+ #ifdef HAVE_TERMIOS_ISPEED
+ } else if (opt->desc->func == OFUNC_TERMIOS_SPEED) {
+- union {
+- struct termios termarg;
+- speed_t speeds[sizeof(struct termios)/sizeof(speed_t)];
+- } tdata;
+- if (Tcgetattr(fd, &tdata.termarg) < 0) {
+- Error3("tcgetattr(%d, %p): %s",
+- fd, &tdata.termarg, strerror(errno));
+- opt->desc = ODESC_ERROR; ++opt; continue;
+- }
+- tdata.speeds[opt->desc->major] = opt->value.u_uint;
+- if (Tcsetattr(fd, TCSADRAIN, &tdata.termarg) < 0) {
+- Error3("tcsetattr(%d, TCSADRAIN, %p): %s",
+- fd, &tdata.termarg, strerror(errno));
+- opt->desc = ODESC_ERROR; ++opt; continue;
+- }
++ if (speed_done == false) {
++ union {
++ struct termios termarg;
++ speed_t speeds[sizeof(struct termios)/sizeof(speed_t)];
++ } tdata;
++ if (Tcgetattr(fd, &tdata.termarg) < 0) {
++ Error3("tcgetattr(%d, %p): %s",
++ fd, &tdata.termarg, strerror(errno));
++ opt->desc = ODESC_ERROR; ++opt; continue;
++ }
++ if (ispeed_major < 0 || ospeed_major < 0)
++ tdata.speeds[opt->desc->major] = opt->value.u_uint;
++ else{
++ tdata.speeds[ispeed_major] = ispeed_value;
++ tdata.speeds[ospeed_major] = ospeed_value;
++ speed_done = true;
++ }
++ if (Tcsetattr(fd, TCSADRAIN, &tdata.termarg) < 0) {
++ Error3("tcsetattr(%d, TCSADRAIN, %p): %s",
++ fd, &tdata.termarg, strerror(errno));
++ opt->desc = ODESC_ERROR; ++opt; continue;
++ }
++ }
+ #endif /* HAVE_TERMIOS_ISPEED */
+
+ } else if (opt->desc->func == OFUNC_TERMIOS_SPEC) {