]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
Use the find_new_uid() and find_new_gid() from the library instead of the
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sun, 3 Feb 2008 16:56:23 +0000 (16:56 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sun, 3 Feb 2008 16:56:23 +0000 (16:56 +0000)
local functions.

ChangeLog
src/groupadd.c
src/useradd.c

index 7256c151416bb82264f5238340f4a5a1b533387b..cc8ceed805256dad6e4e402cd25ae6aad0c1faad 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -20,6 +20,8 @@
        translatable strings.
        * libmisc/Makefile.am: Add libmisc/find_new_ids.c to the sources
        of the libmisc library.
+       * src/useradd.c, src/groupadd.c: Use the find_new_uid() and
+       find_new_gid() from the library instead of the local functions.
 
 2008-02-02  Nicolas François  <nicolas.francois@centraliens.net>
 
index 6402fcea76eb35f40dacf23e42e9b7080efcf628..c7ce0d151ba31952bfcf34f92bd2f41d709dd4a7 100644 (file)
@@ -90,7 +90,6 @@ static void new_grent (struct group *grent);
 static void new_sgent (struct sgrp *sgent);
 #endif
 static void grp_update (void);
-static void find_new_gid (void);
 static void check_new_name (void);
 static void close_files (void);
 static void open_files (void);
@@ -207,55 +206,6 @@ static void grp_update (void)
                group_name, (unsigned int) group_id));
 }
 
-/*
- * find_new_gid - find the next available GID
- *
- *     find_new_gid() locates the next highest unused GID in the group
- *     file.
- */
-static void find_new_gid (void)
-{
-       const struct group *grp;
-       gid_t gid_min, gid_max;
-
-       /*
-        * It doesn't make sense to use find_new_gid(),
-        * if a GID is specified via "-g" option.
-        */
-       assert (!gflg);
-
-       gid_min = getdef_unum ("GID_MIN", 1000);
-       gid_max = getdef_unum ("GID_MAX", 60000);
-
-       /*
-        * Start with the lowest GID.
-        */
-       group_id = gid_min;
-
-       /*
-        * Search the entire group file, looking for the largest unused
-        * value.
-        */
-       setgrent ();
-       while ((grp = getgrent ())) {
-               if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) {
-                       group_id = grp->gr_gid + 1;
-               }
-       }
-       if (group_id == (gid_max + 1)) {
-               for (group_id = gid_min; group_id < gid_max; group_id++) {
-                       /* local, no need for xgetgrgid */
-                       if (!getgrgid (group_id)) {
-                               break;
-                       }
-               }
-               if (group_id == gid_max) {
-                       fprintf (stderr, _("%s: can't get unique GID\n"), Prog);
-                       fail_exit (E_GID_IN_USE);
-               }
-       }
-}
-
 /*
  * check_new_name - check the new name for validity
  *
@@ -606,7 +556,10 @@ int main (int argc, char **argv)
        open_files ();
 
        if (!gflg) {
-               find_new_gid ();
+               if (find_new_gid (0, &group_id, NULL) < 0) {
+                       fprintf (stderr, _("%s: can't create group\n"), Prog);
+                       fail_exit (E_GID_IN_USE);
+               }
        }
 
        grp_update ();
index 45a07d57064cb5aa7afd3017c824fb9bb406ac38..503f4063fe5d670b605969116441bf6a410ac2bb 100644 (file)
@@ -170,8 +170,6 @@ static void new_pwent (struct passwd *);
 static long scale_age (long);
 static void new_spent (struct spwd *);
 static void grp_update (void);
-static void find_new_uid (void);
-static void find_new_gid (void);
 
 static void process_flags (int argc, char **argv);
 static void close_files (void);
@@ -811,105 +809,6 @@ static void grp_update (void)
 #endif                         /* SHADOWGRP */
 }
 
