]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_quota: refactor code to generate id from name
authorEric Sandeen <sandeen@redhat.com>
Tue, 26 May 2020 18:36:04 +0000 (14:36 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Tue, 26 May 2020 18:36:04 +0000 (14:36 -0400)
There's boilerplate for setting limits and warnings, where we have
a case statement for each of the 3 quota types, and from there call
3 different functions to configure each of the 3 types, each of which
calls its own version of id to string function...

Refactor this so that the main function can call a generic id to string
conversion routine, and then call a common action.  This save a lot of
LOC.

I was looking at allowing xfs to bump out individual grace periods like
setquota can do, and this refactoring allows us to add new actions like
that without copying all the boilerplate again.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
quota/edit.c

index f9938b8acbe0a3dc13f71b116bc71c88af073d19..c40985e28b54f32079a8c1ef51821fc1714760bd 100644 (file)
@@ -101,6 +101,40 @@ warn_help(void)
 "\n"));
 }
 
+static uint32_t
+id_from_string(
+       char    *name,
+       int     type)
+{
+       uint32_t        id = -1;
+       const char      *type_name = "unknown type";
+
+       switch (type) {
+       case XFS_USER_QUOTA:
+               type_name = "user";
+               id = uid_from_string(name);
+               break;
+       case XFS_GROUP_QUOTA:
+               type_name = "group";
+               id = gid_from_string(name);
+               break;
+       case XFS_PROJ_QUOTA:
+               type_name = "project";
+               id = prid_from_string(name);
+               break;
+       default:
+               ASSERT(0);
+               break;
+       }
+
+       if (id == -1) {
+               fprintf(stderr, _("%s: invalid %s name: %s\n"),
+                       type_name, progname, name);
+               exitcode = 1;
+       }
+       return id;
+}
+
 static void
 set_limits(
        uint32_t        id,
@@ -135,75 +169,6 @@ set_limits(
        }
 }
 
-static void
-set_user_limits(
-       char            *name,
-       uint            type,
-       uint            mask,
-       uint64_t        *bsoft,
-       uint64_t        *bhard,
-       uint64_t        *isoft,
-       uint64_t        *ihard,
-       uint64_t        *rtbsoft,
-       uint64_t        *rtbhard)
-{
-       uid_t           uid = uid_from_string(name);
-
-       if (uid == -1) {
-               exitcode = 1;
-               fprintf(stderr, _("%s: invalid user name: %s\n"),
-                               progname, name);
-       } else
-               set_limits(uid, type, mask, fs_path->fs_name,
-                               bsoft, bhard, isoft, ihard, rtbsoft, rtbhard);
-}
-
-static void
-set_group_limits(
-       char            *name,
-       uint            type,
-       uint            mask,
-       uint64_t        *bsoft,
-       uint64_t        *bhard,
-       uint64_t        *isoft,
-       uint64_t        *ihard,
-       uint64_t        *rtbsoft,
-       uint64_t        *rtbhard)
-{
-       gid_t           gid = gid_from_string(name);
-
-       if (gid == -1) {
-               exitcode = 1;
-               fprintf(stderr, _("%s: invalid group name: %s\n"),
-                               progname, name);
-       } else
-               set_limits(gid, type, mask, fs_path->fs_name,
-                               bsoft, bhard, isoft, ihard, rtbsoft, rtbhard);
-}
-
-static void
-set_project_limits(
-       char            *name,
-       uint            type,
-       uint            mask,
-       uint64_t        *bsoft,
-       uint64_t        *bhard,
-       uint64_t        *isoft,
-       uint64_t        *ihard,
-       uint64_t        *rtbsoft,
-       uint64_t        *rtbhard)
-{
-       prid_t          prid = prid_from_string(name);
-
-       if (prid == -1) {
-               exitcode = 1;
-               fprintf(stderr, _("%s: invalid project name: %s\n"),
-                               progname, name);
-       } else
-               set_limits(prid, type, mask, fs_path->fs_name,
-                               bsoft, bhard, isoft, ihard, rtbsoft, rtbhard);
-}
-
 /* extract number of blocks from an ascii string */
 static int
 extractb(
@@ -258,6 +223,7 @@ limit_f(
        char            **argv)
 {
        char            *name;
+       uint32_t        id;
        uint64_t        bsoft, bhard, isoft, ihard, rtbsoft, rtbhard;
        int             c, type = 0, mask = 0, flags = 0;
        uint            bsize, ssize, endoptions;
@@ -339,20 +305,13 @@ limit_f(
                return command_usage(&limit_cmd);
        }
 
-       switch (type) {
-       case XFS_USER_QUOTA:
-               set_user_limits(name, type, mask,
-                       &bsoft, &bhard, &isoft, &ihard, &rtbsoft, &rtbhard);
-               break;
-       case XFS_GROUP_QUOTA:
-               set_group_limits(name, type, mask,
-                       &bsoft, &bhard, &isoft, &ihard, &rtbsoft, &rtbhard);
-               break;
-       case XFS_PROJ_QUOTA:
-               set_project_limits(name, type, mask,
-                       &bsoft, &bhard, &isoft, &ihard, &rtbsoft, &rtbhard);
-               break;
-       }
+
+       id = id_from_string(name, type);
+       if (id >= 0)
+               set_limits(id, type, mask, fs_path->fs_name,
+                          &bsoft, &bhard, &isoft, &ihard, &rtbsoft, &rtbhard);
+       else
+               exitcode = -1;
        return 0;
 }
 
@@ -561,63 +520,13 @@ set_warnings(
        }
 }
 
