svn commit: r335806 - projects/pnfs-planb-server/usr.sbin/nfsd

Rick Macklem rmacklem at FreeBSD.org
Fri Jun 29 22:07:26 UTC 2018


Author: rmacklem
Date: Fri Jun 29 22:07:25 2018
New Revision: 335806
URL: https://svnweb.freebsd.org/changeset/base/335806

Log:
  Add support for IPv6 addresses to the "-p" option for the pNFS server DS
  specifications.

Modified:
  projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c

Modified: projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c
==============================================================================
--- projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c	Fri Jun 29 21:15:26 2018	(r335805)
+++ projects/pnfs-planb-server/usr.sbin/nfsd/nfsd.c	Fri Jun 29 22:07:25 2018	(r335806)
@@ -1177,14 +1177,16 @@ backup_stable(__unused int signo)
 static void
 parse_dsserver(const char *optionarg, struct nfsd_nfsd_args *nfsdargp)
 {
-	char *ad, *cp, *cp2, *dsaddr, *dshost, *dspath, *dsvol, nfsprt[9];
-	char *mdspath, *mdsp;
+	char *cp, *cp2, *dsaddr, *dshost, *dspath, *dsvol, nfsprt[9];
+	char *mdspath, *mdsp, ip6[INET6_ADDRSTRLEN];
+	const char *ad;
 	int ecode;
 	u_int adsiz, dsaddrcnt, dshostcnt, dspathcnt, hostsiz, pathsiz;
 	u_int mdspathcnt;
 	size_t dsaddrsiz, dshostsiz, dspathsiz, nfsprtsiz, mdspathsiz;
-	struct addrinfo hints, *ai_tcp;
+	struct addrinfo hints, *ai_tcp, *res;
 	struct sockaddr_in sin;
+	struct sockaddr_in6 sin6;
 
 	cp = strdup(optionarg);
 	if (cp == NULL)
@@ -1273,22 +1275,45 @@ parse_dsserver(const char *optionarg, struct nfsd_nfsd
 
 		/* Get the fully qualified domain name and IP address. */
 		memset(&hints, 0, sizeof(hints));
-		hints.ai_flags = AI_CANONNAME;
-		hints.ai_family = AF_INET;
+		hints.ai_flags = AI_CANONNAME | AI_ADDRCONFIG;
+		hints.ai_family = PF_UNSPEC;
 		hints.ai_socktype = SOCK_STREAM;
 		hints.ai_protocol = IPPROTO_TCP;
 		ecode = getaddrinfo(cp, NULL, &hints, &ai_tcp);
 		if (ecode != 0)
 			err(1, "getaddrinfo pnfs: %s %s", cp,
 			    gai_strerror(ecode));
-		if (ai_tcp->ai_addr->sa_family != AF_INET ||
-		    ai_tcp->ai_addrlen < sizeof(sin))
-			err(1, "getaddrinfo() returned non-INET address");
-		/* Mips cares about sockaddr_in alignment, so copy the addr. */
-		memcpy(&sin, ai_tcp->ai_addr, sizeof(sin));
+		ad = NULL;
+		for (res = ai_tcp; res != NULL; res = res->ai_next) {
+			if (res->ai_addr->sa_family == AF_INET) {
+				if (res->ai_addrlen < sizeof(sin))
+					err(1, "getaddrinfo() returned "
+					    "undersized IPv4 address");
+				/*
+				 * Mips cares about sockaddr_in alignment,
+				 * so copy the address.
+				 */
+				memcpy(&sin, res->ai_addr, sizeof(sin));
+				ad = inet_ntoa(sin.sin_addr);
+				break;
+			} else if (res->ai_family == AF_INET6) {
+				if (res->ai_addrlen < sizeof(sin6))
+					err(1, "getaddrinfo() returned "
+					    "undersized IPv6 address");
+				/*
+				 * Mips cares about sockaddr_in6 alignment,
+				 * so copy the address.
+				 */
+				memcpy(&sin6, res->ai_addr, sizeof(sin6));
+				ad = inet_ntop(AF_INET6, &sin6.sin6_addr, ip6,
+				    sizeof(ip6));
+				break;
+			}
+		}
+		if (ad == NULL)
+			err(1, "No IP address for %s", cp);
 
 		/* Append this address to dsaddr. */
-		ad = inet_ntoa(sin.sin_addr);
 		adsiz = strlen(ad);
 		if (dsaddrcnt + adsiz + nfsprtsiz + 1 > dsaddrsiz) {
 			dsaddrsiz *= 2;


More information about the svn-src-projects mailing list