source:
npl/overig/netcat_openbsd/patches/0009-dccp-support.patch
@
ffaaf60
Last change on this file since ffaaf60 was c5c522c, checked in by , 8 years ago | |
---|---|
|
|
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 34 34 .Sh SYNOPSIS 35 35 .Nm nc 36 36 .Bk -words 37 .Op Fl 46CDdhklnrStUuv z37 .Op Fl 46CDdhklnrStUuvZz 38 38 .Op Fl I Ar length 39 39 .Op Fl i Ar interval 40 40 .Op Fl O Ar length … … If 257 257 .Ar port 258 258 is not specified, the well-known port for the proxy protocol is used (1080 259 259 for SOCKS, 3128 for HTTPS). 260 .It Fl Z 261 DCCP mode. 260 262 .It Fl z 261 263 Specifies that 262 264 .Nm -
netcat.c
diff --git a/netcat.c b/netcat.c index eb3453e..56cc15e 100644
a b int rflag; /* Random ports flag */ 129 129 char *sflag; /* Source Address */ 130 130 int tflag; /* Telnet Emulation */ 131 131 int uflag; /* UDP - Default to TCP */ 132 int dccpflag; /* DCCP - Default to TCP */ 132 133 int vflag; /* Verbosity */ 133 134 int xflag; /* Socks proxy */ 134 135 int zflag; /* Port Scan Flag */ … … int unix_listen(char *); 160 161 void set_common_sockopts(int); 161 162 int map_tos(char *, int *); 162 163 void usage(int); 164 char *proto_name(int uflag, int dccpflag); 163 165 164 166 static int connect_with_timeout(int fd, const struct sockaddr *sa, 165 167 socklen_t salen, int ctimeout); … … main(int argc, char *argv[]) 187 189 sv = NULL; 188 190 189 191 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) { 191 193 switch (ch) { 192 194 case '4': 193 195 family = AF_INET; … … main(int argc, char *argv[]) 258 260 case 'u': 259 261 uflag = 1; 260 262 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; 261 270 case 'V': 262 271 # if defined(RT_TABLEID_MAX) 263 272 rtableid = (unsigned int)strtonum(optarg, 0, … … main(int argc, char *argv[]) 333 342 334 343 /* Cruft to make sure options are clean, and used properly. */ 335 344 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 336 351 host = argv[0]; 337 352 uport = NULL; 338 353 } else if (!argv[0] && lflag) { … … main(int argc, char *argv[]) 374 389 if (family != AF_UNIX) { 375 390 memset(&hints, 0, sizeof(struct addrinfo)); 376 391 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 } 379 406 if (nflag) 380 407 hints.ai_flags |= AI_NUMERICHOST; 381 408 } … … main(int argc, char *argv[]) 383 410 if (xflag) { 384 411 if (uflag) 385 412 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 387 417 if (lflag) 388 418 errx(1, "no proxy support for listen"); 389 419 … … main(int argc, char *argv[]) 427 457 err(1, NULL); 428 458 429 459 char* local; 430 if (family == AF_INET6 460 if (family == AF_INET6 ) 431 461 local = "0.0.0.0"; 432 462 else if (family == AF_INET) 433 463 local = ":::"; 434 464 else 435 local = "unknown" 465 local = "unknown"; 436 466 fprintf(stderr, "Listening on [%s] (family %d, port %d)\n", 437 467 host ?: local, 438 468 family, … … main(int argc, char *argv[]) 463 493 connfd = accept(s, (struct sockaddr *)&cliaddr, 464 494 &len); 465 495 if(vflag) { 496 char *proto = proto_name(uflag, dccpflag); 466 497 /* Don't look up port if -n. */ 467 498 if (nflag) 468 499 sv = NULL; 469 500 else 470 501 sv = getservbyport(ntohs(atoi(uport)), 471 uflag ? "udp" : "tcp");502 proto); 472 503 473 504 if (((struct sockaddr *)&cliaddr)->sa_family == AF_INET) { 474 505 char dst[INET_ADDRSTRLEN]; … … main(int argc, char *argv[]) 476 507 fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n", 477 508 dst, 478 509 uport, 479 uflag ? "udp" : "tcp",510 proto, 480 511 sv ? sv->s_name : "*", 481 512 ((struct sockaddr *)(&cliaddr))->sa_family, 482 513 ntohs(((struct sockaddr_in *)&cliaddr)->sin_port)); … … main(int argc, char *argv[]) 487 518 fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n", 488 519 dst, 489 520 uport, 490 uflag ? "udp" : "tcp",521 proto, 491 522 sv ? sv->s_name : "*", 492 523 ((struct sockaddr *)&cliaddr)->sa_family, 493 524 ntohs(((struct sockaddr_in6 *)&cliaddr)->sin6_port)); … … main(int argc, char *argv[]) 495 526 else { 496 527 fprintf(stderr, "Connection from unknown port %s [%s/%s] accepted (family %d, sport %d)\n", 497 528 uport, 498 uflag ? "udp" : "tcp",529 proto, 499 530 sv ? sv->s_name : "*", 500 531 ((struct sockaddr *)(&cliaddr))->sa_family, 501 532 ntohs(((struct sockaddr_in *)&cliaddr)->sin_port)); … … main(int argc, char *argv[]) 559 590 } 560 591 } 561 592 593 char *proto = proto_name(uflag, dccpflag); 562 594 /* Don't look up port if -n. */ 563 595 if (nflag) 564 596 sv = NULL; 565 597 else { 566 598 sv = getservbyport( 567 599 ntohs(atoi(portlist[i])), 568 uflag ? "udp" : "tcp");600 proto); 569 601 } 570 602 571 603 fprintf(stderr, 572 604 "Connection to %s %s port [%s/%s] " 573 605 "succeeded!\n", host, portlist[i], 574 uflag ? "udp" : "tcp",606 proto, 575 607 sv ? sv->s_name : "*"); 576 608 } 577 609 if (!zflag) … … unix_listen(char *path) 671 703 return (s); 672 704 } 673 705 706 char *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 674 724 /* 675 725 * remote_connect() 676 726 * Returns a socket connected to a remote host. Properly binds to a local … … remote_connect(const char *host, const char *port, struct addrinfo hints) 709 759 # endif 710 760 memset(&ahints, 0, sizeof(struct addrinfo)); 711 761 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 } 714 777 ahints.ai_flags = AI_PASSIVE; 715 778 if ((error = getaddrinfo(sflag, pflag, &ahints, &ares))) 716 779 errx(1, "getaddrinfo: %s", gai_strerror(error)); … … remote_connect(const char *host, const char *port, struct addrinfo hints) 722 785 } 723 786 724 787 set_common_sockopts(s); 788 char *proto = proto_name(uflag, dccpflag); 725 789 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) { 727 791 break; 728 else if (vflag && error == CONNECTION_FAILED) 792 } 793 else if (vflag && error == CONNECTION_FAILED) { 729 794 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) { 732 798 warn("connect to %s port %s (%s) timed out", host, port, 733 uflag ? "udp" : "tcp"); 799 proto); 800 } 734 801 735 802 close(s); 736 803 s = -1; … … build_ports(char *p) 1047 1114 int hi, lo, cp; 1048 1115 int x = 0; 1049 1116 1050 sv = getservbyname(p, uflag ? "udp" : "tcp"); 1117 char *proto = proto_name(uflag, dccpflag); 1118 sv = getservbyname(p, proto); 1051 1119 if (sv) { 1052 1120 portlist[0] = calloc(1, PORT_MAX_LEN); 1053 1121 if (portlist[0] == NULL) … … help(void) 1252 1320 \t-w secs\t Timeout for connects and final net reads\n\ 1253 1321 \t-X proto Proxy protocol: \"4\", \"5\" (SOCKS) or \"connect\"\n\ 1254 1322 \t-x addr[:port]\tSpecify proxy address and port\n\ 1323 \t-Z DCCP mode\n\ 1255 1324 \t-z Zero-I/O mode [used for scanning]\n\ 1256 1325 Port numbers can be individual or ranges: lo-hi [inclusive]\n"); 1257 1326 exit(0); … … void 1261 1330 usage(int ret) 1262 1331 { 1263 1332 fprintf(stderr, 1264 "usage: nc [-46CDdhjklnrStUuv z] [-I length] [-i interval] [-O length]\n"1333 "usage: nc [-46CDdhjklnrStUuvZz] [-I length] [-i interval] [-O length]\n" 1265 1334 "\t [-P proxy_username] [-p source_port] [-q seconds] [-s source]\n" 1266 1335 "\t [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]\n" 1267 1336 "\t [-x proxy_address[:port]] [destination] [port]\n");
Note: See TracBrowser
for help on using the repository browser.