]> Dogcows Code - chaz/tar/blobdiff - src/names.c
(write_archive_buffer): New function.
[chaz/tar] / src / names.c
index b38f6655c3c926c7a144c064d2aefb74a23f2b7c..7206540766eca9685d23e9b0479c265e30ea9d4f 100644 (file)
@@ -1,5 +1,5 @@
 /* Various processing of names.
-   Copyright (C) 1988, 1992, 1994, 1996, 1997 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);
@@ -66,7 +81,11 @@ uid_to_uname (uid_t uid, char uname[UNAME_FIELD_SIZE])
          strncpy (cached_uname, passwd->pw_name, UNAME_FIELD_SIZE);
        }
       else
-       *uname = '\0';
+       {
+         cached_no_such_uid = uid;
+         *uname = '\0';
+         return;
+       }
     }
   strncpy (uname, cached_uname, UNAME_FIELD_SIZE);
 }
@@ -80,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?! */
@@ -90,7 +115,11 @@ gid_to_gname (gid_t gid, char gname[GNAME_FIELD_SIZE])
          strncpy (cached_gname, group->gr_name, GNAME_FIELD_SIZE);
        }
       else
-       *gname = '\0';
+       {
+         cached_no_such_gid = gid;
+         *gname = '\0';
+         return;
+       }
     }
   strncpy (gname, cached_gname, GNAME_FIELD_SIZE);
 }
@@ -104,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)
@@ -115,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;
@@ -130,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)
@@ -141,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;
@@ -222,7 +265,7 @@ name_init (int argc, char *const *argv)
          name_file = stdin;
        }
       else if (name_file = fopen (files_from_option, "r"), !name_file)
-       FATAL_ERROR ((0, errno, _("Cannot open file %s"), name_file));
+       FATAL_ERROR ((0, errno, _("Cannot open file %s"), files_from_option));
     }
 }
 
@@ -247,7 +290,7 @@ static int
 read_name_from_file (void)
 {
   int character;
-  int counter = 0;
+  size_t counter = 0;
 
   /* FIXME: getc may be called even if character was EOF the last time here.  */
 
@@ -382,7 +425,7 @@ name_gather (void)
 {
   /* Buffer able to hold a single name.  */
   static struct name *buffer;
-  static int allocated_length = 0;
+  static size_t allocated_length = 0;
 
   char *name;
 
@@ -442,7 +485,7 @@ addname (const char *string)
   static char *chdir_name = NULL;
 
   struct name *name;
-  int length;
+  size_t length;
 
   if (strcmp (string, "-C") == 0)
     {
@@ -472,7 +515,7 @@ addname (const char *string)
     }
 
   length = string ? strlen (string) : 0;
-  name = (struct name *) xmalloc ((size_t) (sizeof (struct name) + length));
+  name = (struct name *) xmalloc (sizeof (struct name) + length);
   memset (name, 0, sizeof (struct name) + length);
   name->next = NULL;
 
@@ -481,7 +524,7 @@ addname (const char *string)
       name->fake = 0;
       name->length = length;
       /* FIXME: Possibly truncating a string, here?  Tss, tss, tss!  */
-      strncpy (name->name, string, (size_t) length);
+      strncpy (name->name, string, length);
       name->name[length] = '\0';
     }
   else
@@ -515,7 +558,7 @@ addname (const char *string)
 int
 name_match (const char *path)
 {
-  int length = strlen (path);
+  size_t length = strlen (path);
 
   while (1)
     {
@@ -569,7 +612,7 @@ name_match (const char *path)
              && (path[cursor->length] == '\0'
                  || path[cursor->length] == '/')
                                /* full match on file/dirname */
-             && strncmp (path, cursor->name, (size_t) cursor->length) == 0)
+             && strncmp (path, cursor->name, cursor->length) == 0)
                                /* name compare */
            {
              cursor->found = 1;        /* remember it matched */
@@ -659,7 +702,7 @@ name_expand (void)
 struct name *
 name_scan (const char *path)
 {
-  int length = strlen (path);
+  size_t length = strlen (path);
 
   while (1)
     {
@@ -691,7 +734,7 @@ name_scan (const char *path)
              && (path[cursor->length] == '\0'
                  || path[cursor->length] == '/')
                                /* full match on file/dirname */
-             && strncmp (path, cursor->name, (size_t) cursor->length) == 0)
+             && strncmp (path, cursor->name, cursor->length) == 0)
                                /* name compare */
            return cursor;      /* we got a match */
        }
@@ -769,8 +812,8 @@ new_name (const char *path, const char *name)
 /* Excludes names.  */
 
 static char *exclude_pool = NULL;
-static int exclude_pool_size = 0;
-static int allocated_exclude_pool_size = 0;
+static size_t exclude_pool_size = 0;
+static size_t allocated_exclude_pool_size = 0;
 
 static char **simple_exclude_array = NULL;
 static int simple_excludes = 0;
@@ -787,7 +830,7 @@ static int allocated_pattern_excludes = 0;
 void
 add_exclude (char *name)
 {
-  int name_size;
+  size_t name_size;
 
   unquote_string (name);       /* FIXME: unquote in all cases?  If ever? */
   name_size = strlen (name) + 1;
@@ -799,7 +842,7 @@ add_exclude (char *name)
 
       allocated_exclude_pool_size = exclude_pool_size + name_size + 1024;
       exclude_pool = (char *)
-       xrealloc (exclude_pool, (size_t) allocated_exclude_pool_size);
+       xrealloc (exclude_pool, allocated_exclude_pool_size);
 
       for (cursor = simple_exclude_array;
           cursor < simple_exclude_array + simple_excludes;
This page took 0.028798 seconds and 4 git commands to generate.