Author: gjb
Date: Mon Jul 20 22:17:11 2015
New Revision: 285727
URL: https://svnweb.freebsd.org/changeset/base/285727

Log:
  MFC r285253 (hrs):
   - 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
  Sponsored by: The FreeBSD Foundation

Modified:
  stable/9/etc/inetd.conf
  stable/9/usr.bin/quota/quota.c
Directory Properties:
  stable/9/etc/   (props changed)
  stable/9/usr.bin/   (props changed)

Modified: stable/9/etc/inetd.conf
==============================================================================
--- stable/9/etc/inetd.conf     Mon Jul 20 22:14:55 2015        (r285726)
+++ stable/9/etc/inetd.conf     Mon Jul 20 22:17:11 2015        (r285727)
@@ -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: stable/9/usr.bin/quota/quota.c
==============================================================================
--- stable/9/usr.bin/quota/quota.c      Mon Jul 20 22:14:55 2015        
(r285726)
+++ stable/9/usr.bin/quota/quota.c      Mon Jul 20 22:17:11 2015        
(r285727)
@@ -571,7 +571,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);
@@ -585,33 +585,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:
@@ -644,13 +640,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);
 }
  
@@ -658,26 +653,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;
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to