-/*
- * find_new_uid - find the next available UID
- *
- *     find_new_uid() locates the next highest unused UID in the password
- *     file.
- */
-static void find_new_uid (void)
-{
-       const struct passwd *pwd;
-       uid_t uid_min, uid_max;
-
-       /*
-        * It doesn't make sense to use find_new_uid(),
-        * if an UID is specified via "-u" option.
-        */
-       assert (!uflg);
-
-       uid_min = getdef_unum ("UID_MIN", 1000);
-       uid_max = getdef_unum ("UID_MAX", 60000);
-
-       user_id = uid_min;
-
-       /*
-        * Search the entire password file,
-        * looking for the largest unused value.
-        */
-       setpwent ();
-       while ((pwd = getpwent ()) != NULL) {
-               if ((pwd->pw_uid >= user_id) && (pwd->pw_uid <= uid_max)) {
-                       user_id = pwd->pw_uid + 1;
-               }
-       }
-
-       /*
-        * If a user with UID equal to UID_MAX exists, the above algorithm
-        * will give us UID_MAX+1 even if not unique. Search for the first
-        * free UID starting with UID_MIN (it's O(n*n) but can be avoided
-        * by not having users with UID equal to UID_MAX).  --marekm
-        */
-       if (user_id == uid_max + 1) {
-               for (user_id = uid_min; user_id < uid_max; user_id++) {
-                       /* local, no need for xgetpwuid */
-                       if (!getpwuid (user_id))
-                               break;
-               }
-               if (user_id == uid_max) {
-                       fprintf (stderr, _("%s: can't get unique UID (no more available UIDs)\n"), Prog);
-                       fail_exit (E_UID_IN_USE);
-               }
-       }
-}
-
-/*
- * find_new_gid - find the next available GID
- *
- *     find_new_gid() locates the next highest unused GID in the group
- *     file
- */
-static void find_new_gid (void)
-{
-       const struct group *grp;
-       gid_t gid_min, gid_max;
-
-       /*
-        * It doesn't make sense to use find_new_gid(),
-        * if a group is specified via "-g" option.
-        */
-       assert (!gflg);
-
-       gid_min = getdef_num ("GID_MIN", 500);
-       gid_max = getdef_num ("GID_MAX", 60000);
-
-       user_gid = gid_min;
-
-       /*
-        * Search the entire group file,
-        * looking for the largest unused value.
-        */
-       setgrent ();
-       while ((grp = getgrent ())) {
-               if ((grp->gr_gid >= user_gid) && (grp->gr_gid <= gid_max)) {
-                       user_gid = grp->gr_gid + 1;
-               }
-       }
-       if (user_gid == gid_max + 1) {
-               for (user_gid = gid_min; user_gid < gid_max; user_gid++) {
-                       /* local, no need for xgetgrgid */
-                       if (!getgrgid (user_gid))
-                               break;
-               }
-               if (user_gid == gid_max) {
-                       fprintf (stderr,
-                                _("%s: can't get unique GID (no more available GIDs)\n"),
-                                Prog);
-                       fail_exit (4);
-               }
-       }
-}
-
 /*
  * process_flags - perform command line argument setting
  *
@@ -1699,9 +1598,12 @@ int main (int argc, char **argv)
                /* first, seek for a valid uid to use for this user.
                 * We do this because later we can use the uid we found as
                 * gid too ... --gafton */
-               if (!uflg)
-                       find_new_uid ();
-               else {
+               if (!uflg) {
+                       if (find_new_uid (0, &user_id, NULL) < 0) {
+                               fprintf (stderr, _("%s: can't create user\n"), Prog);
+                               fail_exit (E_UID_IN_USE);
+                       }
+               } else {
                        if (getpwuid (user_id) != NULL) {
                                fprintf (stderr, _("%s: UID %u is not unique\n"), Prog, (unsigned int) user_id);
 #ifdef WITH_AUDIT
@@ -1715,7 +1617,12 @@ int main (int argc, char **argv)
        /* do we have to add a group for that user? This is why we need to
         * open the group files in the open_files() function  --gafton */
        if (!(nflg || gflg)) {
-               find_new_gid ();
+               if (find_new_gid (0, &user_gid, &user_id) < 0) {
+                       fprintf (stderr,
+                                _("%s: can't create group\n"),
+                                Prog);
+                       fail_exit (4);
+               }
                grp_add ();
        }