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);
}