From: Paul Eggert Date: Sun, 31 Jan 1999 02:53:47 +0000 (+0000) Subject: (cached_no_such_uname, cached_no_such_gname, cached_no_such_uid, X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=2e4d78d85629b2fbe7854dc58bc7503dce463f99;p=chaz%2Ftar (cached_no_such_uname, cached_no_such_gname, cached_no_such_uid, cached_no_such_gid): New vars. (uid_to_uname, gid_to_gname, uname_to_uid, gname_to_gid): Cache failures, too. --- diff --git a/src/names.c b/src/names.c index 5db518e..7206540 100644 --- a/src/names.c +++ b/src/names.c @@ -1,5 +1,5 @@ /* Various processing of names. - Copyright (C) 1988, 92, 94, 96, 97, 1998 Free Software Foundation, Inc. + Copyright (C) 1988, 92, 94, 96, 97, 98, 1999 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -48,6 +48,15 @@ static char cached_gname[GNAME_FIELD_SIZE] = ""; static uid_t cached_uid; /* valid only if cached_uname is not empty */ static gid_t cached_gid; /* valid only if cached_gname is not empty */ +/* These variables are valid only if nonempty. */ +static char cached_no_such_uname[UNAME_FIELD_SIZE] = ""; +static char cached_no_such_gname[GNAME_FIELD_SIZE] = ""; + +/* These variables are valid only if nonzero. It's not worth optimizing + the case for weird systems where 0 is not a valid uid or gid. */ +static uid_t cached_no_such_uid = 0; +static gid_t cached_no_such_gid = 0; + /*------------------------------------------. | Given UID, find the corresponding UNAME. | `------------------------------------------*/ @@ -57,6 +66,12 @@ uid_to_uname (uid_t uid, char uname[UNAME_FIELD_SIZE]) { struct passwd *passwd; + if (uid != 0 && uid == cached_no_such_uid) + { + *uname = '\0'; + return; + } + if (!cached_uname[0] || uid != cached_uid) { passwd = getpwuid (uid); @@ -67,6 +82,7 @@ uid_to_uname (uid_t uid, char uname[UNAME_FIELD_SIZE]) } else { + cached_no_such_uid = uid; *uname = '\0'; return; } @@ -83,6 +99,12 @@ gid_to_gname (gid_t gid, char gname[GNAME_FIELD_SIZE]) { struct group *group; + if (gid != 0 && gid == cached_no_such_gid) + { + *gname = '\0'; + return; + } + if (!cached_gname[0] || gid != cached_gid) { setgrent (); /* FIXME: why?! */ @@ -94,6 +116,7 @@ gid_to_gname (gid_t gid, char gname[GNAME_FIELD_SIZE]) } else { + cached_no_such_gid = gid; *gname = '\0'; return; } @@ -110,6 +133,10 @@ uname_to_uid (char uname[UNAME_FIELD_SIZE], uid_t *uidp) { struct passwd *passwd; + if (cached_no_such_uname[0] + && strncmp (uname, cached_no_such_uname, UNAME_FIELD_SIZE) == 0) + return 0; + if (!cached_uname[0] || uname[0] != cached_uname[0] || strncmp (uname, cached_uname, UNAME_FIELD_SIZE) != 0) @@ -121,7 +148,10 @@ uname_to_uid (char uname[UNAME_FIELD_SIZE], uid_t *uidp) strncpy (cached_uname, uname, UNAME_FIELD_SIZE); } else - return 0; + { + strncpy (cached_no_such_uname, uname, UNAME_FIELD_SIZE); + return 0; + } } *uidp = cached_uid; return 1; @@ -136,6 +166,10 @@ gname_to_gid (char gname[GNAME_FIELD_SIZE], gid_t *gidp) { struct group *group; + if (cached_no_such_gname[0] + && strncmp (gname, cached_no_such_gname, GNAME_FIELD_SIZE) == 0) + return 0; + if (!cached_gname[0] || gname[0] != cached_gname[0] || strncmp (gname, cached_gname, GNAME_FIELD_SIZE) != 0) @@ -147,7 +181,10 @@ gname_to_gid (char gname[GNAME_FIELD_SIZE], gid_t *gidp) strncpy (cached_gname, gname, GNAME_FIELD_SIZE); } else - return 0; + { + strncpy (cached_no_such_gname, gname, GNAME_FIELD_SIZE); + return 0; + } } *gidp = cached_gid; return 1;