netcat-openbsd/dccp.patch

192 lines
5.0 KiB
Diff

Index: netcat-openbsd-oneiric/netcat.c
===================================================================
--- netcat-openbsd-oneiric.orig/netcat.c 2011-06-10 22:29:16.371916860 +0300
+++ netcat-openbsd-oneiric/netcat.c 2011-06-10 22:29:16.371916860 +0300
@@ -88,6 +88,7 @@
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 */
@@ -113,6 +114,7 @@
void set_common_sockopts(int);
int parse_iptos(char *);
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);
@@ -140,7 +142,7 @@
sv = NULL;
while ((ch = getopt(argc, argv,
- "46Ddhi:jklnP:p:q:rSs:tT:Uuvw:X:x:zC")) != -1) {
+ "46Ddhi:jklnP:p:q:rSs:tT:UuZvw:X:x:zC")) != -1) {
switch (ch) {
case '4':
family = AF_INET;
@@ -205,6 +207,9 @@
case 'u':
uflag = 1;
break;
+ case 'Z':
+ dccpflag = 1;
+ break;
case 'v':
vflag = 1;
break;
@@ -247,6 +252,9 @@
if (argv[0] && !argv[1] && family == AF_UNIX) {
if (uflag)
errx(1, "cannot use -u and -U");
+ if (dccpflag)
+ errx(1, "cannot use -C and -U");
+
host = argv[0];
uport = NULL;
} else if (argv[0] && !argv[1]) {
@@ -273,8 +281,18 @@
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;
+ }
+ else if (dccpflag) {
+ hints.ai_socktype = SOCK_DCCP;
+ hints.ai_protocol = IPPROTO_DCCP;
+ }
+ else {
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = IPPROTO_TCP;
+ }
if (nflag)
hints.ai_flags |= AI_NUMERICHOST;
}
@@ -283,6 +301,9 @@
if (uflag)
errx(1, "no proxy support for UDP mode");
+ if (dccpflag)
+ errx(1, "no proxy support for DCCP mode");
+
if (lflag)
errx(1, "no proxy support for listen");
@@ -348,17 +369,19 @@
}
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);
fprintf(stderr, "Connection from %s port %s [%s/%s] accepted\n",
inet_ntoa(((struct sockaddr_in *)(&cliaddr))->sin_addr),
uport,
- uflag ? "udp" : "tcp",
+ proto,
sv ? sv->s_name : "*");
}
@@ -503,6 +526,22 @@
return (s);
}
+char *proto_name(uflag, dccpflag) {
+
+ char *proto = NULL;
+ if (uflag) {
+ proto = "udp";
+ }
+ else if (dccpflag) {
+ proto = "dccp";
+ }
+ else {
+ proto = "tcp";
+ }
+
+ return proto;
+}
+
/*
* remote_connect()
* Returns a socket connected to a remote host. Properly binds to a local
@@ -529,8 +568,19 @@
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;
+
+ }
+ else if (dccpflag) {
+ ahints.ai_socktype = SOCK_DCCP;
+ ahints.ai_protocol = IPPROTO_DCCP;
+ }
+ 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));
@@ -542,14 +592,19 @@
}
set_common_sockopts(s);
- if ((error = connect_with_timeout(s, res0->ai_addr, res0->ai_addrlen, timeout)) == CONNECTION_SUCCESS)
+ char *proto = proto_name(uflag, dccpflag);
+
+ 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;
@@ -817,8 +872,8 @@
char *n, *endp;
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)
@@ -979,6 +1034,7 @@
\t-t Answer TELNET negotiation\n\
\t-U Use UNIX domain socket\n\
\t-u UDP mode\n\
+ \t-Z DCCP mode\n\
\t-v Verbose\n\
\t-w secs\t Timeout for connects and final net reads\n\
\t-X proto Proxy protocol: \"4\", \"5\" (SOCKS) or \"connect\"\n\