Merge nc(1) from OpenBSD 4.4. While there, rename our '-O' (no

tcp options) to '--no-tcpopt' in order to resolve a comflicit
with OpenBSD's -O semantics.
This commit is contained in:
Xin LI 2008-12-19 23:00:23 +00:00
commit 7dcaa833c8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=186343
3 changed files with 66 additions and 20 deletions

View File

@ -1,7 +1,7 @@
# $FreeBSD$ # $FreeBSD$
Project: netcat (aka src/usr.bin/nc in OpenBSD) Project: netcat (aka src/usr.bin/nc in OpenBSD)
ProjectURL: http://www.openbsd.org/ ProjectURL: http://www.openbsd.org/
Version: 4.3 Version: 4.4
VendorTag: OPENBSD VendorTag: OPENBSD
VersionTag: OPENBSD_4_3 VersionTag: OPENBSD_4_4
License: BSD License: BSD

View File

@ -1,4 +1,4 @@
.\" $OpenBSD: nc.1,v 1.45 2007/05/31 19:20:13 jmc Exp $ .\" $OpenBSD: nc.1,v 1.47 2008/05/06 16:21:03 jmc Exp $
.\" .\"
.\" Copyright (c) 1996 David Sacerdote .\" Copyright (c) 1996 David Sacerdote
.\" All rights reserved. .\" All rights reserved.
@ -27,7 +27,7 @@
.\" .\"
.\" $FreeBSD$ .\" $FreeBSD$
.\" .\"
.Dd $Mdocdate$ .Dd $Mdocdate: May 6 2008 $
.Dt NC 1 .Dt NC 1
.Os .Os
.Sh NAME .Sh NAME
@ -36,9 +36,12 @@
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm nc .Nm nc
.Bk -words .Bk -words
.Op Fl 46DdEhklnOorStUuvz .Op Fl 46DdEhklnorStUuvz
.Op Fl e Ar IPsec_policy .Op Fl e Ar IPsec_policy
.Op Fl I Ar length
.Op Fl i Ar interval .Op Fl i Ar interval
.Op Fl -no-tcpopt
.Op Fl O Ar length
.Op Fl P Ar proxy_username .Op Fl P Ar proxy_username
.Op Fl p Ar source_port .Op Fl p Ar source_port
.Op Fl s Ar source_ip_address .Op Fl s Ar source_ip_address
@ -118,6 +121,8 @@ each direction is needed.
Prints out Prints out
.Nm .Nm
help. help.
.It Fl I Ar length
Specifies the size of the TCP receive buffer.
.It Fl i Ar interval .It Fl i Ar interval
Specifies a delay time interval between lines of text sent and received. Specifies a delay time interval between lines of text sent and received.
Also causes a delay time between connections to multiple ports. Also causes a delay time between connections to multiple ports.
@ -146,10 +151,13 @@ option are ignored.
.It Fl n .It Fl n
Do not do any DNS or service lookups on any specified addresses, Do not do any DNS or service lookups on any specified addresses,
hostnames or ports. hostnames or ports.
.It Fl O .It Fl -no-tcpopt
Disables the use of TCP options on the socket, by setting the boolean Disables the use of TCP options on the socket, by setting the boolean
TCP_NOOPT TCP_NOOPT
socket option. socket option.
.It Fl O Ar length
Specifies the size of the TCP send buffer.
When
.It Fl o .It Fl o
.Dq Once-only mode . .Dq Once-only mode .
By default, By default,

View File

