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\