Package: netcat-openbsd / 1.195-2

verbose-numeric-port.patch Patch series | download
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)