Module Name: src
Committed By: christos
Date: Thu Feb 6 20:59:00 UTC 2025
Modified Files:
src/usr.bin/getnameinfo: Makefile getnameinfo.1 getnameinfo.c
Log Message:
PR/59047: Taylor R Campbell: Add AF_LINK, AF_APPLETALK, AF_LOCAL
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/usr.bin/getnameinfo/Makefile
cvs rdiff -u -r1.4 -r1.5 src/usr.bin/getnameinfo/getnameinfo.1
cvs rdiff -u -r1.7 -r1.8 src/usr.bin/getnameinfo/getnameinfo.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/getnameinfo/Makefile
diff -u src/usr.bin/getnameinfo/Makefile:1.1 src/usr.bin/getnameinfo/Makefile:1.2
--- src/usr.bin/getnameinfo/Makefile:1.1 Mon Jan 27 13:30:19 2025
+++ src/usr.bin/getnameinfo/Makefile Thu Feb 6 15:59:00 2025
@@ -1,9 +1,17 @@
-# $NetBSD: Makefile,v 1.1 2025/01/27 18:30:19 christos Exp $
+# $NetBSD: Makefile,v 1.2 2025/02/06 20:59:00 christos Exp $
.include <bsd.own.mk>
-PROG = getnameinfo
+WARNS= 5
-WARNS = 5
+GETADDRINFO:=${.PARSEDIR}/../getaddrinfo
+
+.include "${GETADDRINFO}/Makefile.inc"
+
+.PATH.c: ${GETADDRINFO}
+
+PROG= getnameinfo
+SRCS= getnameinfo.c support.c
+CPPFLAGS+= -I${GETADDRINFO}
.include <bsd.prog.mk>
Index: src/usr.bin/getnameinfo/getnameinfo.1
diff -u src/usr.bin/getnameinfo/getnameinfo.1:1.4 src/usr.bin/getnameinfo/getnameinfo.1:1.5
--- src/usr.bin/getnameinfo/getnameinfo.1:1.4 Wed Feb 5 10:58:01 2025
+++ src/usr.bin/getnameinfo/getnameinfo.1 Thu Feb 6 15:59:00 2025
@@ -1,4 +1,4 @@
-.\" $NetBSD: getnameinfo.1,v 1.4 2025/02/05 15:58:01 uwe Exp $
+.\" $NetBSD: getnameinfo.1,v 1.5 2025/02/06 20:59:00 christos Exp $
.\"
.\" Copyright (c) 2025 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -27,7 +27,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd January 16, 2025
+.Dd February 6, 2025
.Dt GETNAMEINFO 1
.Os
.Sh NAME
@@ -35,7 +35,8 @@
.Nd resolve IP addresses and ports to host and service names
.Sh SYNOPSIS
.Nm
-.Op Fl 46fHNnrSu
+.Op Fl 46FHNnrSu
+.Op Fl f Ar family
.Op Fl p Ar port
.Op Ar IP-address
.Sh DESCRIPTION
@@ -68,12 +69,15 @@ The following options are available:
Restrict the lookup to IPv4 addresses only.
.It Fl 6
Restrict the lookup to IPv6 addresses only.
-.It Fl f
+.It Fl F
Suppress the fully-qualified domain name (FQDN).
This is equivalent to the
.Dv NI_NOFQDN
flag in
.Xr getnameinfo 3 .
+.It Fl f
+Specify an address family numerically or as a name, eg.
+.Dq inet .
.It Fl H
Display only the hostname, omitting the service name.
.It Fl N
Index: src/usr.bin/getnameinfo/getnameinfo.c
diff -u src/usr.bin/getnameinfo/getnameinfo.c:1.7 src/usr.bin/getnameinfo/getnameinfo.c:1.8
--- src/usr.bin/getnameinfo/getnameinfo.c:1.7 Wed Feb 5 08:10:29 2025
+++ src/usr.bin/getnameinfo/getnameinfo.c Thu Feb 6 15:59:00 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: getnameinfo.c,v 1.7 2025/02/05 13:10:29 riastradh Exp $ */
+/* $NetBSD: getnameinfo.c,v 1.8 2025/02/06 20:59:00 christos Exp $ */
/*
* Copyright (c) 2025 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: getnameinfo.c,v 1.7 2025/02/05 13:10:29 riastradh Exp $");
+__RCSID("$NetBSD: getnameinfo.c,v 1.8 2025/02/06 20:59:00 christos Exp $");
#endif
#include <sys/types.h>
@@ -40,6 +40,10 @@ __RCSID("$NetBSD: getnameinfo.c,v 1.7 20
#include <arpa/inet.h>
#include <netinet/in.h>
+#include <netatalk/at.h>
+#include <sys/un.h>
+#include <net/if_dl.h>
+#include <arpa/inet.h>
#include <assert.h>
#include <err.h>
@@ -51,16 +55,19 @@ __RCSID("$NetBSD: getnameinfo.c,v 1.7 20
#include <string.h>
#include <unistd.h>
+#include "support.h"
+
/*
* getnameinfo: Resolve IP addresses and ports to hostnames and service names,
* similar to the getnameinfo function in the standard library.
*
* usage:
- * getnameinfo [-46fHNnrSu] [-p port] [<IP-address>]
+ * getnameinfo [-46FHNnrSu] [-f family] [-p port] <IP-address>
*
* -4: Restrict lookup to IPv4 addresses only
* -6: Restrict lookup to IPv6 addresses only
- * -f: Suppress the fully-qualified domain name (FQDN)
+ * -F: Suppress the fully-qualified domain name (FQDN)
+ * -f: Specify address family to look up
* -H: Display only the hostname, omitting the service name
* -N: Display the numeric service name instead of the service name
* -n: Display the numeric host address instead of the hostname
@@ -73,7 +80,9 @@ __RCSID("$NetBSD: getnameinfo.c,v 1.7 20
static void usage(void) __dead;
static void print_result(bool, bool, char *, char *);
static in_port_t get_port(const char *);
+static uint8_t get_family_from_address(const char *);
static uint8_t get_family(const char *);
+static void parse_atalk(const char *, struct sockaddr_at *);
int
main(int argc, char **argv)
@@ -88,21 +97,23 @@ main(int argc, char **argv)
struct sockaddr_storage addr_st;
struct sockaddr_in *addr_in;
struct sockaddr_in6 *addr_in6;
+ struct sockaddr_un *addr_un;
+ struct sockaddr_dl *addr_dl;
int ch;
int error;
setprogname(argv[0]);
- while ((ch = getopt(argc, argv, "46rufnNHSp:")) != -1) {
+ while ((ch = getopt(argc, argv, "46Ff:HNnp:rSu")) != -1) {
switch (ch) {
case '4':
if (family != AF_UNSPEC)
- goto opt46;
+ goto opt46f;
family = AF_INET;
break;
case '6':
if (family != AF_UNSPEC)
- goto opt46;
+ goto opt46f;
family = AF_INET6;
break;
case 'r':
@@ -112,6 +123,11 @@ main(int argc, char **argv)
flags |= NI_DGRAM;
break;
case 'f':
+ if (family != AF_UNSPEC)
+ goto opt46f;
+ family = get_family(optarg);
+ break;
+ case 'F':
flags |= NI_NOFQDN;
break;
case 'n':
@@ -162,10 +178,16 @@ main(int argc, char **argv)
if (argc == 1) {
address = argv[0];
if (family == AF_UNSPEC)
- family = get_family(address);
+ family = get_family_from_address(address);
}
+ memset(&addr_st, 0, sizeof(addr_st));
+
switch (family) {
+ case AF_APPLETALK:
+ parse_atalk(address, (struct sockaddr_at *)&addr_st);
+ addrlen = sizeof(struct sockaddr_at *);
+ break;
case AF_INET:
addr_in = (struct sockaddr_in *)&addr_st;
addr_in->sin_family = family;
@@ -173,10 +195,8 @@ main(int argc, char **argv)
if (address == NULL) {
addr_in->sin_addr.s_addr = INADDR_ANY;
} else if (inet_pton(family, address, &addr_in->sin_addr)
- == 0) {
- warnx("Invalid IPv4 address: %s", address);
- return EXIT_FAILURE;
- }
+ == 0)
+ errx(EXIT_FAILURE, "Invalid IPv4 address: %s", address);
addrlen = sizeof(*addr_in);
break;
case AF_INET6:
@@ -187,15 +207,28 @@ main(int argc, char **argv)
addr_in6->sin6_addr =
(struct in6_addr)IN6ADDR_ANY_INIT;
} else if (inet_pton(family, address, &addr_in6->sin6_addr)
- == 0) {
- warnx("Invalid IPv6 address: %s", address);
- return EXIT_FAILURE;
- }
+ == 0)
+ errx(EXIT_FAILURE, "Invalid IPv6 address: %s", address);
addrlen = sizeof(*addr_in6);
break;
+ case AF_LINK:
+ addr_dl = (struct sockaddr_dl *)&addr_st;
+ addr_dl->sdl_len = sizeof(addr_st);
+ link_addr(address, addr_dl);
+ addrlen = addr_dl->sdl_len;
+ break;
+ case AF_LOCAL:
+ addr_un = (struct sockaddr_un *)&addr_st;
+ addr_un->sun_family = family;
+ if (strlen(address) >= sizeof(addr_un->sun_path))
+ errx(EXIT_FAILURE, "Invalid AF_LOCAL address: %s",
+ address);
+ (void)strncpy(addr_un->sun_path, address,
+ sizeof(addr_un->sun_path));
+ addrlen = sizeof(*addr_un);
+ break;
default:
- warnx("Unsupported family %d", family);
- return EXIT_FAILURE;
+ errx(EXIT_FAILURE, "Unsupported family %d", family);
}
if (hostname_only)
@@ -209,18 +242,36 @@ main(int argc, char **argv)
errx(EXIT_FAILURE, "%s", gai_strerror(error));
print_result(hostname_only, service_only, hostname, service);
+
fflush(stdout);
return ferror(stdout) ? EXIT_FAILURE : EXIT_SUCCESS;
-opt46:
- warnx("Options -4 and -6 cannot be used together");
+opt46f:
+ warnx("Options -4, -6, -f cannot be used together");
usage();
optHS:
warnx("Options -H and -S cannot be used together");
usage();
}
+static void
+parse_atalk(const char *address, struct sockaddr_at *addr_at)
+{
+ int net, node, port;
+
+ if (sscanf(address, "%d:%d:%d", &net, &node, &port) != 3)
+badat: errx(EXIT_FAILURE, "Invalid appletalk address: %s", address);
+
+ if (net < 0 || net > 0xFFFF || node < 0 || node > 0xFF ||
+ port < 0 || port > 0xFFFF)
+ goto badat;
+ addr_at->sat_family = AF_APPLETALK;
+ addr_at->sat_addr.s_net = htons((u_short)net);
+ addr_at->sat_addr.s_node = (u_char)node;
+ addr_at->sat_port = htons((u_short)port);
+}
+
static uint8_t
-get_family(const char *address)
+get_family_from_address(const char *address)
{
struct in_addr ipv4_addr;
struct in6_addr ipv6_addr;
@@ -234,6 +285,15 @@ get_family(const char *address)
errx(EXIT_FAILURE, "Invalid addrsss %s", address);
}
+static uint8_t
+get_family(const char* str)
+{
+ int fam;
+ if (!parse_af(str, &fam) || fam <= 0 || fam > 255)
+ errx(EXIT_FAILURE, "Invalid family %s", str);
+ return (int8_t)fam;
+}
+
static in_port_t
get_port(const char *port_str)
{