* NEWS, libmisc/find_new_gid.c, libmisc/find_new_uid.c: Do not use

getpwent / getgrent for system accounts. Trying the low-IDs with
	getpwuid / getgrgid should be more efficient on LDAP configured
	systems with many accounts.
This commit is contained in:
nekral-guest 2009-07-17 22:54:23 +00:00
parent f7257fafe1
commit b0bcb01888
4 changed files with 55 additions and 17 deletions

View File

@ -1,3 +1,10 @@
2009-07-18 Peter Vrabec <pvrabec@redhat.com>
* NEWS, libmisc/find_new_gid.c, libmisc/find_new_uid.c: Do not use
getpwent / getgrent for system accounts. Trying the low-IDs with
getpwuid / getgrgid should be more efficient on LDAP configured
systems with many accounts.
2009-07-05 Piarres Beobide <pi+debian@beobide.net> 2009-07-05 Piarres Beobide <pi+debian@beobide.net>
* po/eu.po: Updated Basque translation. * po/eu.po: Updated Basque translation.

4
NEWS
View File

@ -5,6 +5,10 @@ shadow-4.1.4.1 -> shadow-4.1.4.2 UNRELEASED
- general - general
* Improved support for large groups (impacts most tools). * Improved support for large groups (impacts most tools).
- addition of system users or groups
* Speed improvement. This should be noticeable in case of LDAP configured
systems. This should impact useradd, groupadd, and newusers
- su - su
* Preserve the DISPLAY and XAUTHORITY environment variables. This was * Preserve the DISPLAY and XAUTHORITY environment variables. This was
only the case in the non PAM enabled versions. only the case in the non PAM enabled versions.

View File

@ -90,17 +90,31 @@ int find_new_gid (bool sys_group,
* but we also check the local database (gr_rewind/gr_next) in case * but we also check the local database (gr_rewind/gr_next) in case
* some groups were created but the changes were not committed yet. * some groups were created but the changes were not committed yet.
*/ */
setgrent (); if (sys_group ) {
while ((grp = getgrent ()) != NULL) { /* setgrent / getgrent / endgrent can be very slow with
if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) { * LDAP configurations (and many accounts).
group_id = grp->gr_gid + 1; * Since there is a limited amount of IDs to be tested
* for system accounts, we just check the existence
* of IDs with getgrgid.
*/
for (group_id = gid_min; group_id <= gid_max; group_id++) {
if (getgrgid (group_id) != NULL) {
used_gids[grp->gr_gid] = true;
}
} }
/* create index of used GIDs */ } else {
if (grp->gr_gid <= gid_max) { setgrent ();
used_gids[grp->gr_gid] = true; while ((grp = getgrent ()) != NULL) {
if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) {
group_id = grp->gr_gid + 1;
}
/* create index of used GIDs */
if (grp->gr_gid <= gid_max) {
used_gids[grp->gr_gid] = true;
}
} }
endgrent ();
} }
endgrent ();
gr_rewind (); gr_rewind ();
while ((grp = gr_next ()) != NULL) { while ((grp = gr_next ()) != NULL) {
if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) { if ((grp->gr_gid >= group_id) && (grp->gr_gid <= gid_max)) {

View File

@ -80,7 +80,6 @@ int find_new_uid (bool sys_user,
return 0; return 0;
} }
user_id = uid_min; user_id = uid_min;
/* /*
@ -91,17 +90,31 @@ int find_new_uid (bool sys_user,
* but we also check the local database (pw_rewind/pw_next) in case * but we also check the local database (pw_rewind/pw_next) in case
* some users were created but the changes were not committed yet. * some users were created but the changes were not committed yet.
*/ */
setpwent (); if (sys_user) {
while ((pwd = getpwent ()) != NULL) { /* setpwent / getpwent / endpwent can be very slow with
if ((pwd->pw_uid >= user_id) && (pwd->pw_uid <= uid_max)) { * LDAP configurations (and many accounts).
user_id = pwd->pw_uid + 1; * Since there is a limited amount of IDs to be tested
* for system accounts, we just check the existence
* of IDs with getpwuid.
*/
for (user_id = uid_min; user_id <= uid_max; user_id++) {
if (getpwuid (user_id) != NULL) {
used_uids[user_id] = true;
}
} }
/* create index of used UIDs */ } else {
if (pwd->pw_uid <= uid_max) { setpwent ();
used_uids[pwd->pw_uid] = true; while ((pwd = getpwent ()) != NULL) {
if ((pwd->pw_uid >= user_id) && (pwd->pw_uid <= uid_max)) {
user_id = pwd->pw_uid + 1;
}
/* create index of used UIDs */
if (pwd->pw_uid <= uid_max) {
used_uids[pwd->pw_uid] = true;
}
} }
endpwent ();
} }
endpwent ();
pw_rewind (); pw_rewind ();
while ((pwd = pw_next ()) != NULL) { while ((pwd = pw_next ()) != NULL) {
if ((pwd->pw_uid >= user_id) && (pwd->pw_uid <= uid_max)) { if ((pwd->pw_uid >= user_id) && (pwd->pw_uid <= uid_max)) {