Hi

Here are some small changes to quotaon(8).  If you want I can split
them up, but since they are small I am sending one diff.  Here is
a list of changes roughly in the order they appear in the diff:

 - Constify some function arguments

 - Use __progname instead of separate whoami variable + small KNF
   where the line is touched anyways.

 - Order letters in getopt(3) call

 - Convert a fprintf(3) + perror(3) to warn(3). warn(3) is
   already used in this function for similar purposes.

 - Replace strtok(3) with strsep(3).  Is there a more
   elegant way than my solution? (I took the freedom to collect all
   the char * variables into one line).

 - Set cp to NULL at the end of the while loop scanning the mount
   options.  Otherwise if the last mount option contains a '=' the
   part after it is used as the quota file (of course only if the
   desired userquota/groupquota option isn't found).

 - Use strncmp(3) instead of memcmp(3). Looking at the kernel code
   it seems that it is zero terminated.  The other code nearby uses
   strcmp(3) already.

 - Invert an if condition to prevent an empty body.

Happy to hear feedback, also feel free to only commit parts of it.

Best,

Martin

P.S.: If the prototypes are touched anyways, the names of the
arguments might be removed as well to comply with KNF.  Let me
know if you want that.

Index: quotaon.c
===================================================================
RCS file: /cvs/src/usr.sbin/quotaon/quotaon.c,v
retrieving revision 1.27
diff -u -p -r1.27 quotaon.c
--- quotaon.c   26 Apr 2018 12:42:51 -0000      1.27
+++ quotaon.c   29 Oct 2021 07:46:25 -0000
@@ -44,6 +44,8 @@
 #include <fstab.h>
 #include <unistd.h>
 
+extern char *__progname;
+
 char *qfname = QUOTAFILENAME;
 char *qfextension[] = INITQFNAMES;
 
@@ -52,34 +54,31 @@ int gflag;          /* operate on group quotas *
 int    uflag;          /* operate on user quotas */
 int    vflag;          /* verbose */
 
-void   usage(char *whoami);
-int    hasquota(struct fstab *fs, int type, char **qfnamep, int force);
-int    quotaonoff(struct fstab *fs, int offmode, int type, char *qfpathname);
-int    oneof(char *target, char *list[], int cnt);
-int    readonly(struct fstab *fs);
+void   usage();
+int    hasquota(const struct fstab *fs, int type, char **qfnamep, int force);
+int    quotaonoff(const struct fstab *fs, int offmode, int type, char 
*qfpathname);
+int    oneof(const char *target, char *list[], int cnt);
+int    readonly(const struct fstab *fs);
 
 
 int
 main(int argc, char *argv[])
 {
        struct fstab *fs;
-       char *qfnp, *whoami;
+       char *qfnp;
        long argnum, done = 0;
        int i, offmode = 0, errs = 0;
        extern int optind;
        int ch;
 
-       whoami = strrchr(*argv, '/') + 1;
-       if (whoami == (char *)1)
-               whoami = *argv;
-       if (strcmp(whoami, "quotaoff") == 0)
+       if (strcmp(__progname, "quotaoff") == 0)
                offmode = 1;
-       else if (strcmp(whoami, "quotaon") != 0) {
+       else if (strcmp(__progname, "quotaon") != 0) {
                fprintf(stderr, "Name must be quotaon or quotaoff not %s\n",
-                       whoami);
+                   __progname);
                exit(1);
        }
-       while ((ch = getopt(argc, argv, "avug")) != -1) {
+       while ((ch = getopt(argc, argv, "aguv")) != -1) {
                switch (ch) {
                case 'a':
                        aflag = 1;
@@ -94,13 +93,13 @@ main(int argc, char *argv[])
                        vflag = 1;
                        break;
                default:
-                       usage(whoami);
+                       usage();
                }
        }
        argc -= optind;
        argv += optind;
        if (argc <= 0 && !aflag)
-               usage(whoami);
+               usage();
        if (!gflag && !uflag) {
                gflag = 1;
                uflag = 1;
@@ -142,22 +141,20 @@ main(int argc, char *argv[])
 }
 
 void
-usage(char *whoami)
+usage()
 {
-
-       fprintf(stderr, "usage: %s [-aguv] filesystem ...\n", whoami);
+       fprintf(stderr, "usage: %s [-aguv] filesystem ...\n", __progname);
        exit(1);
 }
 
 int
-quotaonoff(struct fstab *fs, int offmode, int type, char *qfpathname)
+quotaonoff(const struct fstab *fs, int offmode, int type, char *qfpathname)
 {
        if (strcmp(fs->fs_file, "/") && readonly(fs))
                return (1);
        if (offmode) {
                if (quotactl(fs->fs_file, QCMD(Q_QUOTAOFF, type), 0, 0) < 0) {
-                       fprintf(stderr, "quotaoff: ");
-                       perror(fs->fs_file);
+                       warn("%s", fs->fs_file);
                        return (1);
                }
                if (vflag)
@@ -180,7 +177,7 @@ quotaonoff(struct fstab *fs, int offmode
  * Check to see if target appears in list of size cnt.
  */
 int
-oneof(char *target, char *list[], int cnt)
+oneof(const char *target, char *list[], int cnt)
 {
        int i;
 
@@ -194,10 +191,9 @@ oneof(char *target, char *list[], int cn
  * Check to see if a particular quota is to be enabled.
  */
 int
-hasquota(struct fstab *fs, int type, char **qfnamep, int force)
+hasquota(const struct fstab *fs, int type, char **qfnamep, int force)
 {
-       char *opt;
-       char *cp;
+       char *opt, *cp, *pbuf;
        static char initname, usrname[100], grpname[100];
        static char buf[BUFSIZ];
 
@@ -209,13 +205,15 @@ hasquota(struct fstab *fs, int type, cha
                initname = 1;
        }
        strlcpy(buf, fs->fs_mntops, sizeof buf);
-       for (opt = strtok(buf, ","); opt; opt = strtok(NULL, ",")) {
+       pbuf = buf;
+       while ((opt = strsep(&pbuf, ","))) {
                if ((cp = strchr(opt, '=')) != NULL)
                        *cp++ = '\0';
                if (type == USRQUOTA && strcmp(opt, usrname) == 0)
                        break;
                if (type == GRPQUOTA && strcmp(opt, grpname) == 0)
                        break;
+               cp = NULL;
        }
        if (!force && !opt)
                return (0);
@@ -234,17 +232,15 @@ hasquota(struct fstab *fs, int type, cha
  * MFS is special -- it puts "mfs:" in the kernel's mount table
  */
 int
-readonly(struct fstab *fs)
+readonly(const struct fstab *fs)
 {
        struct statfs fsbuf;
 
        if (statfs(fs->fs_file, &fsbuf) < 0 ||
            strcmp(fsbuf.f_mntonname, fs->fs_file) ||
            strcmp(fsbuf.f_mntfromname, fs->fs_spec)) {
-               if (strcmp(fs->fs_file, "mfs") ||
-                   memcmp(fsbuf.f_mntfromname, "mfs:", sizeof("mfs:")-1))
-                       ;
-               else {
+               if (strcmp(fs->fs_file, "mfs") == 0 &&
+                   strncmp(fsbuf.f_mntfromname, "mfs:", 4) == 0) {
                        printf("%s: not mounted\n", fs->fs_file);
                        return (1);
                }

Reply via email to