mirror of
https://github.com/oasislinux/oasis.git
synced 2026-10-14 15:57:47 +02:00
206 lines
5.5 KiB
Diff
206 lines
5.5 KiB
Diff
From 36bb1d71b1e6963feb61fdf13c3e2f1cd55b0f5c Mon Sep 17 00:00:00 2001
|
|
From: Michael Forney <mforney@mforney.org>
|
|
Date: Mon, 2 Dec 2019 21:11:04 -0800
|
|
Subject: [PATCH] nc: Portability fixes from libressl-portable
|
|
|
|
---
|
|
usr.bin/nc/netcat.c | 59 +++++++++++++++++++++++++++++++++++++++------
|
|
1 file changed, 52 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/usr.bin/nc/netcat.c b/usr.bin/nc/netcat.c
|
|
index 9361ff50cd9..4fd399a6f89 100644
|
|
--- a/usr.bin/nc/netcat.c
|
|
+++ b/usr.bin/nc/netcat.c
|
|
@@ -73,6 +73,10 @@
|
|
#define TLS_CCERT (1 << 3)
|
|
#define TLS_MUSTSTAPLE (1 << 4)
|
|
|
|
+#ifndef IPTOS_DSCP_VA
|
|
+#define IPTOS_DSCP_VA 0xb0
|
|
+#endif
|
|
+
|
|
/* Command Line Options */
|
|
int dflag; /* detached, no stdin */
|
|
int Fflag; /* fdpass sock to stdout */
|
|
@@ -93,9 +97,13 @@ int zflag; /* Port Scan Flag */
|
|
int Dflag; /* sodebug */
|
|
int Iflag; /* TCP receive buffer size */
|
|
int Oflag; /* TCP send buffer size */
|
|
+#ifdef TCP_MD5SIG
|
|
int Sflag; /* TCP MD5 signature option */
|
|
+#endif
|
|
int Tflag = -1; /* IP Type of Service */
|
|
+#ifdef SO_RTABLE
|
|
int rtableid = -1;
|
|
+#endif
|
|
|
|
int usetls; /* use TLS */
|
|
const char *Cflag; /* Public cert file */
|
|
@@ -271,12 +279,14 @@ main(int argc, char *argv[])
|
|
case 'u':
|
|
uflag = 1;
|
|
break;
|
|
+#ifdef SO_RTABLE
|
|
case 'V':
|
|
rtableid = (int)strtonum(optarg, 0,
|
|
RT_TABLEID_MAX, &errstr);
|
|
if (errstr)
|
|
errx(1, "rtable %s: %s", errstr, optarg);
|
|
break;
|
|
+#endif
|
|
case 'v':
|
|
vflag = 1;
|
|
break;
|
|
@@ -323,9 +333,11 @@ main(int argc, char *argv[])
|
|
case 'o':
|
|
oflag = optarg;
|
|
break;
|
|
+#ifdef TCP_MD5SIG
|
|
case 'S':
|
|
Sflag = 1;
|
|
break;
|
|
+#endif
|
|
case 'T':
|
|
errstr = NULL;
|
|
errno = 0;
|
|
@@ -349,9 +361,11 @@ main(int argc, char *argv[])
|
|
argc -= optind;
|
|
argv += optind;
|
|
|
|
+#ifdef SO_RTABLE
|
|
if (rtableid >= 0)
|
|
if (setrtable(rtableid) == -1)
|
|
err(1, "setrtable");
|
|
+#endif
|
|
|
|
/* Cruft to make sure options are clean, and used properly. */
|
|
if (argc == 1 && family == AF_UNIX) {
|
|
@@ -930,7 +944,10 @@ remote_connect(const char *host, const char *port, struct addrinfo hints,
|
|
char *ipaddr)
|
|
{
|
|
struct addrinfo *res, *res0;
|
|
- int s = -1, error, herr, on = 1, save_errno;
|
|
+ int s = -1, error, herr, save_errno;
|
|
+#ifdef SO_BINDANY
|
|
+ int on = 1;
|
|
+#endif
|
|
|
|
if ((error = getaddrinfo(host, port, &hints, &res0)))
|
|
errx(1, "getaddrinfo for host \"%s\" port %s: %s", host,
|
|
@@ -945,8 +962,10 @@ remote_connect(const char *host, const char *port, struct addrinfo hints,
|
|
if (sflag || pflag) {
|
|
struct addrinfo ahints, *ares;
|
|
|
|
+#ifdef SO_BINDANY
|
|
/* try SO_BINDANY, but don't insist */
|
|
setsockopt(s, SOL_SOCKET, SO_BINDANY, &on, sizeof(on));
|
|
+#endif
|
|
memset(&ahints, 0, sizeof(struct addrinfo));
|
|
ahints.ai_family = res->ai_family;
|
|
ahints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
|
|
@@ -1038,8 +1057,11 @@ int
|
|
local_listen(const char *host, const char *port, struct addrinfo hints)
|
|
{
|
|
struct addrinfo *res, *res0;
|
|
- int s = -1, ret, x = 1, save_errno;
|
|
+ int s = -1, save_errno;
|
|
int error;
|
|
+#ifdef SO_REUSEPORT
|
|
+ int ret, x = 1;
|
|
+#endif
|
|
|
|
/* Allow nodename to be null. */
|
|
hints.ai_flags |= AI_PASSIVE;
|
|
@@ -1059,9 +1081,11 @@ local_listen(const char *host, const char *port, struct addrinfo hints)
|
|
res->ai_protocol)) == -1)
|
|
continue;
|
|
|
|
+#ifdef SO_REUSEPORT
|
|
ret = setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof(x));
|
|
if (ret == -1)
|
|
err(1, NULL);
|
|
+#endif
|
|
|
|
set_common_sockopts(s, res->ai_family);
|
|
|
|
@@ -1571,11 +1595,13 @@ set_common_sockopts(int s, int af)
|
|
{
|
|
int x = 1;
|
|
|
|
+#ifdef TCP_MD5SIG
|
|
if (Sflag) {
|
|
if (setsockopt(s, IPPROTO_TCP, TCP_MD5SIG,
|
|
&x, sizeof(x)) == -1)
|
|
err(1, NULL);
|
|
}
|
|
+#endif
|
|
if (Dflag) {
|
|
if (setsockopt(s, SOL_SOCKET, SO_DEBUG,
|
|
&x, sizeof(x)) == -1)
|
|
@@ -1586,9 +1612,16 @@ set_common_sockopts(int s, int af)
|
|
IP_TOS, &Tflag, sizeof(Tflag)) == -1)
|
|
err(1, "set IP ToS");
|
|
|
|
+#ifdef IPV6_TCLASS
|
|
else if (af == AF_INET6 && setsockopt(s, IPPROTO_IPV6,
|
|
IPV6_TCLASS, &Tflag, sizeof(Tflag)) == -1)
|
|
err(1, "set IPv6 traffic class");
|
|
+#else
|
|
+ else if (af == AF_INET6) {
|
|
+ errno = ENOPROTOOPT;
|
|
+ err(1, "set IPv6 traffic class not supported");
|
|
+ }
|
|
+#endif
|
|
}
|
|
if (Iflag) {
|
|
if (setsockopt(s, SOL_SOCKET, SO_RCVBUF,
|
|
@@ -1612,13 +1645,17 @@ set_common_sockopts(int s, int af)
|
|
}
|
|
|
|
if (minttl != -1) {
|
|
+#ifdef IP_MINTTL
|
|
if (af == AF_INET && setsockopt(s, IPPROTO_IP,
|
|
IP_MINTTL, &minttl, sizeof(minttl)))
|
|
err(1, "set IP min TTL");
|
|
+#endif
|
|
|
|
- else if (af == AF_INET6 && setsockopt(s, IPPROTO_IPV6,
|
|
+#ifdef IPV6_MINHOPCOUNT
|
|
+ if (af == AF_INET6 && setsockopt(s, IPPROTO_IPV6,
|
|
IPV6_MINHOPCOUNT, &minttl, sizeof(minttl)))
|
|
err(1, "set IPv6 min hop count");
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
@@ -1849,14 +1886,22 @@ help(void)
|
|
\t-P proxyuser\tUsername for proxy authentication\n\
|
|
\t-p port\t Specify local port for remote connects\n\
|
|
\t-R CAfile CA bundle\n\
|
|
- \t-r Randomize remote ports\n\
|
|
- \t-S Enable the TCP MD5 signature option\n\
|
|
+ \t-r Randomize remote ports\n"
|
|
+#ifdef TCP_MD5SIG
|
|
+ "\
|
|
+ \t-S Enable the TCP MD5 signature option\n"
|
|
+#endif
|
|
+ "\
|
|
\t-s sourceaddr Local source address\n\
|
|
\t-T keyword TOS value or TLS options\n\
|
|
\t-t Answer TELNET negotiation\n\
|
|
\t-U Use UNIX domain socket\n\
|
|
- \t-u UDP mode\n\
|
|
- \t-V rtable Specify alternate routing table\n\
|
|
+ \t-u UDP mode\n"
|
|
+#ifdef SO_RTABLE
|
|
+ "\
|
|
+ \t-V rtable Specify alternate routing table\n"
|
|
+#endif
|
|
+ "\
|
|
\t-v Verbose\n\
|
|
\t-W recvlimit Terminate after receiving a number of packets\n\
|
|
\t-w timeout Timeout for connects and final net reads\n\
|
|
--
|
|
2.54.0
|
|
|