Skip site navigation (1)Skip section navigation (2)


| raw e-mail | index | archive | help
The branch stable/13 has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=be0706e8e15de57c7d245abe918f494d90a49934

commit be0706e8e15de57c7d245abe918f494d90a49934
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2025-05-31 18:07:46 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2025-06-07 06:51:39 +0000

    netcat: Allow service names to be used.
    
    Someone should really do a vendor import, but it's non-trivial, as we
    have local modifications.  In the meantime, here's a nine-year-old
    upstream patch which allows service names to be used instead of port
    numbers.
    
    MFC after:      1 week
    Obtained from:  OpenBSD
    Reviewed by:    allanjude
    Differential Revision:  https://reviews.freebsd.org/D50348
    
    (cherry picked from commit 6d3d1fc3a30453be19831f79399bcba0ae822ad1)
---
 contrib/netcat/nc.1     |  6 +++---
 contrib/netcat/netcat.c | 42 +++++++++++++++++++++++++++++-------------
 2 files changed, 32 insertions(+), 16 deletions(-)

diff --git a/contrib/netcat/nc.1 b/contrib/netcat/nc.1
index 2627920cca15..dadff019e9b8 100644
--- a/contrib/netcat/nc.1
+++ b/contrib/netcat/nc.1
@@ -27,7 +27,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 10, 2020
+.Dd May 14, 2025
 .Dt NC 1
 .Os
 .Sh NAME
@@ -334,8 +334,8 @@ sockets, a destination is required and is the socket path to connect to
 option is given).
 .Pp
 .Ar port
-can be a single integer or a range of ports.
-Ranges are in the form nn-mm.
+can be a specified as a numeric port number, or as a service name.
+Ports may be specified in a range of the form nn-mm.
 In general,
 a destination port must be specified,
 unless the
diff --git a/contrib/netcat/netcat.c b/contrib/netcat/netcat.c
index eb3c7544be76..20bb2d056fce 100644
--- a/contrib/netcat/netcat.c
+++ b/contrib/netcat/netcat.c
@@ -116,6 +116,7 @@ char *portlist[PORT_MAX+1];
 char *unix_dg_tmp_socket;
 
 void	atelnet(int, unsigned char *, unsigned int);
+int	strtoport(char *portstr, int udp);
 void	build_ports(char *);
 void	help(void);
 int	local_listen(char *, char *, struct addrinfo);
@@ -1145,6 +1146,26 @@ atelnet(int nfd, unsigned char *buf, unsigned int size)
 	}
 }
 
+int
+strtoport(char *portstr, int udp)
+{
+	struct servent *entry;
+	const char *errstr;
+	char *proto;
+	int port = -1;
+
+	proto = udp ? "udp" : "tcp";
+
+	port = strtonum(portstr, 1, PORT_MAX, &errstr);
+	if (errstr == NULL)
+		return port;
+	if (errno != EINVAL)
+		errx(1, "port number %s: %s", errstr, portstr);
+	if ((entry = getservbyname(portstr, proto)) == NULL)
+		errx(1, "service \"%s\" unknown", portstr);
+	return ntohs(entry->s_port);
+}
+
 /*
  * build_ports()
  * Build an array of ports in portlist[], listing each port
@@ -1153,7 +1174,6 @@ atelnet(int nfd, unsigned char *buf, unsigned int size)
 void
 build_ports(char *p)
 {
-	const char *errstr;
 	char *n;
 	int hi, lo, cp;
 	int x = 0;
@@ -1163,13 +1183,8 @@ build_ports(char *p)
 		n++;
 
 		/* Make sure the ports are in order: lowest->highest. */
-		hi = strtonum(n, 1, PORT_MAX, &errstr);
-		if (errstr)
-			errx(1, "port number %s: %s", errstr, n);
-		lo = strtonum(p, 1, PORT_MAX, &errstr);
-		if (errstr)
-			errx(1, "port number %s: %s", errstr, p);
-
+		hi = strtoport(n, uflag);
+		lo = strtoport(p, uflag);
 		if (lo > hi) {
 			cp = hi;
 			hi = lo;
@@ -1198,11 +1213,12 @@ build_ports(char *p)
 			}
 		}
 	} else {
-		hi = strtonum(p, 1, PORT_MAX, &errstr);
-		if (errstr)
-			errx(1, "port number %s: %s", errstr, p);
-		portlist[0] = strdup(p);
-		if (portlist[0] == NULL)
+		char *tmp;
+
+		hi = strtoport(p, uflag);
+		if (asprintf(&tmp, "%d", hi) != -1)
+			portlist[0] = tmp;
+		else
 			err(1, NULL);
 	}
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?>