source: npl/overig/netcat_openbsd/patches/0009-dccp-support.patch @ ffaaf60

Last change on this file since ffaaf60 was c5c522c, checked in by Edwin Eefting <edwin@datux.nl>, 8 years ago

initial commit, transferred from cleaned syn3 svn tree

  • Property mode set to 100644
File size: 9.0 KB
  • nc.1

    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 b  
    3434.Sh SYNOPSIS
    3535.Nm nc
    3636.Bk -words
    37 .Op Fl 46CDdhklnrStUuvz
     37.Op Fl 46CDdhklnrStUuvZz
    3838.Op Fl I Ar length
    3939.Op Fl i Ar interval
    4040.Op Fl O Ar length
    If 
    257257.Ar port
    258258is not specified, the well-known port for the proxy protocol is used (1080
    259259for SOCKS, 3128 for HTTPS).
     260.It Fl Z
     261DCCP mode.
    260262.It Fl z
    261263Specifies that
    262264.Nm
  • netcat.c

    diff --git a/netcat.c b/netcat.c
    index eb3453e..56cc15e 100644
    a b int rflag; /* Random ports flag */ 
    129129char   *sflag;                                  /* Source Address */
    130130int     tflag;                                  /* Telnet Emulation */
    131131int     uflag;                                  /* UDP - Default to TCP */
     132int     dccpflag;                               /* DCCP - Default to TCP */
    132133int     vflag;                                  /* Verbosity */
    133134int     xflag;                                  /* Socks proxy */
    134135int     zflag;                                  /* Port Scan Flag */
    int unix_listen(char *); 
    160161void    set_common_sockopts(int);
    161162int     map_tos(char *, int *);
    162163void    usage(int);
     164char    *proto_name(int uflag, int dccpflag);
    163165
    164166static int connect_with_timeout(int fd, const struct sockaddr *sa,
    165167        socklen_t salen, int ctimeout);
    main(int argc, char *argv[]) 
    187189        sv = NULL;
    188190
    189191        while ((ch = getopt(argc, argv,
    190             "46CDdhI:i:jklnO:P:p:q:rSs:tT:UuV:vw:X:x:z")) != -1) {
     192            "46CDdhI:i:jklnO:P:p:q:rSs:tT:UuV:vw:X:x:Zz")) != -1) {
    191193                switch (ch) {
    192194                case '4':
    193195                        family = AF_INET;
    main(int argc, char *argv[]) 
    258260                case 'u':
    259261                        uflag = 1;
    260262                        break;
     263                case 'Z':
     264# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
     265                        dccpflag = 1;
     266# else
     267                        errx(1, "no DCCP support available");
     268# endif
     269                        break;
    261270                case 'V':
    262271# if defined(RT_TABLEID_MAX)
    263272                        rtableid = (unsigned int)strtonum(optarg, 0,
    main(int argc, char *argv[]) 
    333342
    334343        /* Cruft to make sure options are clean, and used properly. */
    335344        if (argv[0] && !argv[1] && family == AF_UNIX) {
     345                if (uflag)
     346                        errx(1, "cannot use -u and -U");
     347# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
     348                if (dccpflag)
     349                        errx(1, "cannot use -Z and -U");
     350# endif
    336351                host = argv[0];
    337352                uport = NULL;
    338353        } else if (!argv[0] && lflag) {
    main(int argc, char *argv[]) 
    374389        if (family != AF_UNIX) {
    375390                memset(&hints, 0, sizeof(struct addrinfo));
    376391                hints.ai_family = family;
    377                 hints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
    378                 hints.ai_protocol = uflag ? IPPROTO_UDP : IPPROTO_TCP;
     392                if (uflag) {
     393                    hints.ai_socktype = SOCK_DGRAM;
     394                    hints.ai_protocol = IPPROTO_UDP;
     395                }
     396# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
     397                else if (dccpflag) {
     398                    hints.ai_socktype = SOCK_DCCP;
     399                    hints.ai_protocol = IPPROTO_DCCP;
     400                }
     401# endif
     402                else {
     403                    hints.ai_socktype = SOCK_STREAM;
     404                    hints.ai_protocol = IPPROTO_TCP;
     405                }
    379406                if (nflag)
    380407                        hints.ai_flags |= AI_NUMERICHOST;
    381408        }
    main(int argc, char *argv[]) 
    383410        if (xflag) {
    384411                if (uflag)
    385412                        errx(1, "no proxy support for UDP mode");
    386 
     413# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
     414                if (dccpflag)
     415                        errx(1, "no proxy support for DCCP mode");
     416# endif
    387417                if (lflag)
    388418                        errx(1, "no proxy support for listen");
    389419
    main(int argc, char *argv[]) 
    427457                                err(1, NULL);
    428458
    429459                        char* local;
    430                         if (family == AF_INET6
     460                        if (family == AF_INET6 )
    431461                                local = "0.0.0.0";
    432462                        else if (family == AF_INET)
    433463                                local = ":::";
    434464                        else
    435                                 local = "unknown"
     465                                local = "unknown";
    436466                        fprintf(stderr, "Listening on [%s] (family %d, port %d)\n",
    437467                                host ?: local,
    438468                                family,
    main(int argc, char *argv[]) 
    463493                                connfd = accept(s, (struct sockaddr *)&cliaddr,
    464494                                    &len);
    465495                                if(vflag) {
     496                                        char *proto = proto_name(uflag, dccpflag);
    466497                                /* Don't look up port if -n. */
    467498                                        if (nflag)
    468499                                                sv = NULL;
    469500                                        else
    470501                                                sv = getservbyport(ntohs(atoi(uport)),
    471                                                         uflag ? "udp" : "tcp");
     502                                                        proto);
    472503
    473504                                        if (((struct sockaddr *)&cliaddr)->sa_family == AF_INET) {
    474505                                                char dst[INET_ADDRSTRLEN];
    main(int argc, char *argv[]) 
    476507                                                fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n",
    477508                                                        dst,
    478509                                                        uport,
    479                                                         uflag ? "udp" : "tcp",
     510                                                        proto,
    480511                                                        sv ? sv->s_name : "*",
    481512                                                        ((struct sockaddr *)(&cliaddr))->sa_family,
    482513                                                        ntohs(((struct sockaddr_in *)&cliaddr)->sin_port));
    main(int argc, char *argv[]) 
    487518                                                fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n",
    488519                                                        dst,
    489520                                                        uport,
    490                                                         uflag ? "udp" : "tcp",
     521                                                        proto,
    491522                                                        sv ? sv->s_name : "*",
    492523                                                        ((struct sockaddr *)&cliaddr)->sa_family,
    493524                                                        ntohs(((struct sockaddr_in6 *)&cliaddr)->sin6_port));
    main(int argc, char *argv[]) 
    495526                                        else {
    496527                                                fprintf(stderr, "Connection from unknown port %s [%s/%s] accepted (family %d, sport %d)\n",
    497528                                                        uport,
    498                                                         uflag ? "udp" : "tcp",
     529                                                        proto,
    499530                                                        sv ? sv->s_name : "*",
    500531                                                        ((struct sockaddr *)(&cliaddr))->sa_family,
    501532                                                        ntohs(((struct sockaddr_in *)&cliaddr)->sin_port));
    main(int argc, char *argv[]) 
    559590                                        }
    560591                                }
    561592
     593                                char *proto = proto_name(uflag, dccpflag);
    562594                                /* Don't look up port if -n. */
    563595                                if (nflag)
    564596                                        sv = NULL;
    565597                                else {
    566598                                        sv = getservbyport(
    567599                                            ntohs(atoi(portlist[i])),
    568                                             uflag ? "udp" : "tcp");
     600                                            proto);
    569601                                }
    570602
    571603                                fprintf(stderr,
    572604                                    "Connection to %s %s port [%s/%s] "
    573605                                    "succeeded!\n", host, portlist[i],
    574                                     uflag ? "udp" : "tcp",
     606                                    proto,
    575607                                    sv ? sv->s_name : "*");
    576608                        }
    577609                        if (!zflag)
    unix_listen(char *path) 
    671703        return (s);
    672704}
    673705
     706char *proto_name(uflag, dccpflag) {
     707
     708    char *proto = NULL;
     709    if (uflag) {
     710        proto = "udp";
     711    }
     712# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
     713    else if (dccpflag) {
     714        proto = "dccp";
     715    }
     716# endif
     717    else {
     718        proto = "tcp";
     719    }
     720
     721    return proto;
     722}
     723
    674724/*
    675725 * remote_connect()
    676726 * Returns a socket connected to a remote host. Properly binds to a local
    remote_connect(const char *host, const char *port, struct addrinfo hints) 
    709759# endif
    710760                        memset(&ahints, 0, sizeof(struct addrinfo));
    711761                        ahints.ai_family = res0->ai_family;
    712                         ahints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
    713                         ahints.ai_protocol = uflag ? IPPROTO_UDP : IPPROTO_TCP;
     762                        if (uflag) {
     763                            ahints.ai_socktype = SOCK_DGRAM;
     764                            ahints.ai_protocol = IPPROTO_UDP;
     765
     766                        }
     767# if defined(IPPROTO_DCCP) && defined(SOCK_DCCP)
     768                        else if (dccpflag) {
     769                            hints.ai_socktype = SOCK_DCCP;
     770                            hints.ai_protocol = IPPROTO_DCCP;
     771                        }
     772# endif
     773                        else {
     774                            ahints.ai_socktype = SOCK_STREAM;
     775                            ahints.ai_protocol = IPPROTO_TCP;
     776                        }
    714777                        ahints.ai_flags = AI_PASSIVE;
    715778                        if ((error = getaddrinfo(sflag, pflag, &ahints, &ares)))
    716779                                errx(1, "getaddrinfo: %s", gai_strerror(error));
    remote_connect(const char *host, const char *port, struct addrinfo hints) 
    722785                }
    723786
    724787                set_common_sockopts(s);
     788                char *proto = proto_name(uflag, dccpflag);
    725789
    726                 if ((error = connect_with_timeout(s, res0->ai_addr, res0->ai_addrlen, timeout))== CONNECTION_SUCCESS)
     790                if ((error = connect_with_timeout(s, res0->ai_addr, res0->ai_addrlen, timeout))== CONNECTION_SUCCESS) {
    727791                        break;
    728                 else if (vflag && error == CONNECTION_FAILED)
     792                }
     793                else if (vflag && error == CONNECTION_FAILED) {
    729794                        warn("connect to %s port %s (%s) failed", host, port,
    730                             uflag ? "udp" : "tcp");
    731                 else if (vflag && error == CONNECTION_TIMEOUT)
     795                             proto);
     796                }
     797                else if (vflag && error == CONNECTION_TIMEOUT) {
    732798                    warn("connect to %s port %s (%s) timed out", host, port,
    733                             uflag ? "udp" : "tcp");
     799                             proto);
     800                }
    734801
    735802                close(s);
    736803                s = -1;
    build_ports(char *p) 
    10471114        int hi, lo, cp;
    10481115        int x = 0;
    10491116
    1050         sv = getservbyname(p, uflag ? "udp" : "tcp");
     1117        char *proto = proto_name(uflag, dccpflag);
     1118        sv = getservbyname(p, proto);
    10511119        if (sv) {
    10521120                portlist[0] = calloc(1, PORT_MAX_LEN);
    10531121                if (portlist[0] == NULL)
    help(void) 
    12521320        \t-w secs\t     Timeout for connects and final net reads\n\
    12531321        \t-X proto      Proxy protocol: \"4\", \"5\" (SOCKS) or \"connect\"\n\
    12541322        \t-x addr[:port]\tSpecify proxy address and port\n\
     1323        \t-Z            DCCP mode\n\
    12551324        \t-z            Zero-I/O mode [used for scanning]\n\
    12561325        Port numbers can be individual or ranges: lo-hi [inclusive]\n");
    12571326        exit(0);
    void 
    12611330usage(int ret)
    12621331{
    12631332        fprintf(stderr,
    1264             "usage: nc [-46CDdhjklnrStUuvz] [-I length] [-i interval] [-O length]\n"
     1333            "usage: nc [-46CDdhjklnrStUuvZz] [-I length] [-i interval] [-O length]\n"
    12651334            "\t  [-P proxy_username] [-p source_port] [-q seconds] [-s source]\n"
    12661335            "\t  [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]\n"
    12671336            "\t  [-x proxy_address[:port]] [destination] [port]\n");
Note: See TracBrowser for help on using the repository browser.