-static void
-set_user_warnings(
-       char            *name,
-       uint            type,
-       uint            mask,
-       uint            value)
-{
-       uid_t           uid = uid_from_string(name);
-
-       if (uid == -1) {
-               exitcode = 1;
-               fprintf(stderr, _("%s: invalid user name: %s\n"),
-                               progname, name);
-       } else
-               set_warnings(uid, type, mask, fs_path->fs_name, value);
-}
-
-static void
-set_group_warnings(
-       char            *name,
-       uint            type,
-       uint            mask,
-       uint            value)
-{
-       gid_t           gid = gid_from_string(name);
-
-       if (gid == -1) {
-               exitcode = 1;
-               fprintf(stderr, _("%s: invalid group name: %s\n"),
-                               progname, name);
-       } else
-               set_warnings(gid, type, mask, fs_path->fs_name, value);
-}
-
-static void
-set_project_warnings(
-       char            *name,
-       uint            type,
-       uint            mask,
-       uint            value)
-{
-       prid_t          prid = prid_from_string(name);
-
-       if (prid == -1) {
-               exitcode = 1;
-               fprintf(stderr, _("%s: invalid project name: %s\n"),
-                               progname, name);
-       } else
-               set_warnings(prid, type, mask, fs_path->fs_name, value);
-}
-
 static int
 warn_f(
        int             argc,
        char            **argv)
 {
        char            *name;
+       uint32_t        id;
        uint            value;
        int             c, flags = 0, type = 0, mask = 0;
 
@@ -675,17 +584,12 @@ warn_f(
                return command_usage(&warn_cmd);
        }
 
-       switch (type) {
-       case XFS_USER_QUOTA:
-               set_user_warnings(name, type, mask, value);
-               break;
-       case XFS_GROUP_QUOTA:
-               set_group_warnings(name, type, mask, value);
-               break;
-       case XFS_PROJ_QUOTA:
-               set_project_warnings(name, type, mask, value);
-               break;
-       }
+       id = id_from_string(name, type);
+       if (id >= 0)
+               set_warnings(id, type, mask, fs_path->fs_name, value);
+       else
+               exitcode = -1;
+
        return 0;
 }