Index: netcat.c =================================================================== --- netcat.c (revision 253450) +++ netcat.c (working copy) @@ -73,6 +73,7 @@ #define UNIX_DG_TMP_SOCKET_SIZE 19 /* Command Line Options */ +int Cflag; /* SCTP - Default to TCP */ int dflag; /* detached, no stdin */ unsigned int iflag; /* Interval Flag */ int kflag; /* More than one connect */ @@ -154,7 +155,7 @@ sv = NULL; while ((ch = getopt_long(argc, argv, - "46DdEe:hI:i:klNnoO:P:p:rSs:tT:UuV:vw:X:x:z", + "46CDdEe:hI:i:klNnoO:P:p:rSs:tT:UuV:vw:X:x:z", longopts, NULL)) != -1) { switch (ch) { case '4': @@ -176,6 +177,9 @@ else errx(1, "unsupported proxy protocol"); break; + case 'C': + Cflag = 1; + break; case 'd': dflag = 1; break; @@ -316,6 +320,8 @@ } else usage(1); + if (Cflag && uflag) + errx(1, "cannot use -C and -u"); if (lflag && sflag) errx(1, "cannot use -s and -l"); if (lflag && pflag) @@ -342,8 +348,13 @@ 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; + hints.ai_socktype = (Cflag || !uflag) ? SOCK_STREAM : SOCK_DGRAM; + if(uflag) + hints.ai_protocol = IPPROTO_UDP; + else if(Cflag) + hints.ai_protocol = IPPROTO_SCTP; + else + hints.ai_protocol = IPPROTO_TCP; if (nflag) hints.ai_flags |= AI_NUMERICHOST; } @@ -412,7 +423,7 @@ len = sizeof(z); plen = 2048; rv = recvfrom(s, buf, plen, MSG_PEEK, - (struct sockaddr *)&z, &len); + (struct sockaddr *)&z, &len); if (rv < 0) err(1, "recvfrom"); @@ -427,10 +438,10 @@ } else { len = sizeof(cliaddr); connfd = accept(s, (struct sockaddr *)&cliaddr, - &len); + &len); if (connfd == -1) { /* For now, all errnos are fatal */ - err(1, "accept"); + err(1, "accept"); } if (vflag) report_connect((struct sockaddr *)&cliaddr, len); @@ -646,8 +657,13 @@ setsockopt(s, IPPROTO_IP, IP_BINDANY, &on, sizeof(on)); 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; + ahints.ai_socktype = (Cflag || !uflag) ? SOCK_STREAM : SOCK_DGRAM; + if(uflag) + ahints.ai_protocol = IPPROTO_UDP; + else if(Cflag) + ahints.ai_protocol = IPPROTO_SCTP; + else + ahints.ai_protocol = IPPROTO_TCP; ahints.ai_flags = AI_PASSIVE; if ((error = getaddrinfo(sflag, pflag, &ahints, &ares))) errx(1, "getaddrinfo: %s", gai_strerror(error)); @@ -1080,6 +1096,7 @@ fprintf(stderr, "\tCommand Summary:\n\ \t-4 Use IPv4\n\ \t-6 Use IPv6\n\ + \t-C SCTP mode\n\ \t-D Enable the debug socket option\n\ \t-d Detach from stdin\n"); #ifdef IPSEC @@ -1146,9 +1163,9 @@ { fprintf(stderr, #ifdef IPSEC - "usage: nc [-46DdEhklNnrStUuvz] [-e policy] [-I length] [-i interval] [-O length]\n" + "usage: nc [-46CDdEhklNnrStUuvz] [-e policy] [-I length] [-i interval] [-O length]\n" #else - "usage: nc [-46DdhklNnrStUuvz] [-I length] [-i interval] [-O length]\n" + "usage: nc [-46CDdhklNnrStUuvz] [-I length] [-i interval] [-O length]\n" #endif "\t [-P proxy_username] [-p source_port] [-s source] [-T ToS]\n" "\t [-V rtable] [-w timeout] [-X proxy_protocol]\n"