<div><div class="gmail_quote">On Wed, Oct 13, 2010 at 17:16, Spiro Harvey <span dir="ltr"><<a href="mailto:spiro@knossos.net.nz">spiro@knossos.net.nz</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im">John Kennedy <<a href="mailto:skebi69@gmail.com">skebi69@gmail.com</a>> wrote:<br>
> This also does not tell me how useradd knows that on this system at<br>
> this time the highest UID assigned to a user is 20015.<br>
<br>
</div>From the source's mouth (this is from useradd.c in the shadow-utils package):<br>
<br>
/*<br>
 * find_new_uid - find the next available UID<br>
 *<br>
 *      find_new_uid() locates the next highest unused UID in the password<br>
 *      file, or checks the given user ID against the existing ones for<br>
 *      uniqueness.<br>
 */<br>
static void find_new_uid (void)<br>
{<br>
        const struct passwd *pwd;<br>
        uid_t uid_min, uid_max;<br>
<br>
        uid_min = getdef_unum ("UID_MIN", 1000);<br>
        uid_max = getdef_unum ("UID_MAX", 60000);<br>
<br>
        /*<br>
         * Start with some UID value if the user didn't provide us with<br>
         * one already.<br>
         */<br>
        if (!uflg)<br>
                user_id = uid_min;<br>
<br>
        /*<br>
         * Search the entire password file, either looking for this<br>
         * UID (if the user specified one with -u) or looking for the<br>
         * largest unused value.<br>
         */<br>
#ifdef NO_GETPWENT<br>
        pw_rewind ();<br>
        while ((pwd = pw_next ())) {<br>
#else                           /* using getpwent() we can check against NIS users etc. */<br>
        setpwent ();<br>
        while ((pwd = getpwent ())) {<br>
#endif<br>
                if (strcmp (user_name, pwd->pw_name) == 0) {<br>
                        fprintf (stderr, _("%s: name %s is not unique\n"),<br>
                                 Prog, user_name);<br>
#ifdef WITH_AUDIT<br>
                        audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "adding user",<br>
                                      user_name, user_id, 0);<br>
#endif<br>
                        exit (E_NAME_IN_USE);<br>
                }<br>
                if (uflg && user_id == pwd->pw_uid) {<br>
                        fprintf (stderr, _("%s: UID %u is not unique\n"),<br>
                                 Prog, (unsigned int) user_id);<br>
#ifdef WITH_AUDIT<br>
                        audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "adding user",<br>
                                      user_name, user_id, 0);<br>
#endif<br>
                        exit (E_UID_IN_USE);<br>
                }<br>
                if (!uflg && pwd->pw_uid >= user_id) {<br>
                        if (pwd->pw_uid > uid_max)<br>
                                continue;<br>
                        user_id = pwd->pw_uid + 1;<br>
                }<br>
        }<br>
<br>
        /*<br>
         * If a user with UID equal to UID_MAX exists, the above algorithm<br>
         * will give us UID_MAX+1 even if not unique. Search for the first<br>
         * free UID starting with UID_MIN (it's O(n*n) but can be avoided<br>
         * by not having users with UID equal to UID_MAX).  --marekm<br>
         */<br>
        if (!uflg && user_id == uid_max + 1) {<br>
                for (user_id = uid_min; user_id < uid_max; user_id++) {<br>
#ifdef NO_GETPWENT<br>
                        pw_rewind ();<br>
                        while ((pwd = pw_next ())<br>
                               && pwd->pw_uid != user_id);<br>
                        if (!pwd)<br>
                                break;<br>
#else<br>
                        if (!getpwuid (user_id))<br>
                                break;<br>
#endif<br>
                }<br>
                if (user_id == uid_max) {<br>
                        fprintf (stderr, _("%s: can't get unique UID\n"), Prog);<br>
                        fail_exit (E_UID_IN_USE);<br>
                }<br>
        }<br>
}<br>
<font color="#888888"><br>
<br>
<br>
--<br>
Spiro Harvey                  Knossos Networks Ltd<br>
021-295-1923                  <a href="http://www.knossos.net.nz" target="_blank">www.knossos.net.nz</a><br>
</font><br>_______________________________________________<br>
CentOS mailing list<br>
<a href="mailto:CentOS@centos.org">CentOS@centos.org</a><br>
<a href="http://lists.centos.org/mailman/listinfo/centos" target="_blank">http://lists.centos.org/mailman/listinfo/centos</a><br>
<br></blockquote></div><br>This looks like what I am talking about. Interesting to see that the program literally does what the code above does (as much as I can tell. I am not a coder)<div><br>Thanks Spiro.</div><div>John</div>

<br>-- <br> John Kennedy<br><br>
</div>