]> granicus.if.org Git - shadow/commitdiff
Allow deleting the group even if it is the primary group of a user
authorJesse W. Hathaway <jesse@mbuki-mvuki.org>
Fri, 12 Jun 2015 22:32:50 +0000 (17:32 -0500)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Tue, 16 Jun 2015 19:18:44 +0000 (14:18 -0500)
This is helpful when using configuration management tools such as
Puppet, where you are managing the groups in a central location and you
don't need this safeguard.

Signed-off-by: "Jesse W. Hathaway" <jesse@mbuki-mvuki.org>
Acked-by: Serge Hallyn <serge.hallyn@ubuntu.com>
src/groupdel.c

index da993475b0158b01f89440b5a9b58ab30ad5f961..d613a66e4fdd85a8ff24a77ae1b825888a67205b 100644 (file)
@@ -60,6 +60,7 @@ const char *Prog;
 
 static char *group_name;
 static gid_t group_id = -1;
+static bool check_group_busy = true;
 
 #ifdef SHADOWGRP
 static bool is_shadow_grp;
@@ -96,6 +97,7 @@ static /*@noreturn@*/void usage (int status)
                        Prog);
        (void) fputs (_("  -h, --help                    display this help message and exit\n"), usageout);
        (void) fputs (_("  -R, --root CHROOT_DIR         directory to chroot into\n"), usageout);
+       (void) fputs (_("  -f, --force                   delete group even if it is the primary group of a user\n"), usageout);
        (void) fputs ("\n", usageout);
        exit (status);
 }
@@ -321,7 +323,7 @@ static void process_flags (int argc, char **argv)
                {NULL, 0, NULL, '\0'}
        };
 
-       while ((c = getopt_long (argc, argv, "hR:",
+       while ((c = getopt_long (argc, argv, "hfR:",
                                 long_options, NULL)) != -1) {
                switch (c) {
                case 'h':
@@ -329,6 +331,9 @@ static void process_flags (int argc, char **argv)
                        /*@notreached@*/break;
                case 'R': /* no-op, handled in process_root_flag () */
                        break;
+               case 'f':
+                       check_group_busy = false;
+                       break;
                default:
                        usage (E_USAGE);
                }
@@ -465,7 +470,9 @@ int main (int argc, char **argv)
        /*
         * Make sure this isn't the primary group of anyone.
         */
-       group_busy (group_id);
+       if (check_group_busy) {
+               group_busy (group_id);
+       }
 
        /*
         * Do the hard stuff - open the files, delete the group entries,