1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
From: Aron Xu <aron@debian.org>
Date: Mon, 13 Feb 2012 15:38:15 +0800
Subject: verbose numeric port
---
netcat.c | 34 ++++++++++++++++++++++++++++------
1 file changed, 28 insertions(+), 6 deletions(-)
--- a/netcat.c
+++ b/netcat.c
@@ -43,6 +43,7 @@
#include <netinet/tcp.h>
#include <netinet/ip.h>
#include <arpa/telnet.h>
+#include <arpa/inet.h>
#ifdef __linux__
# include <linux/in6.h>
#endif
@@ -210,6 +211,7 @@ int process_tls_opt(char *, int *);
void save_peer_cert(struct tls *_tls_ctx, FILE *_fp);
# endif
void report_connect(const struct sockaddr *, socklen_t, char *);
+void report_listen(const struct sockaddr *, socklen_t, int);
# if defined(TLS)
void report_tls(struct tls *tls_ctx, char * host);
# endif
@@ -708,20 +710,19 @@ main(int argc, char *argv[])
*/
int rv;
char buf[2048];
- struct sockaddr_storage z;
- len = sizeof(z);
+ len = sizeof(cliaddr);
rv = recvfrom(s, buf, sizeof(buf), MSG_PEEK,
- (struct sockaddr *)&z, &len);
+ (struct sockaddr *)&cliaddr, &len);
if (rv < 0)
err(1, "recvfrom");
- rv = connect(s, (struct sockaddr *)&z, len);
+ rv = connect(s, (struct sockaddr *)&cliaddr, len);
if (rv < 0)
err(1, "connect");
if (vflag)
- report_connect((struct sockaddr *)&z, len, NULL);
+ report_connect((struct sockaddr *)&cliaddr, len, NULL);
# if defined(TLS)
readwrite(s, NULL);
@@ -1246,8 +1247,12 @@ local_listen(const char *host, const cha
set_common_sockopts(s, res->ai_family);
if (bind(s, (struct sockaddr *)res->ai_addr,
- res->ai_addrlen) == 0)
+ res->ai_addrlen) == 0) {
+ if (vflag)
+ report_listen(res->ai_addr, res->ai_addrlen,
+ res->ai_family);
break;
+ }
save_errno = errno;
close(s);
@@ -2036,6 +2041,23 @@ report_connect(const struct sockaddr *sa
}
void
+report_listen(const struct sockaddr *sa, socklen_t salen, int family)
+{
+ char hostname[NI_MAXHOST];
+ char service[NI_MAXSERV];
+ int flags = NI_NUMERICSERV;
+
+ if (nflag)
+ flags |= NI_NUMERICHOST;
+ if (getnameinfo(sa, salen, hostname, sizeof(hostname),
+ service, sizeof(service), flags) == -1)
+ warn("Could not get address info for the listening socket");
+ else
+ fprintf(stderr, "Listening on [%s] (family %d, port %s)\n",
+ hostname, family, service);
+}
+
+void
help(void)
{
# if defined(DEBIAN_VERSION)
|