]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/rquotad/rquota_server.c
Copy dq_dqb into rquota structure more carefully
[nfs-utils.git] / utils / rquotad / rquota_server.c
index e9167ca19692a3bbaf7f374614c74c53d894f654..27a206ce333fbb2e820fc6377a568d687ab41e2b 100644 (file)
@@ -26,6 +26,7 @@
 #include <sys/stat.h>
 #include <sys/param.h>
 #include <sys/quota.h>
+#include <sys/mount.h>
 #include <dirent.h>
 #include <paths.h>
 #include <stdio.h>
 #define MNTTYPE_AUTOFS "autofs"
 #endif
 
+#ifndef BLOCK_SIZE
+#define BLOCK_SIZE 1024
+#endif
+
 /*
  * Global unix authentication credentials.
  */
@@ -70,7 +75,8 @@ getquota_rslt *getquotainfo(int flags, caddr_t *argp, struct svc_req *rqstp)
    struct mntent *mnt;
    char *pathname, *qfpathname;
    int fd, err, id, type;
-   struct stat st;
+   struct stat stm, stn;
+   struct rquota *rquota;
 
    /*
     * First check authentication.
@@ -105,23 +111,23 @@ getquota_rslt *getquotainfo(int flags, caddr_t *argp, struct svc_req *rqstp)
 
    fp = setmntent(MNTTAB, "r");
    while ((mnt = getmntent(fp)) != (struct mntent *)0) {
-      if (strcasecmp (mnt->mnt_dir, pathname))
-         continue;
+      if (stat(mnt->mnt_dir, &stm) == -1)
+         continue;
+
+      if (stat(pathname, &stn) == -1)
+         break;
+      else if (stm.st_dev != stn.st_dev)
+         continue;
 
       if (mnt->mnt_fsname [0] != '/'
          || strcasecmp (mnt->mnt_type, MNTTYPE_NFS) == 0
          || strcasecmp (mnt->mnt_type, MNTTYPE_AUTOFS) == 0
          || strcasecmp (mnt->mnt_type, MNTTYPE_SWAP) == 0
-         || strcasecmp (mnt->mnt_type, MNTTYPE_IGNORE) == 0
-         || stat(pathname, &st) == -1)
+         || strcasecmp (mnt->mnt_type, MNTTYPE_IGNORE) == 0)
          break;
 
-#if 0
-      result.getquota_rslt_u.gqr_rquota.rq_bsize = st.st_blksize;
-#else
-      /* All blocks reported are 512 Bytes blocks. */
-      result.getquota_rslt_u.gqr_rquota.rq_bsize = 512;
-#endif
+      /* All blocks reported are in BLOCK_SIZE. */
+      result.getquota_rslt_u.gqr_rquota.rq_bsize = BLOCK_SIZE;
 
       if (hasquota(mnt, type, &qfpathname)) {
          if ((err = quotactl(QCMD(Q_GETQUOTA, type), mnt->mnt_fsname,
@@ -161,10 +167,18 @@ getquota_rslt *getquotainfo(int flags, caddr_t *argp, struct svc_req *rqstp)
          result.getquota_rslt_u.gqr_rquota.rq_active = (err == 0) ? TRUE : FALSE;
          /*
           * Make a copy of the info into the last part of the remote quota
-          * struct which is exactly the same.
+          * struct might not be exactly the same on all architectures...
           */
-         memcpy((caddr_t *)&result.getquota_rslt_u.gqr_rquota.rq_bhardlimit,
-                (caddr_t *)&dq_dqb, sizeof(struct dqblk));
+
+         rquota = &result.getquota_rslt_u.gqr_rquota;
+         rquota->rq_bhardlimit = dq_dqb.dqb_bhardlimit;
+         rquota->rq_bsoftlimit = dq_dqb.dqb_bsoftlimit;;
+         rquota->rq_curblocks = dq_dqb.dqb_curblocks;
+         rquota->rq_fhardlimit = dq_dqb.dqb_ihardlimit;
+         rquota->rq_fsoftlimit = dq_dqb.dqb_isoftlimit;
+         rquota->rq_curfiles = dq_dqb.dqb_curinodes;
+         rquota->rq_btimeleft = dq_dqb.dqb_btime;
+         rquota->rq_ftimeleft = dq_dqb.dqb_itime;
 
          return(&result);
       }