summaryrefslogtreecommitdiffstats
path: root/contrib/netcat
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2012-05-04 21:03:39 +0000
committerdelphij <delphij@FreeBSD.org>2012-05-04 21:03:39 +0000
commitb8e45134f9e9c0baa80fa72b3c707aeecd581759 (patch)
treee3ed973a64d21893f60bdb3ce520f842f3fe2d51 /contrib/netcat
parenta1a76868b815ea815676078dc2df67406b36831c (diff)
downloadFreeBSD-src-b8e45134f9e9c0baa80fa72b3c707aeecd581759.zip
FreeBSD-src-b8e45134f9e9c0baa80fa72b3c707aeecd581759.tar.gz
Merge from OpenBSD 5.1.
MFC after: 3 weeks
Diffstat (limited to 'contrib/netcat')
-rw-r--r--contrib/netcat/nc.148
-rw-r--r--contrib/netcat/netcat.c124
2 files changed, 131 insertions, 41 deletions
diff --git a/contrib/netcat/nc.1 b/contrib/netcat/nc.1
index 7fe212a..eb8cd9f 100644
--- a/contrib/netcat/nc.1
+++ b/contrib/netcat/nc.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: nc.1,v 1.57 2011/01/09 22:16:46 jeremy Exp $
+.\" $OpenBSD: nc.1,v 1.60 2012/02/07 12:11:43 lum Exp $
.\"
.\" Copyright (c) 1996 David Sacerdote
.\" All rights reserved.
@@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 8, 2011
+.Dd October 4, 2011
.Dt NC 1
.Os
.Sh NAME
@@ -45,7 +45,7 @@
.Op Fl P Ar proxy_username
.Op Fl p Ar source_port
.Op Fl s Ar source
-.Op Fl T Ar ToS
+.Op Fl T Ar toskeyword
.Op Fl V Ar rtable
.Op Fl w Ar timeout
.Op Fl X Ar proxy_protocol
@@ -186,14 +186,21 @@ to create and use so that datagrams can be received.
It is an error to use this option in conjunction with the
.Fl l
option.
-.It Fl T Ar ToS
-Specifies IP Type of Service (ToS) for the connection.
-Valid values are the tokens
-.Dq lowdelay ,
-.Dq throughput ,
-.Dq reliability ,
-or an 8-bit hexadecimal value preceded by
-.Dq 0x .
+.It Fl T Ar toskeyword
+Change IPv4 TOS value.
+.Ar toskeyword
+may be one of
+.Ar critical ,
+.Ar inetcontrol ,
+.Ar lowdelay ,
+.Ar netcontrol ,
+.Ar throughput ,
+.Ar reliability ,
+or one of the DiffServ Code Points:
+.Ar ef ,
+.Ar af11 ... af43 ,
+.Ar cs0 ... cs7 ;
+or a number in either hex or decimal.
.It Fl t
Causes
.Nm
@@ -227,9 +234,9 @@ Have
.Nm
give more verbose output.
.It Fl w Ar timeout
-If a connection and stdin are idle for more than
+Connections which cannot be established or are idle timeout after
.Ar timeout
-seconds, then the connection is silently closed.
+seconds.
The
.Fl w
flag has no effect on the
@@ -480,8 +487,15 @@ Original implementation by *Hobbit*
Rewritten with IPv6 support by
.An Eric Jackson Aq ericj@monkey.org .
.Sh CAVEATS
-UDP port scans will always succeed
-(i.e. report the port as open),
-rendering the
+UDP port scans using the
.Fl uz
-combination of flags relatively useless.
+combination of flags will always report success irrespective of
+the target machine's state.
+However,
+in conjunction with a traffic sniffer either on the target machine
+or an intermediary device,
+the
+.Fl uz
+combination could be useful for communications diagnostics.
+Note that the amount of UDP traffic generated may be limited either
+due to hardware resources and/or configuration settings.
diff --git a/contrib/netcat/netcat.c b/contrib/netcat/netcat.c
index bee0fa6..d6d507c 100644
--- a/contrib/netcat/netcat.c
+++ b/contrib/netcat/netcat.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: netcat.c,v 1.101 2011/06/21 17:31:07 mikeb Exp $ */
+/* $OpenBSD: netcat.c,v 1.105 2012/02/09 06:25:35 lum Exp $ */
/*
* Copyright (c) 2001 Eric Jackson <ericj@monkey.org>
*
@@ -107,6 +107,7 @@ void help(void);
int local_listen(char *, char *, struct addrinfo);
void readwrite(int);
int remote_connect(const char *, const char *, struct addrinfo);
+int timeout_connect(int, const struct sockaddr *, socklen_t);
int socks_connect(const char *, const char *, struct addrinfo,
const char *, const char *, struct addrinfo, int, const char *);
int udptest(int);
@@ -114,7 +115,7 @@ int unix_bind(char *);
int unix_connect(char *);
int unix_listen(char *);
void set_common_sockopts(int);
-int parse_iptos(char *);
+int map_tos(char *, int *);
void usage(int);
#ifdef IPSEC
@@ -281,7 +282,18 @@ main(int argc, char *argv[])
Sflag = 1;
break;
case 'T':
- Tflag = parse_iptos(optarg);
+ errstr = NULL;
+ errno = 0;
+ if (map_tos(optarg, &Tflag))
+ break;
+ if (strlen(optarg) > 1 && optarg[0] == '0' &&
+ optarg[1] == 'x')
+ Tflag = (int)strtol(optarg, NULL, 16);
+ else
+ Tflag = (int)strtonum(optarg, 0, 255,
+ &errstr);
+ if (Tflag < 0 || Tflag > 255 || errstr || errno)
+ errx(1, "illegal tos value %s", optarg);
break;
default:
usage(1);
@@ -633,7 +645,7 @@ remote_connect(const char *host, const char *port, struct addrinfo hints)
set_common_sockopts(s);
- if (connect(s, res0->ai_addr, res0->ai_addrlen) == 0)
+ if (timeout_connect(s, res0->ai_addr, res0->ai_addrlen) == 0)
break;
else if (vflag)
warn("connect to %s port %s (%s) failed", host, port,
@@ -648,6 +660,43 @@ remote_connect(const char *host, const char *port, struct addrinfo hints)
return (s);
}
+int
+timeout_connect(int s, const struct sockaddr *name, socklen_t namelen)
+{
+ struct pollfd pfd;
+ socklen_t optlen;
+ int flags, optval;
+ int ret;
+
+ if (timeout != -1) {
+ flags = fcntl(s, F_GETFL, 0);
+ if (fcntl(s, F_SETFL, flags | O_NONBLOCK) == -1)
+ err(1, "set non-blocking mode");
+ }
+
+ if ((ret = connect(s, name, namelen)) != 0 && errno == EINPROGRESS) {
+ pfd.fd = s;
+ pfd.events = POLLOUT;
+ if ((ret = poll(&pfd, 1, timeout)) == 1) {
+ optlen = sizeof(optval);
+ if ((ret = getsockopt(s, SOL_SOCKET, SO_ERROR,
+ &optval, &optlen)) == 0) {
+ errno = optval;
+ ret = optval == 0 ? 0 : -1;
+ }
+ } else if (ret == 0) {
+ errno = ETIMEDOUT;
+ ret = -1;
+ } else
+ err(1, "poll failed");
+ }
+
+ if (timeout != -1 && fcntl(s, F_SETFL, flags) == -1)
+ err(1, "restoring flags");
+
+ return (ret);
+}
+
/*
* local_listen()
* Returns a socket listening on a local port, binds to specified source
@@ -818,7 +867,7 @@ atelnet(int nfd, unsigned char *buf, unsigned int size)
/*
* build_ports()
- * Build an array or ports in portlist[], listing each port
+ * Build an array of ports in portlist[], listing each port
* that we should try to connect to.
*/
void
@@ -830,9 +879,6 @@ build_ports(char *p)
int x = 0;
if ((n = strchr(p, '-')) != NULL) {
- if (lflag)
- errx(1, "Cannot use -l with multiple ports!");
-
*n = '\0';
n++;
@@ -884,8 +930,7 @@ build_ports(char *p)
/*
* udptest()
* Do a few writes to see if the UDP port is there.
- * XXX - Better way of doing this? Doesn't work for IPv6.
- * Also fails after around 100 ports checked.
+ * Fails once PF state table is full.
*/
int
udptest(int s)
@@ -946,20 +991,51 @@ set_common_sockopts(int s)
}
int
-parse_iptos(char *s)
+map_tos(char *s, int *val)
{
- int tos = -1;
-
- if (strcmp(s, "lowdelay") == 0)
- return (IPTOS_LOWDELAY);
- if (strcmp(s, "throughput") == 0)
- return (IPTOS_THROUGHPUT);
- if (strcmp(s, "reliability") == 0)
- return (IPTOS_RELIABILITY);
-
- if (sscanf(s, "0x%x", &tos) != 1 || tos < 0 || tos > 0xff)
- errx(1, "invalid IP Type of Service");
- return (tos);
+ /* DiffServ Codepoints and other TOS mappings */
+ const struct toskeywords {
+ const char *keyword;
+ int val;
+ } *t, toskeywords[] = {
+ { "af11", IPTOS_DSCP_AF11 },
+ { "af12", IPTOS_DSCP_AF12 },
+ { "af13", IPTOS_DSCP_AF13 },
+ { "af21", IPTOS_DSCP_AF21 },
+ { "af22", IPTOS_DSCP_AF22 },
+ { "af23", IPTOS_DSCP_AF23 },
+ { "af31", IPTOS_DSCP_AF31 },
+ { "af32", IPTOS_DSCP_AF32 },
+ { "af33", IPTOS_DSCP_AF33 },
+ { "af41", IPTOS_DSCP_AF41 },
+ { "af42", IPTOS_DSCP_AF42 },
+ { "af43", IPTOS_DSCP_AF43 },
+ { "critical", IPTOS_PREC_CRITIC_ECP },
+ { "cs0", IPTOS_DSCP_CS0 },
+ { "cs1", IPTOS_DSCP_CS1 },
+ { "cs2", IPTOS_DSCP_CS2 },
+ { "cs3", IPTOS_DSCP_CS3 },
+ { "cs4", IPTOS_DSCP_CS4 },
+ { "cs5", IPTOS_DSCP_CS5 },
+ { "cs6", IPTOS_DSCP_CS6 },
+ { "cs7", IPTOS_DSCP_CS7 },
+ { "ef", IPTOS_DSCP_EF },
+ { "inetcontrol", IPTOS_PREC_INTERNETCONTROL },
+ { "lowdelay", IPTOS_LOWDELAY },
+ { "netcontrol", IPTOS_PREC_NETCONTROL },
+ { "reliability", IPTOS_RELIABILITY },
+ { "throughput", IPTOS_THROUGHPUT },
+ { NULL, -1 },
+ };
+
+ for (t = toskeywords; t->keyword != NULL; t++) {
+ if (strcmp(s, t->keyword) == 0) {
+ *val = t->val;
+ return (1);
+ }
+ }
+
+ return (0);
}
void
@@ -990,7 +1066,7 @@ help(void)
\t-r Randomize remote ports\n\
\t-S Enable the TCP MD5 signature option\n\
\t-s addr\t Local source address\n\
- \t-T ToS\t Set IP Type of Service\n\
+ \t-T toskeyword\tSet IP Type of Service\n\
\t-t Answer TELNET negotiation\n\
\t-U Use UNIX domain socket\n\
\t-u UDP mode\n\
OpenPOWER on IntegriCloud