* 2 of the License, or (at your option) any later version.
*/
#include "config.h"
+#define _LINUX_QUOTA_VERSION 1
#include <rpc/rpc.h>
#include "rquota.h"
#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.
*/
struct mntent *mnt;
char *pathname, *qfpathname;
int fd, err, id, type;
- struct stat st;
+ struct stat stm, stn;
+ struct rquota *rquota;
/*
* First check authentication.
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,
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);
}