[c5c522c] | 1 | From: Aron Xu <aron@debian.org> |
---|
| 2 | Date: Mon, 13 Feb 2012 15:38:15 +0800 |
---|
| 3 | Subject: verbose numeric port |
---|
| 4 | |
---|
| 5 | --- |
---|
| 6 | netcat.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- |
---|
| 7 | 1 file changed, 55 insertions(+), 4 deletions(-) |
---|
| 8 | |
---|
| 9 | diff --git a/netcat.c b/netcat.c |
---|
| 10 | index baab909..eb3453e 100644 |
---|
| 11 | --- a/netcat.c |
---|
| 12 | +++ b/netcat.c |
---|
| 13 | @@ -41,6 +41,7 @@ |
---|
| 14 | #include <netinet/tcp.h> |
---|
| 15 | #include <netinet/ip.h> |
---|
| 16 | #include <arpa/telnet.h> |
---|
| 17 | +#include <arpa/inet.h> |
---|
| 18 | |
---|
| 19 | #ifndef IPTOS_LOWDELAY |
---|
| 20 | # define IPTOS_LOWDELAY 0x10 |
---|
| 21 | @@ -424,6 +425,18 @@ main(int argc, char *argv[]) |
---|
| 22 | s = local_listen(host, uport, hints); |
---|
| 23 | if (s < 0) |
---|
| 24 | err(1, NULL); |
---|
| 25 | + |
---|
| 26 | + char* local; |
---|
| 27 | + if (family == AF_INET6 |
---|
| 28 | + local = "0.0.0.0"; |
---|
| 29 | + else if (family == AF_INET) |
---|
| 30 | + local = ":::"; |
---|
| 31 | + else |
---|
| 32 | + local = "unknown" |
---|
| 33 | + fprintf(stderr, "Listening on [%s] (family %d, port %d)\n", |
---|
| 34 | + host ?: local, |
---|
| 35 | + family, |
---|
| 36 | + *uport); |
---|
| 37 | /* |
---|
| 38 | * For UDP, we will use recvfrom() initially |
---|
| 39 | * to wait for a caller, then use the regular |
---|
| 40 | @@ -432,16 +445,15 @@ main(int argc, char *argv[]) |
---|
| 41 | if (uflag) { |
---|
| 42 | int rv, plen; |
---|
| 43 | char buf[16384]; |
---|
| 44 | - struct sockaddr_storage z; |
---|
| 45 | |
---|
| 46 | - len = sizeof(z); |
---|
| 47 | + len = sizeof(cliaddr); |
---|
| 48 | plen = jflag ? 16384 : 2048; |
---|
| 49 | rv = recvfrom(s, buf, plen, MSG_PEEK, |
---|
| 50 | - (struct sockaddr *)&z, &len); |
---|
| 51 | + (struct sockaddr *)&cliaddr, &len); |
---|
| 52 | if (rv < 0) |
---|
| 53 | err(1, "recvfrom"); |
---|
| 54 | |
---|
| 55 | - rv = connect(s, (struct sockaddr *)&z, len); |
---|
| 56 | + rv = connect(s, (struct sockaddr *)&cliaddr, len); |
---|
| 57 | if (rv < 0) |
---|
| 58 | err(1, "connect"); |
---|
| 59 | |
---|
| 60 | @@ -450,6 +462,45 @@ main(int argc, char *argv[]) |
---|
| 61 | len = sizeof(cliaddr); |
---|
| 62 | connfd = accept(s, (struct sockaddr *)&cliaddr, |
---|
| 63 | &len); |
---|
| 64 | + if(vflag) { |
---|
| 65 | + /* Don't look up port if -n. */ |
---|
| 66 | + if (nflag) |
---|
| 67 | + sv = NULL; |
---|
| 68 | + else |
---|
| 69 | + sv = getservbyport(ntohs(atoi(uport)), |
---|
| 70 | + uflag ? "udp" : "tcp"); |
---|
| 71 | + |
---|
| 72 | + if (((struct sockaddr *)&cliaddr)->sa_family == AF_INET) { |
---|
| 73 | + char dst[INET_ADDRSTRLEN]; |
---|
| 74 | + inet_ntop(((struct sockaddr *)&cliaddr)->sa_family,&(((struct sockaddr_in *)&cliaddr)->sin_addr),dst,INET_ADDRSTRLEN); |
---|
| 75 | + fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n", |
---|
| 76 | + dst, |
---|
| 77 | + uport, |
---|
| 78 | + uflag ? "udp" : "tcp", |
---|
| 79 | + sv ? sv->s_name : "*", |
---|
| 80 | + ((struct sockaddr *)(&cliaddr))->sa_family, |
---|
| 81 | + ntohs(((struct sockaddr_in *)&cliaddr)->sin_port)); |
---|
| 82 | + } |
---|
| 83 | + else if(((struct sockaddr *)&cliaddr)->sa_family == AF_INET6) { |
---|
| 84 | + char dst[INET6_ADDRSTRLEN]; |
---|
| 85 | + inet_ntop(((struct sockaddr *)&cliaddr)->sa_family,&(((struct sockaddr_in6 *)&cliaddr)->sin6_addr),dst,INET6_ADDRSTRLEN); |
---|
| 86 | + fprintf(stderr, "Connection from [%s] port %s [%s/%s] accepted (family %d, sport %d)\n", |
---|
| 87 | + dst, |
---|
| 88 | + uport, |
---|
| 89 | + uflag ? "udp" : "tcp", |
---|
| 90 | + sv ? sv->s_name : "*", |
---|
| 91 | + ((struct sockaddr *)&cliaddr)->sa_family, |
---|
| 92 | + ntohs(((struct sockaddr_in6 *)&cliaddr)->sin6_port)); |
---|
| 93 | + } |
---|
| 94 | + else { |
---|
| 95 | + fprintf(stderr, "Connection from unknown port %s [%s/%s] accepted (family %d, sport %d)\n", |
---|
| 96 | + uport, |
---|
| 97 | + uflag ? "udp" : "tcp", |
---|
| 98 | + sv ? sv->s_name : "*", |
---|
| 99 | + ((struct sockaddr *)(&cliaddr))->sa_family, |
---|
| 100 | + ntohs(((struct sockaddr_in *)&cliaddr)->sin_port)); |
---|
| 101 | + } |
---|
| 102 | + } |
---|
| 103 | readwrite(connfd); |
---|
| 104 | close(connfd); |
---|
| 105 | } |
---|
| 106 | -- |
---|