Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Jul 2015 20:15:09 +0000 (UTC)
From:      Hiroki Sato <hrs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285253 - in head: etc usr.bin/quota
Message-ID:  <201507072015.t67KFAh7090560@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hrs
Date: Tue Jul  7 20:15:09 2015
New Revision: 285253
URL: https://svnweb.freebsd.org/changeset/base/285253

Log:
  - Add IPv6 support in quota(1).  While rpc.rquotad has supported PF_INET6
    for a long time, quota(1) utility supported only PF_INET.
  
  - Clean up confusing changes in f_mntfromname.
  
  - Add an entry for rquotad with rpc/udp6 to inetd.conf.
  
  PR:	194084

Modified:
  head/etc/inetd.conf
  head/usr.bin/quota/quota.c

Modified: head/etc/inetd.conf
==============================================================================
--- head/etc/inetd.conf	Tue Jul  7 19:29:18 2015	(r285252)
+++ head/etc/inetd.conf	Tue Jul  7 20:15:09 2015	(r285253)
@@ -68,6 +68,7 @@
 #walld/1	dgram rpc/udp wait root	/usr/libexec/rpc.rwalld	 rpc.rwalld
 #pcnfsd/1-2	dgram rpc/udp wait root	/usr/local/libexec/rpc.pcnfsd	 rpc.pcnfsd
 #rquotad/1	dgram rpc/udp wait root	/usr/libexec/rpc.rquotad rpc.rquotad
+#rquotad/1	dgram rpc/udp6 wait root	/usr/libexec/rpc.rquotad rpc.rquotad
 #sprayd/1	dgram rpc/udp wait root	/usr/libexec/rpc.sprayd	 rpc.sprayd
 #
 # example entry for the optional pop3 server

Modified: head/usr.bin/quota/quota.c
==============================================================================
--- head/usr.bin/quota/quota.c	Tue Jul  7 19:29:18 2015	(r285252)
+++ head/usr.bin/quota/quota.c	Tue Jul  7 20:15:09 2015	(r285253)
@@ -570,7 +570,7 @@ getnfsquota(struct statfs *fst, struct q
 	struct getquota_rslt gq_rslt;
 	struct dqblk *dqp = &qup->dqblk;
 	struct timeval tv;
-	char *cp;
+	char *cp, host[NI_MAXHOST];
 
 	if (fst->f_flags & MNT_LOCAL)
 		return (0);
@@ -584,33 +584,29 @@ getnfsquota(struct statfs *fst, struct q
 	/*
 	 * must be some form of "hostname:/path"
 	 */
-	cp = strchr(fst->f_mntfromname, ':');
+	cp = fst->f_mntfromname;
+	do {
+		cp = strrchr(cp, ':');
+	} while (cp != NULL && *(cp + 1) != '/');
 	if (cp == NULL) {
 		warnx("cannot find hostname for %s", fst->f_mntfromname);
 		return (0);
 	}
+	memset(host, 0, sizeof(host));
+	memcpy(host, fst->f_mntfromname, cp - fst->f_mntfromname);
+	host[sizeof(host) - 1] = '\0';
  
-	*cp = '\0';
-	if (*(cp+1) != '/') {
-		*cp = ':';
-		return (0);
-	}
-
 	/* Avoid attempting the RPC for special amd(8) filesystems. */
 	if (strncmp(fst->f_mntfromname, "pid", 3) == 0 &&
-	    strchr(fst->f_mntfromname, '@') != NULL) {
-		*cp = ':';
+	    strchr(fst->f_mntfromname, '@') != NULL)
 		return (0);
-	}
 
 	gq_args.gqa_pathp = cp + 1;
 	gq_args.gqa_uid = id;
-	if (callaurpc(fst->f_mntfromname, RQUOTAPROG, RQUOTAVERS,
+	if (callaurpc(host, RQUOTAPROG, RQUOTAVERS,
 	    RQUOTAPROC_GETQUOTA, (xdrproc_t)xdr_getquota_args, (char *)&gq_args,
-	    (xdrproc_t)xdr_getquota_rslt, (char *)&gq_rslt) != 0) {
-		*cp = ':';
+	    (xdrproc_t)xdr_getquota_rslt, (char *)&gq_rslt) != 0)
 		return (0);
-	}
 
 	switch (gq_rslt.status) {
 	case Q_NOQUOTA:
@@ -643,13 +639,12 @@ getnfsquota(struct statfs *fst, struct q
 		    tv.tv_sec + gq_rslt.getquota_rslt_u.gqr_rquota.rq_btimeleft;
 		dqp->dqb_itime =
 		    tv.tv_sec + gq_rslt.getquota_rslt_u.gqr_rquota.rq_ftimeleft;
-		*cp = ':';
 		return (1);
 	default:
 		warnx("bad rpc result, host: %s", fst->f_mntfromname);
 		break;
 	}
-	*cp = ':';
+
 	return (0);
 }
  
@@ -657,26 +652,17 @@ static int
 callaurpc(char *host, int prognum, int versnum, int procnum,
     xdrproc_t inproc, char *in, xdrproc_t outproc, char *out)
 {
-	struct sockaddr_in server_addr;
 	enum clnt_stat clnt_stat;
-	struct hostent *hp;
 	struct timeval timeout, tottimeout;
  
 	CLIENT *client = NULL;
-	int sock = RPC_ANYSOCK;
- 
-	if ((hp = gethostbyname(host)) == NULL)
-		return ((int) RPC_UNKNOWNHOST);
+
+ 	client = clnt_create(host, prognum, versnum, "udp");
+	if (client == NULL)
+		return ((int)rpc_createerr.cf_stat);
 	timeout.tv_usec = 0;
 	timeout.tv_sec = 6;
-	bcopy(hp->h_addr, &server_addr.sin_addr,
-			MIN(hp->h_length,(int)sizeof(server_addr.sin_addr)));
-	server_addr.sin_family = AF_INET;
-	server_addr.sin_port =  0;
-
-	if ((client = clntudp_create(&server_addr, prognum,
-	    versnum, timeout, &sock)) == NULL)
-		return ((int) rpc_createerr.cf_stat);
+	CLNT_CONTROL(client, CLSET_RETRY_TIMEOUT, (char *)(void *)&timeout);
 
 	client->cl_auth = authunix_create_default();
 	tottimeout.tv_sec = 25;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507072015.t67KFAh7090560>