mirror of
https://git.freebsd.org/src.git
synced 2026-01-11 19:57:22 +00:00
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:
parent
e3bc87ab1b
commit
6d3d1fc3a3
2 changed files with 32 additions and 16 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue