shell: clarify help text of CONFIG_{SH,BASH}_IS_* options
[oweals/busybox.git] / loginutils / addgroup.c
index cb839290d6115a9a836f21fd20b87388090c90ff..6b2fd7ba9b0a91ce7120cbaaff0be3e708d888e1 100644 (file)
@@ -6,18 +6,57 @@
  * Copyright (C) 1999,2000,2001 by John Beppu <beppu@codepoet.org>
  * Copyright (C) 2007 by Tito Ragusa <farmatito@tiscali.it>
  *
- * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  *
  */
+//config:config ADDGROUP
+//config:      bool "addgroup"
+//config:      default y
+//config:      help
+//config:        Utility for creating a new group account.
+//config:
+//config:config FEATURE_ADDGROUP_LONG_OPTIONS
+//config:      bool "Enable long options"
+//config:      default y
+//config:      depends on ADDGROUP && LONG_OPTS
+//config:      help
+//config:        Support long options for the addgroup applet.
+//config:
+//config:config FEATURE_ADDUSER_TO_GROUP
+//config:      bool "Support for adding users to groups"
+//config:      default y
+//config:      depends on ADDGROUP
+//config:      help
+//config:        If  called  with two non-option arguments,
+//config:        addgroup will add an existing user to an
+//config:        existing group.
+
+//applet:IF_ADDGROUP(APPLET(addgroup, BB_DIR_USR_SBIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_ADDGROUP) += addgroup.o
+
+//usage:#define addgroup_trivial_usage
+//usage:       "[-g GID] [-S] " IF_FEATURE_ADDUSER_TO_GROUP("[USER] ") "GROUP"
+//usage:#define addgroup_full_usage "\n\n"
+//usage:       "Add a group" IF_FEATURE_ADDUSER_TO_GROUP(" or add a user to a group") "\n"
+//usage:     "\n       -g GID  Group id"
+//usage:     "\n       -S      Create a system group"
+
 #include "libbb.h"
 
+#if CONFIG_LAST_SYSTEM_ID < CONFIG_FIRST_SYSTEM_ID
+#error Bad LAST_SYSTEM_ID or FIRST_SYSTEM_ID in .config
+#endif
+#if CONFIG_LAST_ID < CONFIG_LAST_SYSTEM_ID
+#error Bad LAST_ID or LAST_SYSTEM_ID in .config
+#endif
+
 #define OPT_GID                       (1 << 0)
 #define OPT_SYSTEM_ACCOUNT            (1 << 1)
 
-/* We assume GID_T_MAX == INT_MAX */
 static void xgroup_study(struct group *g)
 {
-       unsigned max = INT_MAX;
+       unsigned max = CONFIG_LAST_ID;
 
        /* Make sure gr_name is unused */
        if (getgrnam(g->gr_name)) {
@@ -26,15 +65,14 @@ static void xgroup_study(struct group *g)
        }
 
        /* if a specific gid is requested, the --system switch and */
-       /* min and max values are overriden, and the range of valid */
+       /* min and max values are overridden, and the range of valid */
        /* gid values is set to [0, INT_MAX] */
        if (!(option_mask32 & OPT_GID)) {
                if (option_mask32 & OPT_SYSTEM_ACCOUNT) {
-                       g->gr_gid = 100; /* FIRST_SYSTEM_GID */
-                       max = 999;       /* LAST_SYSTEM_GID */
+                       g->gr_gid = CONFIG_FIRST_SYSTEM_ID;
+                       max = CONFIG_LAST_SYSTEM_ID;
                } else {
-                       g->gr_gid = 1000; /* FIRST_GID */
-                       max = 64999;      /* LAST_GID */
+                       g->gr_gid = CONFIG_LAST_SYSTEM_ID + 1;
                }
        }
        /* Check if the desired gid is free
@@ -75,7 +113,22 @@ static void new_group(char *group, gid_t gid)
        if (ENABLE_FEATURE_CLEAN_UP)
                free(p);
 #if ENABLE_FEATURE_SHADOWPASSWDS
-       /* Ignore errors: if file is missing we suppose admin doesn't want it */
+       /* /etc/gshadow fields:
+        * 1. Group name.
+        * 2. Encrypted password.
+        *    If set, non-members of the group can join the group
+        *    by typing the password for that group using the newgrp command.
+        *    If the value is of this field ! then no user is allowed
+        *    to access the group using the newgrp command. A value of !!
+        *    is treated the same as a value of ! only it indicates
+        *    that a password has never been set before. If the value is null,
+        *    only group members can log into the group.
+        * 3. Group administrators (comma delimited list).
+        *    Group members listed here can add or remove group members
+        *    using the gpasswd command.
+        * 4. Group members (comma delimited list).
+        */
+       /* Ignore errors: if file is missing we assume admin doesn't want it */
        update_passwd(bb_path_gshadow_file, group, "!::", NULL);
 #endif
 }
@@ -98,7 +151,7 @@ int addgroup_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int addgroup_main(int argc UNUSED_PARAM, char **argv)
 {
        unsigned opts;
-       unsigned gid = 0;
+       const char *gid = "0";
 
        /* need to be root */
        if (geteuid()) {
@@ -112,7 +165,7 @@ int addgroup_main(int argc UNUSED_PARAM, char **argv)
         *  addgroup -g num group
         *  addgroup user group
         * Check for min, max and missing args */
-       opt_complementary = "-1:?2:g+";
+       opt_complementary = "-1:?2";
        opts = getopt32(argv, "g:S", &gid);
        /* move past the commandline options */
        argv += optind;
@@ -133,7 +186,7 @@ int addgroup_main(int argc UNUSED_PARAM, char **argv)
                gr = xgetgrnam(argv[1]); /* unknown group: exit */
                /* check if user is already in this group */
                for (; *(gr->gr_mem) != NULL; (gr->gr_mem)++) {
-                       if (!strcmp(argv[0], *(gr->gr_mem))) {
+                       if (strcmp(argv[0], *(gr->gr_mem)) == 0) {
                                /* user is already in group: do nothing */
                                return EXIT_SUCCESS;
                        }
@@ -148,8 +201,7 @@ int addgroup_main(int argc UNUSED_PARAM, char **argv)
 #endif /* ENABLE_FEATURE_ADDUSER_TO_GROUP */
        {
                die_if_bad_username(argv[0]);
-               new_group(argv[0], gid);
-
+               new_group(argv[0], xatou_range(gid, 0, CONFIG_LAST_ID));
        }
        /* Reached only on success */
        return EXIT_SUCCESS;