Module Name: src Committed By: christos Date: Sun Mar 6 22:34:58 UTC 2011
Modified Files: src/usr.sbin/edquota: Makefile edquota.c Log Message: - KNF - merge code - fix error printing - don't use static buffers To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/edquota/Makefile cvs rdiff -u -r1.30 -r1.31 src/usr.sbin/edquota/edquota.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/edquota/Makefile diff -u src/usr.sbin/edquota/Makefile:1.6 src/usr.sbin/edquota/Makefile:1.7 --- src/usr.sbin/edquota/Makefile:1.6 Sun Mar 6 12:08:42 2011 +++ src/usr.sbin/edquota/Makefile Sun Mar 6 17:34:57 2011 @@ -1,7 +1,9 @@ # from: @(#)Makefile 8.1 (Berkeley) 6/6/93 -# $NetBSD: Makefile,v 1.6 2011/03/06 17:08:42 bouyer Exp $ +# $NetBSD: Makefile,v 1.7 2011/03/06 22:34:57 christos Exp $ .include <bsd.own.mk> + +WARNS ?= 4 PROG= edquota SRCS= edquota.c MAN= edquota.8 @@ -11,7 +13,7 @@ LDADD= -lprop .PATH: ${NETBSDSRCDIR}/usr.bin/quota -SRCS+= getvfsquota.c printquota.c +SRCS+= getvfsquota.c printquota.c quotautil.c .PATH: ${NETBSDSRCDIR}/sys/ufs/ufs SRCS+= quota2_prop.c quota1_subr.c Index: src/usr.sbin/edquota/edquota.c diff -u src/usr.sbin/edquota/edquota.c:1.30 src/usr.sbin/edquota/edquota.c:1.31 --- src/usr.sbin/edquota/edquota.c:1.30 Sun Mar 6 12:08:42 2011 +++ src/usr.sbin/edquota/edquota.c Sun Mar 6 17:34:57 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: edquota.c,v 1.30 2011/03/06 17:08:42 bouyer Exp $ */ +/* $NetBSD: edquota.c,v 1.31 2011/03/06 22:34:57 christos Exp $ */ /* * Copyright (c) 1980, 1990, 1993 * The Regents of the University of California. All rights reserved. @@ -41,7 +41,7 @@ #if 0 static char sccsid[] = "from: @(#)edquota.c 8.3 (Berkeley) 4/27/95"; #else -__RCSID("$NetBSD: edquota.c,v 1.30 2011/03/06 17:08:42 bouyer Exp $"); +__RCSID("$NetBSD: edquota.c,v 1.31 2011/03/06 22:34:57 christos Exp $"); #endif #endif /* not lint */ @@ -73,14 +73,14 @@ #include <string.h> #include <unistd.h> -#include <printquota.h> -#include <getvfsquota.h> +#include "printquota.h" +#include "getvfsquota.h" +#include "quotautil.h" #include "pathnames.h" -const char *qfname = QUOTAFILENAME; -const char *quotagroup = QUOTAGROUP; -char tmpfil[] = _PATH_TMP; +static const char *quotagroup = QUOTAGROUP; +static char tmpfil[] = _PATH_TMP; struct quotause { struct quotause *next; @@ -95,34 +95,27 @@ #define MAX_TMPSTR (100+MAXPATHLEN) -int main(int, char **); -void usage(void); -int getentry(const char *, int); -struct quotause * getprivs(long, int, const char *, int); -struct quotause * getprivs2(long, int, const char *, int); -struct quotause * getprivs1(long, int, const char *); -void putprivs(long, int, struct quotause *); -void putprivs2(long, int, struct quotause *); -void putprivs1(long, int, struct quotause *); -int editit(char *); -int writeprivs(struct quotause *, int, char *, int); -int readprivs(struct quotause *, int); -int writetimes(struct quotause *, int, int); -int readtimes(struct quotause *, int); -void freeq(struct quotause *); -void freeprivs(struct quotause *); -int alldigits(const char *); -int hasquota(struct fstab *, int, char **); +static void usage(void) __attribute__((__noreturn__)); +static int getentry(const char *, int); +static struct quotause * getprivs(long, int, const char *, int); +static struct quotause * getprivs2(long, int, const char *, int); +static struct quotause * getprivs1(long, int, const char *); +static void putprivs(uint32_t, int, struct quotause *); +static void putprivs2(uint32_t, int, struct quotause *); +static void putprivs1(uint32_t, int, struct quotause *); +static int editit(const char *); +static int writeprivs(struct quotause *, int, const char *, int); +static int readprivs(struct quotause *, int); +static void freeq(struct quotause *); +static void freeprivs(struct quotause *); static void clearpriv(int, char **, const char *, int); -int Hflag = 0; -int Dflag = 0; -int dflag = 0; +static int Hflag = 0; +static int Dflag = 0; +static int dflag = 0; int -main(argc, argv) - int argc; - char **argv; +main(int argc, char *argv[]) { struct quotause *qup, *protoprivs, *curprivs; long id, protoid; @@ -187,7 +180,7 @@ if (soft || hard || grace || dflag || cflag) usage(); if ((protoid = getentry(protoname, quotatype)) == -1) - exit(1); + return 1; protoprivs = getprivs(protoid, quotatype, fs, 0); for (qup = protoprivs; qup; qup = qup->next) { qup->q2e.q2e_val[QL_BLOCK].q2v_time = 0; @@ -198,7 +191,7 @@ continue; putprivs(id, quotatype, protoprivs); } - exit(0); + return 0; } if (soft || hard || grace) { struct quotause *lqup; @@ -241,61 +234,65 @@ if (dflag) { curprivs = getprivs(0, quotatype, fs, 1); for (lqup = curprivs; lqup; lqup = lqup->next) { + struct quota2_val *q = lqup->q2e.q2e_val; if (soft) { - lqup->q2e.q2e_val[QL_BLOCK].q2v_softlimit = softb; - lqup->q2e.q2e_val[QL_FILE].q2v_softlimit = softi; + q[QL_BLOCK].q2v_softlimit = softb; + q[QL_FILE].q2v_softlimit = softi; } if (hard) { - lqup->q2e.q2e_val[QL_BLOCK].q2v_hardlimit = hardb; - lqup->q2e.q2e_val[QL_FILE].q2v_hardlimit = hardi; + q[QL_BLOCK].q2v_hardlimit = hardb; + q[QL_FILE].q2v_hardlimit = hardi; } if (grace) { - lqup->q2e.q2e_val[QL_BLOCK].q2v_grace = graceb; - lqup->q2e.q2e_val[QL_FILE].q2v_grace = gracei; + q[QL_BLOCK].q2v_grace = graceb; + q[QL_FILE].q2v_grace = gracei; } } putprivs(0, quotatype, curprivs); freeprivs(curprivs); - exit(0); + return 0; } for ( ; argc > 0; argc--, argv++) { if ((id = getentry(*argv, quotatype)) == -1) continue; curprivs = getprivs(id, quotatype, fs, 0); for (lqup = curprivs; lqup; lqup = lqup->next) { + struct quota2_val *q = lqup->q2e.q2e_val; if (soft) { if (softb && - lqup->q2e.q2e_val[QL_BLOCK].q2v_cur >= softb && - (lqup->q2e.q2e_val[QL_BLOCK].q2v_softlimit == 0 || - lqup->q2e.q2e_val[QL_BLOCK].q2v_cur < lqup->q2e.q2e_val[QL_BLOCK].q2v_softlimit)) - lqup->q2e.q2e_val[QL_BLOCK].q2v_time = 0; + q[QL_BLOCK].q2v_cur >= softb && + (q[QL_BLOCK].q2v_softlimit == 0 || + q[QL_BLOCK].q2v_cur < + q[QL_BLOCK].q2v_softlimit)) + q[QL_BLOCK].q2v_time = 0; if (softi && - lqup->q2e.q2e_val[QL_FILE].q2v_cur >= softb && - (lqup->q2e.q2e_val[QL_FILE].q2v_softlimit == 0 || - lqup->q2e.q2e_val[QL_FILE].q2v_cur < lqup->q2e.q2e_val[QL_FILE].q2v_softlimit)) - lqup->q2e.q2e_val[QL_FILE].q2v_time = 0; - lqup->q2e.q2e_val[QL_BLOCK].q2v_softlimit = softb; - lqup->q2e.q2e_val[QL_FILE].q2v_softlimit = softi; + q[QL_FILE].q2v_cur >= softb && + (q[QL_FILE].q2v_softlimit == 0 || + q[QL_FILE].q2v_cur < + q[QL_FILE].q2v_softlimit)) + q[QL_FILE].q2v_time = 0; + q[QL_BLOCK].q2v_softlimit = softb; + q[QL_FILE].q2v_softlimit = softi; } if (hard) { - lqup->q2e.q2e_val[QL_BLOCK].q2v_hardlimit = hardb; - lqup->q2e.q2e_val[QL_FILE].q2v_hardlimit = hardi; + q[QL_BLOCK].q2v_hardlimit = hardb; + q[QL_FILE].q2v_hardlimit = hardi; } if (grace) { - lqup->q2e.q2e_val[QL_BLOCK].q2v_grace = graceb; - lqup->q2e.q2e_val[QL_FILE].q2v_grace = gracei; + q[QL_BLOCK].q2v_grace = graceb; + q[QL_FILE].q2v_grace = gracei; } } putprivs(id, quotatype, curprivs); freeprivs(curprivs); } - exit(0); + return 0; } if (cflag) { if (dflag) usage(); clearpriv(argc, argv, fs, quotatype); - exit(0); + return 0; } tmpfd = mkstemp(tmpfil); fchown(tmpfd, getuid(), getgid()); @@ -318,21 +315,25 @@ } close(tmpfd); unlink(tmpfil); - exit(0); + return 0; } -void -usage() +static void +usage(void) { + const char *p = getprogname(); fprintf(stderr, - "usage:\n" - " edquota [-D] [-H] [-u] [-p username] [-f filesystem] -d | username ...\n" - " edquota [-D] [-H] -g [-p groupname] [-f filesystem] -d | groupname ...\n" - " edquota [-D] [-u] [-f filesystem] [-s b#/i#] [-h b#/i#] [-t t#/t#] \\\n\t-d | username ...\n" - " edquota [-D] -g [-f filesystem] [-s b#/i#] [-h b#/i#] [-t t#/t#] \\\n\t-d | groupname ...\n" - " edquota [-D] [-H] [-u] -c [-f filesystem] username ...\n" - " edquota [-D] [-H] -g -c [-f filesystem] groupname ...\n" - ); + "Usage: %s [-D] [-H] [-u] [-p <username>] [-f <filesystem>] " + "-d | <username> ...\n" + "\t%s [-D] [-H] -g [-p <groupname>] [-f <filesystem>] " + "-d | <groupname> ...\n" + "\t%s [-D] [-u] [-f <filesystem>] [-s b#/i#] [-h b#/i#] [-t t#/t#] " + "-d | <username> ...\n" + "\t%s [-D] -g [-f <filesystem>] [-s b#/i#] [-h b#/i#] [-t t#/t#] " + "-d | <groupname> ...\n" + "\t%s [-D] [-H] [-u] -c [-f <filesystem>] username ...\n" + "\t%s [-D] [-H] -g -c [-f <filesystem>] groupname ...\n", + p, p, p, p, p, p); exit(1); } @@ -341,25 +342,23 @@ * an identifier. This routine must agree with the kernel routine * getinoquota as to the interpretation of quota types. */ -int -getentry(name, quotatype) - const char *name; - int quotatype; +static int +getentry(const char *name, int quotatype) { struct passwd *pw; struct group *gr; if (alldigits(name)) - return (atoi(name)); + return atoi(name); switch(quotatype) { case USRQUOTA: if ((pw = getpwnam(name)) != NULL) - return (pw->pw_uid); + return pw->pw_uid; warnx("%s: no such user", name); break; case GRPQUOTA: if ((gr = getgrnam(name)) != NULL) - return (gr->gr_gid); + return gr->gr_gid; warnx("%s: no such group", name); break; default: @@ -367,13 +366,13 @@ break; } sleep(1); - return (-1); + return -1; } /* * Collect the requested quota information. */ -struct quotause * +static struct quotause * getprivs(long id, int quotatype, const char *filesys, int defaultq) { struct statvfs *fst; @@ -383,7 +382,7 @@ nfst = getmntinfo(&fst, MNT_WAIT); if (nfst == 0) - errx(2, "no filesystems mounted!"); + errx(1, "no filesystems mounted!"); for (i = 0; i < nfst; i++) { if ((fst[i].f_flag & ST_QUOTA) == 0) @@ -419,14 +418,14 @@ return quphead; } -struct quotause * +static struct quotause * getprivs2(long id, int quotatype, const char *filesys, int defaultq) { struct quotause *qup; int8_t version; - if ((qup = (struct quotause *)malloc(sizeof(*qup))) == NULL) - errx(2, "out of memory"); + if ((qup = malloc(sizeof(*qup))) == NULL) + err(1, "out of memory"); memset(qup, 0, sizeof(*qup)); strcpy(qup->fsname, filesys); if (defaultq) @@ -446,11 +445,11 @@ return qup; } -struct quotause * +static struct quotause * getprivs1(long id, int quotatype, const char *filesys) { struct fstab *fs; - char *qfpathname; + char qfpathname[MAXPATHLEN]; struct quotause *qup; struct dqblk dqblk; int fd; @@ -466,10 +465,10 @@ if (fs == NULL) return NULL; - if (!hasquota(fs, quotatype, &qfpathname)) + if (!hasquota(qfpathname, sizeof(qfpathname), fs, quotatype)) return NULL; - if ((qup = (struct quotause *)malloc(sizeof(*qup))) == NULL) - errx(2, "out of memory"); + if ((qup = malloc(sizeof(*qup))) == NULL) + err(1, "out of memory"); strcpy(qup->fsname, fs->fs_file); if ((fd = open(qfpathname, O_RDONLY)) < 0) { fd = open(qfpathname, O_RDWR|O_CREAT, 0640); @@ -480,9 +479,8 @@ } warnx("Creating quota file %s", qfpathname); sleep(3); - (void) fchown(fd, getuid(), - getentry(quotagroup, GRPQUOTA)); - (void) fchmod(fd, 0640); + (void)fchown(fd, getuid(), getentry(quotagroup, GRPQUOTA)); + (void)fchmod(fd, 0640); } (void)lseek(fd, (off_t)(id * sizeof(struct dqblk)), SEEK_SET); @@ -492,8 +490,7 @@ * Convert implicit 0 quota (EOF) * into an explicit one (zero'ed dqblk) */ - memset((caddr_t)&dqblk, 0, - sizeof(struct dqblk)); + memset(&dqblk, 0, sizeof(struct dqblk)); break; case sizeof(struct dqblk): /* OK */ @@ -509,14 +506,14 @@ qup->qfname = qfpathname; endfsent(); dqblk2q2e(&dqblk, &qup->q2e); - return (qup); + return qup; } /* * Store the requested quota information. */ void -putprivs(long id, int quotatype, struct quotause *quplist) +putprivs(uint32_t id, int quotatype, struct quotause *quplist) { struct quotause *qup; @@ -528,14 +525,13 @@ } } -void -putprivs2(long id, int quotatype, struct quotause *qup) +static void +putprivs2(uint32_t id, int quotatype, struct quotause *qup) { prop_dictionary_t dict, data, cmd; prop_array_t cmds, datas; struct plistref pref; - int error; int8_t error8; qup->q2e.q2e_uid = id; @@ -571,18 +567,16 @@ if (quotactl(qup->fsname, &pref) != 0) err(1, "quotactl"); - if ((error = prop_dictionary_recv_syscall(&pref, &dict)) != 0) { - errx(1, "prop_dictionary_recv_syscall: %s\n", - strerror(error)); + if ((errno = prop_dictionary_recv_syscall(&pref, &dict)) != 0) { + err(1, "prop_dictionary_recv_syscall"); } if (Dflag) printf("reply from kernel:\n%s\n", prop_dictionary_externalize(dict)); - if ((error = quota2_get_cmds(dict, &cmds)) != 0) { - errx(1, "quota2_get_cmds: %s\n", - strerror(error)); + if ((errno = quota2_get_cmds(dict, &cmds)) != 0) { + err(1, "quota2_get_cmds"); } /* only one command, no need to iter */ cmd = prop_array_get(cmds, 0); @@ -593,18 +587,17 @@ err(1, "prop_get(return)"); if (error8) { + errno = error8; if (qup->flags & DEFAULT) - fprintf(stderr, "set default %s quota: %s\n", - qfextension[quotatype], strerror(error8)); + warn("set default %s quota", qfextension[quotatype]); else - fprintf(stderr, "set %s quota for %ld: %s\n", - qfextension[quotatype], id, strerror(error8)); + warn("set %s quota for %u", qfextension[quotatype], id); } prop_object_release(dict); } -void -putprivs1(long id, int quotatype, struct quotause *qup) +static void +putprivs1(uint32_t id, int quotatype, struct quotause *qup) { struct dqblk dqblk; int fd; @@ -628,65 +621,70 @@ /* * Take a list of privileges and get it edited. */ -int -editit(ltmpfile) - char *ltmpfile; +static int +editit(const char *ltmpfile) { - long omask; - int pid, lst; + pid_t pid; + int lst; char p[MAX_TMPSTR]; + const char *ed; + sigset_t s, os; - omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGHUP)); - top: - if ((pid = fork()) < 0) { - + sigemptyset(&s); + sigaddset(&s, SIGINT); + sigaddset(&s, SIGQUIT); + sigaddset(&s, SIGHUP); + if (sigprocmask(SIG_BLOCK, &s, &os) == -1) + err(1, "sigprocmask"); +top: + switch ((pid = fork())) { + case -1: if (errno == EPROCLIM) { warnx("You have too many processes"); - return(0); + return 0; } if (errno == EAGAIN) { sleep(1); goto top; } warn("fork"); - return (0); - } - if (pid == 0) { - const char *ed; - - sigsetmask(omask); + return 0; + case 0: + if (sigprocmask(SIG_SETMASK, &os, NULL) == -1) + err(1, "sigprocmask"); setgid(getgid()); setuid(getuid()); if ((ed = getenv("EDITOR")) == (char *)0) ed = _PATH_VI; if (strlen(ed) + strlen(ltmpfile) + 2 >= MAX_TMPSTR) { - err (1, "%s", "editor or filename too long"); + errx(1, "%s", "editor or filename too long"); } - snprintf (p, MAX_TMPSTR, "%s %s", ed, ltmpfile); + snprintf(p, sizeof(p), "%s %s", ed, ltmpfile); execlp(_PATH_BSHELL, _PATH_BSHELL, "-c", p, NULL); err(1, "%s", ed); + default: + if (waitpid(pid, &lst, 0) == -1) + err(1, "waitpid"); + if (sigprocmask(SIG_SETMASK, &os, NULL) == -1) + err(1, "sigprocmask"); + if (!WIFEXITED(lst) || WEXITSTATUS(lst) != 0) + return 0; + return 1; } - waitpid(pid, &lst, 0); - sigsetmask(omask); - if (!WIFEXITED(lst) || WEXITSTATUS(lst) != 0) - return (0); - return (1); } /* * Convert a quotause list to an ASCII file. */ -int -writeprivs(quplist, outfd, name, quotatype) - struct quotause *quplist; - int outfd; - char *name; - int quotatype; +static int +writeprivs(struct quotause *quplist, int outfd, const char *name, + int quotatype) { struct quotause *qup; FILE *fd; + char b0[32], b1[32], b2[32], b3[32]; - ftruncate(outfd, 0); + (void)ftruncate(outfd, 0); (void)lseek(outfd, (off_t)0, SEEK_SET); if ((fd = fdopen(dup(outfd), "w")) == NULL) errx(1, "fdopen `%s'", tmpfil); @@ -697,17 +695,18 @@ qfextension[quotatype], name); } for (qup = quplist; qup; qup = qup->next) { + struct quota2_val *q = qup->q2e.q2e_val; fprintf(fd, "%s (version %d):\n", qup->fsname, (qup->flags & QUOTA2) ? 2 : 1); if ((qup->flags & DEFAULT) == 0 || (qup->flags & QUOTA2) != 0) { fprintf(fd, "\tblocks in use: %s, " "limits (soft = %s, hard = %s", - intprt(qup->q2e.q2e_val[QL_BLOCK].q2v_cur, - HN_NOSPACE | HN_B, Hflag, 20), - intprt(qup->q2e.q2e_val[QL_BLOCK].q2v_softlimit, - HN_NOSPACE | HN_B, Hflag, 20), - intprt(qup->q2e.q2e_val[QL_BLOCK].q2v_hardlimit, - HN_NOSPACE | HN_B, Hflag, 20)); + intprt(b1, 21, q[QL_BLOCK].q2v_cur, + HN_NOSPACE | HN_B, Hflag), + intprt(b2, 21, q[QL_BLOCK].q2v_softlimit, + HN_NOSPACE | HN_B, Hflag), + intprt(b3, 21, q[QL_BLOCK].q2v_hardlimit, + HN_NOSPACE | HN_B, Hflag)); if (qup->flags & QUOTA2) fprintf(fd, ", "); } else @@ -715,19 +714,18 @@ if (qup->flags & (QUOTA2|DEFAULT)) { fprintf(fd, "grace = %s", - timepprt(qup->q2e.q2e_val[QL_BLOCK].q2v_grace, - Hflag, 20)); + timepprt(b0, 21, q[QL_BLOCK].q2v_grace, Hflag)); } fprintf(fd, ")\n"); if ((qup->flags & DEFAULT) == 0 || (qup->flags & QUOTA2) != 0) { fprintf(fd, "\tinodes in use: %s, " "limits (soft = %s, hard = %s", - intprt(qup->q2e.q2e_val[QL_FILE].q2v_cur, - HN_NOSPACE, Hflag, 20), - intprt(qup->q2e.q2e_val[QL_FILE].q2v_softlimit, - HN_NOSPACE, Hflag, 20), - intprt(qup->q2e.q2e_val[QL_FILE].q2v_hardlimit, - HN_NOSPACE, Hflag, 20)); + intprt(b1, 21, q[QL_FILE].q2v_cur, + HN_NOSPACE, Hflag), + intprt(b2, 21, q[QL_FILE].q2v_softlimit, + HN_NOSPACE, Hflag), + intprt(b3, 21, q[QL_FILE].q2v_hardlimit, + HN_NOSPACE, Hflag)); if (qup->flags & QUOTA2) fprintf(fd, ", "); } else @@ -735,22 +733,19 @@ if (qup->flags & (QUOTA2|DEFAULT)) { fprintf(fd, "grace = %s", - timepprt(qup->q2e.q2e_val[QL_FILE].q2v_grace, - Hflag, 20)); + timepprt(b0, 21, q[QL_FILE].q2v_grace, Hflag)); } fprintf(fd, ")\n"); } fclose(fd); - return (1); + return 1; } /* * Merge changes to an ASCII file into a quotause list. */ -int -readprivs(quplist, infd) - struct quotause *quplist; - int infd; +static int +readprivs(struct quotause *quplist, int infd) { struct quotause *qup; FILE *fd; @@ -767,7 +762,7 @@ fd = fdopen(dup(infd), "r"); if (fd == NULL) { warn("Can't re-read temp file"); - return (0); + return 0; } /* * Discard title line, then read pairs of lines to process. @@ -845,7 +840,8 @@ goto out; } } else { - warnx("%s: %s: bad format cnt %d", fsp, line1, cnt); + warnx("%s: %s: bad format cnt %d", fsp, line1, + cnt); goto out; } /* drop last char which is ',' or ')' */ @@ -917,20 +913,22 @@ } } for (qup = quplist; qup; qup = qup->next) { + struct quota2_val *q = qup->q2e.q2e_val; + char b1[32], b2[32]; if (strcmp(fsp, qup->fsname)) continue; if (version == 1 && dflag) { - qup->q2e.q2e_val[QL_BLOCK].q2v_grace = graceb; - qup->q2e.q2e_val[QL_FILE].q2v_grace = gracei; + q[QL_BLOCK].q2v_grace = graceb; + q[QL_FILE].q2v_grace = gracei; qup->flags |= FOUND; continue; } - if (strcmp(intprt(qup->q2e.q2e_val[QL_BLOCK].q2v_cur, - HN_NOSPACE | HN_B, Hflag, 20), + if (strcmp(intprt(b1, 21, q[QL_BLOCK].q2v_cur, + HN_NOSPACE | HN_B, Hflag), scurb) != 0 || - strcmp(intprt(qup->q2e.q2e_val[QL_FILE].q2v_cur, - HN_NOSPACE, Hflag, 20), + strcmp(intprt(b2, 21, q[QL_FILE].q2v_cur, + HN_NOSPACE, Hflag), scuri) != 0) { warnx("%s: cannot change current allocation", fsp); @@ -942,26 +940,24 @@ * or were under it, but now have a soft limit * and are over it. */ - if (qup->q2e.q2e_val[QL_BLOCK].q2v_cur && - qup->q2e.q2e_val[QL_BLOCK].q2v_cur >= softb && - (qup->q2e.q2e_val[QL_BLOCK].q2v_softlimit == 0 || - qup->q2e.q2e_val[QL_BLOCK].q2v_cur < - qup->q2e.q2e_val[QL_BLOCK].q2v_softlimit)) - qup->q2e.q2e_val[QL_BLOCK].q2v_time = 0; - if (qup->q2e.q2e_val[QL_FILE].q2v_cur && - qup->q2e.q2e_val[QL_FILE].q2v_cur >= softi && - (qup->q2e.q2e_val[QL_FILE].q2v_softlimit == 0 || - qup->q2e.q2e_val[QL_FILE].q2v_cur < - qup->q2e.q2e_val[QL_FILE].q2v_softlimit)) - qup->q2e.q2e_val[QL_FILE].q2v_time = 0; - qup->q2e.q2e_val[QL_BLOCK].q2v_softlimit = softb; - qup->q2e.q2e_val[QL_BLOCK].q2v_hardlimit = hardb; + if (q[QL_BLOCK].q2v_cur && + q[QL_BLOCK].q2v_cur >= softb && + (q[QL_BLOCK].q2v_softlimit == 0 || + q[QL_BLOCK].q2v_cur < q[QL_BLOCK].q2v_softlimit)) + q[QL_BLOCK].q2v_time = 0; + if (q[QL_FILE].q2v_cur && + q[QL_FILE].q2v_cur >= softi && + (q[QL_FILE].q2v_softlimit == 0 || + q[QL_FILE].q2v_cur < q[QL_FILE].q2v_softlimit)) + q[QL_FILE].q2v_time = 0; + q[QL_BLOCK].q2v_softlimit = softb; + q[QL_BLOCK].q2v_hardlimit = hardb; if (version == 2) - qup->q2e.q2e_val[QL_BLOCK].q2v_grace = graceb; - qup->q2e.q2e_val[QL_FILE].q2v_softlimit = softi; - qup->q2e.q2e_val[QL_FILE].q2v_hardlimit = hardi; + q[QL_BLOCK].q2v_grace = graceb; + q[QL_FILE].q2v_softlimit = softi; + q[QL_FILE].q2v_hardlimit = hardi; if (version == 2) - qup->q2e.q2e_val[QL_FILE].q2v_grace = gracei; + q[QL_FILE].q2v_grace = gracei; qup->flags |= FOUND; } } @@ -971,37 +967,36 @@ * Disable quotas for any filesystems that have not been found. */ for (qup = quplist; qup; qup = qup->next) { + struct quota2_val *q = qup->q2e.q2e_val; if (qup->flags & FOUND) { qup->flags &= ~FOUND; continue; } - qup->q2e.q2e_val[QL_BLOCK].q2v_softlimit = UQUAD_MAX; - qup->q2e.q2e_val[QL_BLOCK].q2v_hardlimit = UQUAD_MAX; - qup->q2e.q2e_val[QL_BLOCK].q2v_grace = 0; - qup->q2e.q2e_val[QL_FILE].q2v_softlimit = UQUAD_MAX; - qup->q2e.q2e_val[QL_FILE].q2v_hardlimit = UQUAD_MAX; - qup->q2e.q2e_val[QL_FILE].q2v_grace = 0; + q[QL_BLOCK].q2v_softlimit = UQUAD_MAX; + q[QL_BLOCK].q2v_hardlimit = UQUAD_MAX; + q[QL_BLOCK].q2v_grace = 0; + q[QL_FILE].q2v_softlimit = UQUAD_MAX; + q[QL_FILE].q2v_hardlimit = UQUAD_MAX; + q[QL_FILE].q2v_grace = 0; } - return (1); + return 1; } /* * Free a quotause structure. */ -void +static void freeq(struct quotause *qup) { - if (qup->qfname) - free(qup->qfname); + free(qup->qfname); free(qup); } /* * Free a list of quotause structures. */ -void -freeprivs(quplist) - struct quotause *quplist; +static void +freeprivs(struct quotause *quplist) { struct quotause *qup, *nextqup; @@ -1011,71 +1006,6 @@ } } -/* - * Check whether a string is completely composed of digits. - */ -int -alldigits(s) - const char *s; -{ - int c; - - c = *s++; - do { - if (!isdigit(c)) - return (0); - } while ((c = *s++) != 0); - return (1); -} - -/* - * Check to see if a particular legacy quota is to be enabled in fstab - */ -int -hasquota(fs, type, qfnamep) - struct fstab *fs; - int type; - char **qfnamep; -{ - char *opt; - char *cp; - static char initname, usrname[100], grpname[100]; - char *buf; - - if (!initname) { - sprintf(usrname, "%s%s", qfextension[USRQUOTA], qfname); - sprintf(grpname, "%s%s", qfextension[GRPQUOTA], qfname); - initname = 1; - } - buf = fs->fs_mntops; - cp = NULL; - for (opt = strtok(buf, ","); opt; opt = strtok(NULL, ",")) { - if ((cp = strchr(opt, '=')) != NULL) - *cp++ = '\0'; - if (type == USRQUOTA && strcmp(opt, usrname) == 0) - break; - if (type == GRPQUOTA && strcmp(opt, grpname) == 0) - break; - } - if (!opt) { - *qfnamep = NULL; - return (0); - } - if (cp) { - *qfnamep = malloc(strlen(cp) + 1); - if (*qfnamep == NULL) - err(1, "malloc"); - strcpy(*qfnamep, cp); - return (1); - } - *qfnamep = malloc(BUFSIZ); - if (*qfnamep == NULL) - err(1, "malloc"); - (void) sprintf(*qfnamep, "%s/%s.%s", fs->fs_file, qfname, - qfextension[type]); - return (1); -} - static void clearpriv(int argc, char **argv, const char *filesys, int quotatype) { @@ -1084,7 +1014,7 @@ struct plistref pref; bool ret; struct statvfs *fst; - int nfst, i, error; + int nfst, i; int8_t error8; int id; @@ -1119,7 +1049,7 @@ /* now loop over quota-enabled filesystems */ nfst = getmntinfo(&fst, MNT_WAIT); if (nfst == 0) - errx(2, "no filesystems mounted!"); + errx(1, "no filesystems mounted!"); for (i = 0; i < nfst; i++) { if ((fst[i].f_flag & ST_QUOTA) == 0) @@ -1138,9 +1068,8 @@ if (quotactl(fst[i].f_mntonname, &pref) != 0) err(1, "quotactl"); - if ((error = prop_dictionary_recv_syscall(&pref, &dict)) != 0) { - errx(1, "prop_dictionary_recv_syscall: %s\n", - strerror(error)); + if ((errno = prop_dictionary_recv_syscall(&pref, &dict)) != 0) { + err(1, "prop_dictionary_recv_syscall"); } if (Dflag) { @@ -1148,9 +1077,8 @@ fst[i].f_mntonname, prop_dictionary_externalize(dict)); } - if ((error = quota2_get_cmds(dict, &cmds)) != 0) { - errx(1, "quota2_get_cmds: %s\n", - strerror(error)); + if ((errno = quota2_get_cmds(dict, &cmds)) != 0) { + err(1, "quota2_get_cmds"); } /* only one command, no need to iter */ cmd = prop_array_get(cmds, 0); @@ -1160,9 +1088,9 @@ if (!prop_dictionary_get_int8(cmd, "return", &error8)) err(1, "prop_get(return)"); if (error8) { - fprintf(stderr, "clear %s quota entries on %s: %s\n", - qfextension[quotatype], fst[i].f_mntonname, - strerror(error8)); + errno = error8; + warn("clear %s quota entries on %s", + qfextension[quotatype], fst[i].f_mntonname); } prop_object_release(dict); }