static int getnfsquota(char *hostp, char *path, uid_t uid, struct dqblk *dqp) { struct getquota_args gq_args; struct getquota_rslt gq_rslt; struct rquota *rquota; extern char *strchr(); gq_args.gqa_pathp = path; gq_args.gqa_uid = uid; if (callaurpc(hostp, RQUOTAPROG, RQUOTAVERS, (vflag? RQUOTAPROC_GETQUOTA: RQUOTAPROC_GETACTIVEQUOTA), xdr_getquota_args, &gq_args, xdr_getquota_rslt, &gq_rslt) != 0) { return (0); } switch (gq_rslt.status) { case Q_OK: { struct timeval tv; u_longlong_t limit; rquota = &gq_rslt.getquota_rslt_u.gqr_rquota; if (!vflag && rquota->rq_active == FALSE) return (0); gettimeofday(&tv, NULL); limit = (u_longlong_t)(rquota->rq_bhardlimit) * rquota->rq_bsize / DEV_BSIZE; dqp->dqb_bhardlimit = limit; limit = (u_longlong_t)(rquota->rq_bsoftlimit) * rquota->rq_bsize / DEV_BSIZE; dqp->dqb_bsoftlimit = limit; limit = (u_longlong_t)(rquota->rq_curblocks) * rquota->rq_bsize / DEV_BSIZE; dqp->dqb_curblocks = limit; dqp->dqb_fhardlimit = rquota->rq_fhardlimit; dqp->dqb_fsoftlimit = rquota->rq_fsoftlimit; dqp->dqb_curfiles = rquota->rq_curfiles; dqp->dqb_btimelimit = tv.tv_sec + rquota->rq_btimeleft; dqp->dqb_ftimelimit = tv.tv_sec + rquota->rq_ftimeleft; return (1); } case Q_NOQUOTA: break; case Q_EPERM: fprintf(stderr, "quota permission error, host: %s\n", hostp); break; default: fprintf(stderr, "bad rpc result, host: %s\n", hostp); break; } return (0); }
static int getnfsquota(struct statfs *fst, struct quotause *qup, long id, int quotatype) { struct ext_getquota_args gq_args; struct getquota_args old_gq_args; struct getquota_rslt gq_rslt; struct dqblk *dqp = &qup->dqblk; struct timeval tv; char *cp, host[NI_MAXHOST]; enum clnt_stat call_stat; if (fst->f_flags & MNT_LOCAL) return (0); /* * must be some form of "hostname:/path" */ 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'; /* Avoid attempting the RPC for special amd(8) filesystems. */ if (strncmp(fst->f_mntfromname, "pid", 3) == 0 && strchr(fst->f_mntfromname, '@') != NULL) return (0); gq_args.gqa_pathp = cp + 1; gq_args.gqa_id = id; gq_args.gqa_type = quotatype; call_stat = callaurpc(host, RQUOTAPROG, EXT_RQUOTAVERS, RQUOTAPROC_GETQUOTA, (xdrproc_t)xdr_ext_getquota_args, (char *)&gq_args, (xdrproc_t)xdr_getquota_rslt, (char *)&gq_rslt); if (call_stat == RPC_PROGVERSMISMATCH) { if (quotatype == USRQUOTA) { old_gq_args.gqa_pathp = cp + 1; old_gq_args.gqa_uid = id; call_stat = callaurpc(host, RQUOTAPROG, RQUOTAVERS, RQUOTAPROC_GETQUOTA, (xdrproc_t)xdr_getquota_args, (char *)&old_gq_args, (xdrproc_t)xdr_getquota_rslt, (char *)&gq_rslt); } else { /* Old rpc quota does not support group type */ return (0); } } if (call_stat != 0) return (call_stat); switch (gq_rslt.status) { case Q_NOQUOTA: break; case Q_EPERM: warnx("quota permission error, host: %s", fst->f_mntfromname); break; case Q_OK: gettimeofday(&tv, NULL); /* blocks*/ dqp->dqb_bhardlimit = ((uint64_t)gq_rslt.getquota_rslt_u.gqr_rquota.rq_bhardlimit * gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize) / DEV_BSIZE; dqp->dqb_bsoftlimit = ((uint64_t)gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsoftlimit * gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize) / DEV_BSIZE; dqp->dqb_curblocks = ((uint64_t)gq_rslt.getquota_rslt_u.gqr_rquota.rq_curblocks * gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize) / DEV_BSIZE; /* inodes */ dqp->dqb_ihardlimit = gq_rslt.getquota_rslt_u.gqr_rquota.rq_fhardlimit; dqp->dqb_isoftlimit = gq_rslt.getquota_rslt_u.gqr_rquota.rq_fsoftlimit; dqp->dqb_curinodes = gq_rslt.getquota_rslt_u.gqr_rquota.rq_curfiles; /* grace times */ dqp->dqb_btime = 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; return (1); default: warnx("bad rpc result, host: %s", fst->f_mntfromname); break; } return (0); }
static int getnfsquota(struct statfs *fst, struct quotause *qup, long id, int quotatype) { struct getquota_args gq_args; struct getquota_rslt gq_rslt; struct ufs_dqblk *dqp = &qup->dqblk; struct timeval tv; char *cp; if (fst->f_flags & MNT_LOCAL) return (0); /* * rpc.rquotad does not support group quotas */ if (quotatype != USRQUOTA) return (0); /* * must be some form of "hostname:/path" */ cp = strchr(fst->f_mntfromname, ':'); if (cp == NULL) { warnx("cannot find hostname for %s", fst->f_mntfromname); return (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 = ':'; return (0); } gq_args.gqa_pathp = cp + 1; gq_args.gqa_uid = id; if (callaurpc(fst->f_mntfromname, RQUOTAPROG, RQUOTAVERS, RQUOTAPROC_GETQUOTA, (xdrproc_t)xdr_getquota_args, (char *)&gq_args, (xdrproc_t)xdr_getquota_rslt, (char *)&gq_rslt) != 0) { *cp = ':'; return (0); } switch (gq_rslt.status) { case Q_NOQUOTA: break; case Q_EPERM: warnx("quota permission error, host: %s", fst->f_mntfromname); break; case Q_OK: gettimeofday(&tv, NULL); /* blocks*/ dqp->dqb_bhardlimit = gq_rslt.getquota_rslt_u.gqr_rquota.rq_bhardlimit * gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE; dqp->dqb_bsoftlimit = gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsoftlimit * gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE; dqp->dqb_curblocks = gq_rslt.getquota_rslt_u.gqr_rquota.rq_curblocks * gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE; /* inodes */ dqp->dqb_ihardlimit = gq_rslt.getquota_rslt_u.gqr_rquota.rq_fhardlimit; dqp->dqb_isoftlimit = gq_rslt.getquota_rslt_u.gqr_rquota.rq_fsoftlimit; dqp->dqb_curinodes = gq_rslt.getquota_rslt_u.gqr_rquota.rq_curfiles; /* grace times */ dqp->dqb_btime = 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); }