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
This commit is contained in:
Dag-Erling Smørgrav 2025-05-31 20:07:46 +02:00
parent e3bc87ab1b
commit 6d3d1fc3a3
2 changed files with 32 additions and 16 deletions

View file

@ -27,7 +27,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd January 20, 2025
.Dd May 14, 2025
.Dt NC 1
.Os
.Sh NAME
@ -351,8 +351,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

View file

@ -119,6 +119,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);
@ -1197,6 +1198,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
@ -1205,7 +1226,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;
@ -1215,13 +1235,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;
@ -1250,11 +1265,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);
}
}