@ -1,4 +1,4 @@
/* $OpenBSD: netcat.c,v 1.89 2007/02/20 14:11:17 jmc Exp $ */ /* $OpenBSD: netcat.c,v 1.91 2008/05/09 09:00:11 markus Exp $ */
/* /*
* Copyright (c) 2001 Eric Jackson <ericj@monkey.org> * Copyright (c) 2001 Eric Jackson <ericj@monkey.org>
* *
@ -50,6 +50,7 @@
#include <err.h> #include <err.h>
#include <errno.h> #include <errno.h>
#include <getopt.h>
#include <netdb.h> #include <netdb.h>
#include <poll.h> #include <poll.h>
#include <stdarg.h> #include <stdarg.h>
@ -78,7 +79,7 @@ int kflag; /* More than one connect */
int lflag; /* Bind to local port */ int lflag; /* Bind to local port */
int nflag; /* Don't do name look up */ int nflag; /* Don't do name look up */
int oflag; /* Once only: stop on EOF */ int oflag; /* Once only: stop on EOF */
int Oflag; /* Do not use TCP options */ int FreeBSD_Oflag; /* Do not use TCP options */
char *Pflag; /* Proxy username */ char *Pflag; /* Proxy username */
char *pflag; /* Localport flag */ char *pflag; /* Localport flag */
int rflag; /* Random ports flag */ int rflag; /* Random ports flag */
@ -89,6 +90,8 @@ int vflag; /* Verbosity */
int xflag; /* Socks proxy */ int xflag; /* Socks proxy */
int zflag; /* Port Scan Flag */ int zflag; /* Port Scan Flag */
int Dflag; /* sodebug */ int Dflag; /* sodebug */
int Iflag; /* TCP receive buffer size */
int Oflag; /* TCP send buffer size */
int Sflag; /* TCP MD5 signature option */ int Sflag; /* TCP MD5 signature option */
int Tflag = -1; /* IP Type of Service */ int Tflag = -1; /* IP Type of Service */
@ -129,6 +132,10 @@ main(int argc, char *argv[])
char *proxy; char *proxy;
const char *errstr, *proxyhost = "", *proxyport = NULL; const char *errstr, *proxyhost = "", *proxyport = NULL;
struct addrinfo proxyhints; struct addrinfo proxyhints;
struct option longopts[] = {
{ "no-tcpopt", no_argument, &FreeBSD_Oflag, 1 },
{ NULL, 0, NULL, 0 }
};
ret = 1; ret = 1;
ipsec_count = 0; ipsec_count = 0;
@ -138,8 +145,9 @@ main(int argc, char *argv[])
uport = NULL; uport = NULL;
sv = NULL; sv = NULL;
while ((ch = getopt(argc, argv, while ((ch = getopt_long(argc, argv,
"46e:DEdhi:jklnoOP:p:rSs:tT:Uuvw:X:x:z")) != -1) { "46e:DEdhi:jklnoI:O:P:p:rSs:tT:Uuvw:X:x:z",
longopts, NULL)) != -1) {
switch (ch) { switch (ch) {
case '4': case '4':
family = AF_INET; family = AF_INET;
@ -203,9 +211,6 @@ main(int argc, char *argv[])
case 'o': case 'o':
oflag = 1; oflag = 1;
break; break;
case 'O':
Oflag = 1;
break;
case 'P': case 'P':
Pflag = optarg; Pflag = optarg;
break; break;
@ -244,12 +249,28 @@ main(int argc, char *argv[])
case 'D': case 'D':
Dflag = 1; Dflag = 1;
break; break;
case 'I':
Iflag = strtonum(optarg, 1, 65536 << 14, &errstr);
if (errstr != NULL)
errx(1, "TCP receive window %s: %s",
errstr, optarg);
break;
case 'O':
Oflag = strtonum(optarg, 1, 65536 << 14, &errstr);
if (errstr != NULL) {
if (strcmp(errstr, "invalid") != 0)
errx(1, "TCP send window %s: %s",
errstr, optarg);
}
break;
case 'S': case 'S':
Sflag = 1; Sflag = 1;
break; break;
case 'T': case 'T':
Tflag = parse_iptos(optarg); Tflag = parse_iptos(optarg);
break; break;
case 0:
break;
default: default:
usage(1); usage(1);
} }
@ -512,7 +533,7 @@ int
remote_connect(const char *host, const char *port, struct addrinfo hints) remote_connect(const char *host, const char *port, struct addrinfo hints)
{ {
struct addrinfo *res, *res0; struct addrinfo *res, *res0;
int s, error; int s, error, on = 1;
if ((error = getaddrinfo(host, port, &hints, &res))) if ((error = getaddrinfo(host, port, &hints, &res)))
errx(1, "getaddrinfo: %s", gai_strerror(error)); errx(1, "getaddrinfo: %s", gai_strerror(error));
@ -533,6 +554,10 @@ remote_connect(const char *host, const char *port, struct addrinfo hints)
if (sflag || pflag) { if (sflag || pflag) {
struct addrinfo ahints, *ares; 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)); memset(&ahints, 0, sizeof(struct addrinfo));
ahints.ai_family = res0->ai_family; ahints.ai_family = res0->ai_family;
ahints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM; ahints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
@ -604,9 +629,9 @@ local_listen(char *host, char *port, struct addrinfo hints)
if (ipsec_policy[1] != NULL) if (ipsec_policy[1] != NULL)
add_ipsec_policy(s, ipsec_policy[1]); add_ipsec_policy(s, ipsec_policy[1]);
#endif #endif
if (Oflag) { if (FreeBSD_Oflag) {
if (setsockopt(s, IPPROTO_TCP, TCP_NOOPT, if (setsockopt(s, IPPROTO_TCP, TCP_NOOPT,
&Oflag, sizeof(Oflag)) == -1) &FreeBSD_Oflag, sizeof(FreeBSD_Oflag)) == -1)
err(1, "disable TCP options"); err(1, "disable TCP options");
} }
@ -838,9 +863,19 @@ set_common_sockopts(int s)
&Tflag, sizeof(Tflag)) == -1) &Tflag, sizeof(Tflag)) == -1)
err(1, "set IP ToS"); err(1, "set IP ToS");
} }
if (Iflag) {
if (setsockopt(s, SOL_SOCKET, SO_RCVBUF,
&Iflag, sizeof(Iflag)) == -1)
err(1, "set TCP receive buffer size");
}
if (Oflag) { if (Oflag) {
if (setsockopt(s, IPPROTO_TCP, TCP_NOOPT, if (setsockopt(s, SOL_SOCKET, SO_SNDBUF,
&Oflag, sizeof(Oflag)) == -1) &Oflag, sizeof(Oflag)) == -1)
err(1, "set TCP send buffer size");
}
if (FreeBSD_Oflag) {
if (setsockopt(s, IPPROTO_TCP, TCP_NOOPT,
&FreeBSD_Oflag, sizeof(FreeBSD_Oflag)) == -1)
err(1, "disable TCP options"); err(1, "disable TCP options");
} }
} }
@ -878,11 +913,13 @@ help(void)
#endif #endif
fprintf(stderr, "\ fprintf(stderr, "\
\t-h This help text\n\ \t-h This help text\n\
\t-I length TCP receive buffer length\n\
\t-i secs\t Delay interval for lines sent, ports scanned\n\ \t-i secs\t Delay interval for lines sent, ports scanned\n\
\t-k Keep inbound sockets open for multiple connects\n\ \t-k Keep inbound sockets open for multiple connects\n\
\t-l Listen mode, for inbound connects\n\ \t-l Listen mode, for inbound connects\n\
\t-n Suppress name/port resolutions\n\ \t-n Suppress name/port resolutions\n\
\t-O Disable TCP options\n\ \t--no-tcpopt Disable TCP options\n\
\t-O length TCP send buffer length\n\
\t-o Terminate on EOF on input\n\ \t-o Terminate on EOF on input\n\
\t-P proxyuser\tUsername for proxy authentication\n\ \t-P proxyuser\tUsername for proxy authentication\n\
\t-p port\t Specify local port for remote connects\n\ \t-p port\t Specify local port for remote connects\n\
@ -931,10 +968,11 @@ void
usage(int ret) usage(int ret)
{ {
#ifdef IPSEC #ifdef IPSEC
fprintf(stderr, "usage: nc [-46DdEhklnOorStUuvz] [-e policy] [-i interval] [-P proxy_username] [-p source_port]\n"); fprintf(stderr, "usage: nc [-46DdEhklnorStUuvz] [-e policy] [-I receive_buffer_len] [-i interval]\n");
#else #else
fprintf(stderr, "usage: nc [-46DdhklnOorStUuvz] [-i interval] [-P proxy_username] [-p source_port]\n"); fprintf(stderr, "usage: nc [-46DdhklnorStUuvz] [-I receive_buffer_len] [-i interval]\n");
#endif #endif
fprintf(stderr, "\t [-O send_buffer_len] [-P proxy_username] [-p source_port]\n");
fprintf(stderr, "\t [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]\n"); fprintf(stderr, "\t [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]\n");
fprintf(stderr, "\t [-x proxy_address[:port]] [hostname] [port[s]]\n"); fprintf(stderr, "\t [-x proxy_address[:port]] [hostname] [port[s]]\n");
if (ret) if (ret)