Module Name: src Committed By: dholland Date: Wed Jan 25 01:24:53 UTC 2012
Modified Files: src/usr.sbin/repquota: repquota.c Log Message: More cleanup of repquota. For now we're going to compile in the number of possible ID and object types, as making those numbers non-constant requires a major rework. This removes all dependence on quotaprop.h except for the code for dumping the quota information as a blob of quota RPC XML packets. That needs to go too and be replaced with a tabular dump format, but one thing at a time. To generate a diff of this commit: cvs rdiff -u -r1.37 -r1.38 src/usr.sbin/repquota/repquota.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.sbin/repquota/repquota.c diff -u src/usr.sbin/repquota/repquota.c:1.37 src/usr.sbin/repquota/repquota.c:1.38 --- src/usr.sbin/repquota/repquota.c:1.37 Mon Jan 9 15:42:37 2012 +++ src/usr.sbin/repquota/repquota.c Wed Jan 25 01:24:53 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: repquota.c,v 1.37 2012/01/09 15:42:37 dholland Exp $ */ +/* $NetBSD: repquota.c,v 1.38 2012/01/25 01:24:53 dholland Exp $ */ /* * Copyright (c) 1980, 1990, 1993 @@ -42,7 +42,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19 #if 0 static char sccsid[] = "@(#)repquota.c 8.2 (Berkeley) 11/22/94"; #else -__RCSID("$NetBSD: repquota.c,v 1.37 2012/01/09 15:42:37 dholland Exp $"); +__RCSID("$NetBSD: repquota.c,v 1.38 2012/01/25 01:24:53 dholland Exp $"); #endif #endif /* not lint */ @@ -70,18 +70,30 @@ __RCSID("$NetBSD: repquota.c,v 1.37 2012 #include "printquota.h" +/* + * XXX. Ideally we shouldn't compile either of these in, but it's a + * nontrivial rework to avoid it and it'll work ok for now. + */ +#define REPQUOTA_NUMIDTYPES 2 +#define REPQUOTA_NUMOBJTYPES 2 + struct fileusage { struct fileusage *fu_next; - struct quotaval fu_qv[QUOTA_NLIMITS]; + struct quotaval fu_qv[REPQUOTA_NUMOBJTYPES]; uint32_t fu_id; char fu_name[1]; /* actually bigger */ }; + #define FUHASH 1024 /* must be power of two */ -static struct fileusage *fuhead[QUOTA_NCLASS][FUHASH]; -static uint32_t highid[QUOTA_NCLASS]; /* highest addid()'ed identifier per class */ -int valid[QUOTA_NCLASS]; -static struct quotaval defaultqv[QUOTA_NCLASS][QUOTA_NLIMITS]; +static struct fileusage *fuhead[REPQUOTA_NUMIDTYPES][FUHASH]; + +/* highest addid()'ed identifier per idtype */ +static uint32_t highid[REPQUOTA_NUMIDTYPES]; + +int valid[REPQUOTA_NUMIDTYPES]; + +static struct quotaval defaultqv[REPQUOTA_NUMIDTYPES][REPQUOTA_NUMOBJTYPES]; static int vflag = 0; /* verbose */ static int aflag = 0; /* all file systems */ @@ -89,6 +101,15 @@ static int Dflag = 0; /* debug */ static int hflag = 0; /* humanize */ static int xflag = 0; /* export */ +/* + * XXX this should go away and be replaced with a call to + * quota_idtype_getname(), but that needs a quotahandle and requires + * the same nontrivial rework as getting rid of REPQUOTA_NUMIDTYPES. + */ +static const char *const repquota_idtype_names[REPQUOTA_NUMIDTYPES] = { + "user", + "group", +}; static struct fileusage *addid(uint32_t, int, const char *); static struct fileusage *lookup(uint32_t, int); @@ -261,10 +282,12 @@ printquotas(int idtype, struct quotahand int i; struct fileusage *fup; struct quotaval *q; - const char *timemsg[QUOTA_NLIMITS]; - char overchar[QUOTA_NLIMITS]; + const char *timemsg[REPQUOTA_NUMOBJTYPES]; + char overchar[REPQUOTA_NUMOBJTYPES]; time_t now; char b0[2][20], b1[20], b2[20], b3[20]; + int ok, objtype; + int isbytes, width; switch (idtype) { case QUOTA_IDTYPE_GROUP: @@ -295,7 +318,7 @@ printquotas(int idtype, struct quotahand printf("\n"); if (vflag) printf("*** Report for %s quotas on %s (%s: %s)\n", - ufs_quota_class_names[idtype], quota_getmountpoint(qh), + repquota_idtype_names[idtype], quota_getmountpoint(qh), quota_getmountdevice(qh), quota_getimplname(qh)); printf(" Block limits " "File limits\n"); @@ -307,7 +330,7 @@ printquotas(int idtype, struct quotahand q = fup->fu_qv; if (fup == 0) continue; - for (i = 0; i < QUOTA_NLIMITS; i++) { + for (i = 0; i < REPQUOTA_NUMOBJTYPES; i++) { switch (QL_STATUS(quota_check_limit(q[i].qv_usage, 1, q[i].qv_softlimit, q[i].qv_hardlimit, q[i].qv_expiretime, now))) { @@ -330,31 +353,43 @@ printquotas(int idtype, struct quotahand } } - if (q[QUOTA_LIMIT_BLOCK].qv_usage == 0 && - q[QUOTA_LIMIT_FILE].qv_usage == 0 && vflag == 0 && - overchar[QUOTA_LIMIT_BLOCK] == '-' && - overchar[QUOTA_LIMIT_FILE] == '-') + ok = 1; + for (objtype = 0; objtype < REPQUOTA_NUMOBJTYPES; objtype++) { + if (q[objtype].qv_usage != 0 || + overchar[objtype] != '-') { + ok = 0; + } + } + if (ok && vflag == 0) continue; if (strlen(fup->fu_name) > 9) printf("%s ", fup->fu_name); else printf("%-10s", fup->fu_name); - printf("%c%c%9s%9s%9s%7s", - overchar[QUOTA_LIMIT_BLOCK], overchar[QUOTA_LIMIT_FILE], - intprt(b1, 10, q[QUOTA_LIMIT_BLOCK].qv_usage, - HN_B, hflag), - intprt(b2, 10, q[QUOTA_LIMIT_BLOCK].qv_softlimit, - HN_B, hflag), - intprt(b3, 10, q[QUOTA_LIMIT_BLOCK].qv_hardlimit, - HN_B, hflag), - timemsg[QUOTA_LIMIT_BLOCK]); - printf(" %8s%8s%8s%7s\n", - intprt(b1, 9, q[QUOTA_LIMIT_FILE].qv_usage, 0, hflag), - intprt(b2, 9, q[QUOTA_LIMIT_FILE].qv_softlimit, - 0, hflag), - intprt(b3, 9, q[QUOTA_LIMIT_FILE].qv_hardlimit, - 0, hflag), - timemsg[QUOTA_LIMIT_FILE]); + for (objtype = 0; objtype < REPQUOTA_NUMOBJTYPES; objtype++) { + printf("%c", overchar[objtype]); + } + for (objtype = 0; objtype < REPQUOTA_NUMOBJTYPES; objtype++) { + isbytes = quota_objtype_isbytes(qh, objtype); + width = isbytes ? 9 : 8; + printf("%*s%*s%*s%7s", + width, + intprt(b1, width+1, q[objtype].qv_usage, + isbytes ? HN_B : 0, hflag), + width, + intprt(b2, width+1, q[objtype].qv_softlimit, + isbytes ? HN_B : 0, hflag), + width, + intprt(b3, width+1, q[objtype].qv_hardlimit, + isbytes ? HN_B : 0, hflag), + timemsg[objtype]); + + if (objtype + 1 < REPQUOTA_NUMOBJTYPES) { + printf(" "); + } else { + printf("\n"); + } + } free(fup); } } @@ -377,7 +412,7 @@ exportquotas(void) } - for (idtype = 0; idtype < QUOTA_NCLASS; idtype++) { + for (idtype = 0; idtype < REPQUOTA_NUMIDTYPES; idtype++) { if (valid[idtype] == 0) continue; datas = prop_array_create(); @@ -511,8 +546,8 @@ addid(uint32_t id, int idtype, const cha /* * XXX nothing guarantees the default limits have been loaded yet */ - fup->fu_qv[QUOTA_LIMIT_BLOCK] = defaultqv[idtype][QUOTA_LIMIT_BLOCK]; - fup->fu_qv[QUOTA_LIMIT_FILE] = defaultqv[idtype][QUOTA_LIMIT_FILE]; + fup->fu_qv[QUOTA_OBJTYPE_BLOCKS] = defaultqv[idtype][QUOTA_OBJTYPE_BLOCKS]; + fup->fu_qv[QUOTA_OBJTYPE_FILES] = defaultqv[idtype][QUOTA_OBJTYPE_FILES]; return fup; }