summaryrefslogtreecommitdiff
path: root/network/netcat-openbsd/patches/0009-dccp-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'network/netcat-openbsd/patches/0009-dccp-support.patch')
-rw-r--r--network/netcat-openbsd/patches/0009-dccp-support.patch304
1 files changed, 304 insertions, 0 deletions
diff --git a/network/netcat-openbsd/patches/0009-dccp-support.patch b/network/netcat-openbsd/patches/0009-dccp-support.patch
new file mode 100644
index 0000000000..3a81b4b5ce
--- /dev/null
+++ b/network/netcat-openbsd/patches/0009-dccp-support.patch
@@ -0,0 +1,304 @@
+From: Aron Xu <aron@debian.org>
+Date: Mon, 13 Feb 2012 15:56:51 +0800
+Subject: dccp support
+
+---
+ nc.1 | 4 ++-
+ netcat.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++------------
+ 2 files changed, 93 insertions(+), 22 deletions(-)
+
+diff --git a/nc.1 b/nc.1
+index 0d92b74..60e3668 100644
+--- a/nc.1
++++ b/nc.1
+@@ -34,7 +34,7 @@
+ .Sh SYNOPSIS
+ .Nm nc
+ .Bk -words
+-.Op Fl 46CDdhklnrStUuvz
++.Op Fl 46CDdhklnrStUuvZz
+ .Op Fl I Ar length
+ .Op Fl i Ar interval
+ .Op Fl O Ar length
+@@ -257,6 +257,8 @@ If
+ .Ar port
+ is not specified, the well-known port for the proxy protocol is used (1080
+ for SOCKS, 3128 for HTTPS).
++.It Fl Z
++DCCP mode.
+ .It Fl z
+ Specifies that
+ .Nm
+diff --git a/netcat.c b/netcat.c
+index eb3453e..56cc15e 100644
+--- a/netcat.c
++++ b/netcat.c
+@@ -129,6 +129,7 @@ int rflag; /* Random ports flag */
+ char *sflag; /* Source Address */
+ int tflag; /* Telnet Emulation */
+ int uflag; /* UDP - Default to TCP */
++int dccpflag; /* DCCP - Default to TCP */
+ int vflag; /* Verbosity */
+ int xflag; /* Socks proxy */
+ int zflag; /* Port Scan Flag */
+@@ -160,6 +161,7 @@ int unix_listen(char *);
+ void set_common_sockopts(int);
+ int map_tos(char *, int *);
+ void usage(int);
++char *proto_name(int uflag, int dccpflag);
+
+ static int connect_with_timeout(int fd, const struct sockaddr *sa,
+ socklen_t salen, int ctimeout);
+@@ -187,7 +189,7 @@ main(int argc, char *argv[])
+ sv = NULL;
+
+ while ((ch = getopt(argc, argv,
+- "46CDdhI:i:jklnO:P:p:q:rSs:tT:UuV:vw:X:x:z")) != -1) {
++ "46CDdhI:i:jklnO:P:p:q:rSs:tT:UuV:vw:X:x:Zz")) != -1) {
+ switch (ch) {
+ case '4':
+ family = AF_INET;
+@@ -258,6 +260,13 @@ main(int argc, char *argv[])
+ case 'u':
+ uflag = 1;
+ break;
++ case 'Z':
++# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
++ dccpflag = 1;
++# else
++ errx(1, "no DCCP support available");
++# endif
++ break;
+ case 'V':
+ # if defined(RT_TABLEID_MAX)
+ rtableid = (unsigned int)strtonum(optarg, 0,
+@@ -333,6 +342,12 @@ main(int argc, char *argv[])
+
+ /* Cruft to make sure options are clean, and used properly. */
+ if (argv[0] && !argv[1] && family == AF_UNIX) {
++ if (uflag)
++ errx(1, "cannot use -u and -U");
++# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
++ if (dccpflag)
++ errx(1, "cannot use -Z and -U");
++# endif
+ host = argv[0];
+ uport = NULL;
+ } else if (!argv[0] && lflag) {
+@@ -374,8 +389,20 @@ main(int argc, char *argv[])
+ if (family != AF_UNIX) {
+ memset(&hints, 0, sizeof(struct addrinfo));
+ hints.ai_family = family;
+- hints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
+- hints.ai_protocol = uflag ? IPPROTO_UDP : IPPROTO_TCP;
++ if (uflag) {
++ hints.ai_socktype = SOCK_DGRAM;
++ hints.ai_protocol = IPPROTO_UDP;
++ }
++# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
++ else if (dccpflag) {
++ hints.ai_socktype = SOCK_DCCP;
++ hints.ai_protocol = IPPROTO_DCCP;
++ }
++# endif
++ else {
++ hints.ai_socktype = SOCK_STREAM;
++ hints.ai_protocol = IPPROTO_TCP;
++ }
+ if (nflag)
+ hints.ai_flags |= AI_NUMERICHOST;
+ }
+@@ -383,7 +410,10 @@ main(int argc, char *argv[])
+ if (xflag) {
+ if (uflag)
+ errx(1, "no proxy support for UDP mode");
+-
++# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
++ if (dccpflag)
++ errx(1, "no proxy support for DCCP mode");
++# endif
+ if (lflag)
+ errx(1, "no proxy support for listen");
+
+@@ -427,12 +457,12 @@ main(int argc, char *argv[])
+ err(1, NULL);
+
+ char* local;
+- if (family == AF_INET6
++ if (family == AF_INET6 )
+ local = "0.0.0.0";
+ else if (family == AF_INET)
+ local = ":::";
+ else
+- local = "unknown"
++ local = "unknown";
+ fprintf(stderr, "Listening on [%s] (family %d, port %d)\n",
+ host ?: local,
+ family,
+@@ -463,12 +493,13 @@ main(int argc, char *argv[])
+ connfd = accept(s, (struct sockaddr *)&cliaddr,
+ &len);
+ if(vflag) {
++ char *proto = proto_name(uflag, dccpflag);
+ /* Don't look up port if -n. */
+ if (nflag)
+ sv = NULL;
+ else
+ sv = getservbyport(ntohs(atoi(uport)),
+- uflag ? "udp" : "tcp");
++ proto);
+
+ if (((struct sockaddr *)&cliaddr)->sa_family == AF_INET) {
+ char dst[INET_ADDRSTRLEN];
+@@ -476,7 +507,7 @@ main(int argc, char *argv[])
+ fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n",
+ dst,
+ uport,
+- uflag ? "udp" : "tcp",
++ proto,
+ sv ? sv->s_name : "*",
+ ((struct sockaddr *)(&cliaddr))->sa_family,
+ ntohs(((struct sockaddr_in *)&cliaddr)->sin_port));
+@@ -487,7 +518,7 @@ main(int argc, char *argv[])
+ fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n",
+ dst,
+ uport,
+- uflag ? "udp" : "tcp",
++ proto,
+ sv ? sv->s_name : "*",
+ ((struct sockaddr *)&cliaddr)->sa_family,
+ ntohs(((struct sockaddr_in6 *)&cliaddr)->sin6_port));
+@@ -495,7 +526,7 @@ main(int argc, char *argv[])
+ else {
+ fprintf(stderr, "Connection from unknown port %s [%s/%s] accepted (family %d, sport %d)\n",
+ uport,
+- uflag ? "udp" : "tcp",
++ proto,
+ sv ? sv->s_name : "*",
+ ((struct sockaddr *)(&cliaddr))->sa_family,
+ ntohs(((struct sockaddr_in *)&cliaddr)->sin_port));
+@@ -559,19 +590,20 @@ main(int argc, char *argv[])
+ }
+ }
+
++ char *proto = proto_name(uflag, dccpflag);
+ /* Don't look up port if -n. */
+ if (nflag)
+ sv = NULL;
+ else {
+ sv = getservbyport(
+ ntohs(atoi(portlist[i])),
+- uflag ? "udp" : "tcp");
++ proto);
+ }
+
+ fprintf(stderr,
+ "Connection to %s %s port [%s/%s] "
+ "succeeded!\n", host, portlist[i],
+- uflag ? "udp" : "tcp",
++ proto,
+ sv ? sv->s_name : "*");
+ }
+ if (!zflag)
+@@ -671,6 +703,24 @@ unix_listen(char *path)
+ return (s);
+ }
+
++char *proto_name(uflag, dccpflag) {
++
++ char *proto = NULL;
++ if (uflag) {
++ proto = "udp";
++ }
++# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
++ else if (dccpflag) {
++ proto = "dccp";
++ }
++# endif
++ else {
++ proto = "tcp";
++ }
++
++ return proto;
++}
++
+ /*
+ * remote_connect()
+ * Returns a socket connected to a remote host. Properly binds to a local
+@@ -709,8 +759,21 @@ remote_connect(const char *host, const char *port, struct addrinfo hints)
+ # endif
+ memset(&ahints, 0, sizeof(struct addrinfo));
+ ahints.ai_family = res0->ai_family;
+- ahints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
+- ahints.ai_protocol = uflag ? IPPROTO_UDP : IPPROTO_TCP;
++ if (uflag) {
++ ahints.ai_socktype = SOCK_DGRAM;
++ ahints.ai_protocol = IPPROTO_UDP;
++
++ }
++# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
++ else if (dccpflag) {
++ hints.ai_socktype = SOCK_DCCP;
++ hints.ai_protocol = IPPROTO_DCCP;
++ }
++# endif
++ else {
++ ahints.ai_socktype = SOCK_STREAM;
++ ahints.ai_protocol = IPPROTO_TCP;
++ }
+ ahints.ai_flags = AI_PASSIVE;
+ if ((error = getaddrinfo(sflag, pflag, &ahints, &ares)))
+ errx(1, "getaddrinfo: %s", gai_strerror(error));
+@@ -722,15 +785,19 @@ remote_connect(const char *host, const char *port, struct addrinfo hints)
+ }
+
+ set_common_sockopts(s);
++ char *proto = proto_name(uflag, dccpflag);
+
+- if ((error = connect_with_timeout(s, res0->ai_addr, res0->ai_addrlen, timeout))== CONNECTION_SUCCESS)
++ if ((error = connect_with_timeout(s, res0->ai_addr, res0->ai_addrlen, timeout))== CONNECTION_SUCCESS) {
+ break;
+- else if (vflag && error == CONNECTION_FAILED)
++ }
++ else if (vflag && error == CONNECTION_FAILED) {
+ warn("connect to %s port %s (%s) failed", host, port,
+- uflag ? "udp" : "tcp");
+- else if (vflag && error == CONNECTION_TIMEOUT)
++ proto);
++ }
++ else if (vflag && error == CONNECTION_TIMEOUT) {
+ warn("connect to %s port %s (%s) timed out", host, port,
+- uflag ? "udp" : "tcp");
++ proto);
++ }
+
+ close(s);
+ s = -1;
+@@ -1047,7 +1114,8 @@ build_ports(char *p)
+ int hi, lo, cp;
+ int x = 0;
+
+- sv = getservbyname(p, uflag ? "udp" : "tcp");
++ char *proto = proto_name(uflag, dccpflag);
++ sv = getservbyname(p, proto);
+ if (sv) {
+ portlist[0] = calloc(1, PORT_MAX_LEN);
+ if (portlist[0] == NULL)
+@@ -1252,6 +1320,7 @@ help(void)
+ \t-w secs\t Timeout for connects and final net reads\n\
+ \t-X proto Proxy protocol: \"4\", \"5\" (SOCKS) or \"connect\"\n\
+ \t-x addr[:port]\tSpecify proxy address and port\n\
++ \t-Z DCCP mode\n\
+ \t-z Zero-I/O mode [used for scanning]\n\
+ Port numbers can be individual or ranges: lo-hi [inclusive]\n");
+ exit(0);
+@@ -1261,7 +1330,7 @@ void
+ usage(int ret)
+ {
+ fprintf(stderr,
+- "usage: nc [-46CDdhjklnrStUuvz] [-I length] [-i interval] [-O length]\n"
++ "usage: nc [-46CDdhjklnrStUuvZz] [-I length] [-i interval] [-O length]\n"
+ "\t [-P proxy_username] [-p source_port] [-q seconds] [-s source]\n"
+ "\t [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]\n"
+ "\t [-x proxy_address[:port]] [destination] [port]\n");
+--