]> Dogcows Code - chaz/tar/commitdiff
(cached_no_such_uname, cached_no_such_gname, cached_no_such_uid,
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 31 Jan 1999 02:53:47 +0000 (02:53 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 31 Jan 1999 02:53:47 +0000 (02:53 +0000)
cached_no_such_gid): New vars.
(uid_to_uname, gid_to_gname, uname_to_uid, gname_to_gid):
Cache failures, too.

src/names.c

index 5db518e11753313efebb5e58603701daa1fcecc7..7206540766eca9685d23e9b0479c265e30ea9d4f 100644 (file)
@@ -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;
This page took 0.024541 seconds and 4 git commands to generate.