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