]> Dogcows Code - chaz/tar/blobdiff - src/create.c
Optimize searches for directory structures by keeping a pointer to struct directory...
[chaz/tar] / src / create.c
index 1031cc2be928c7f44019db1243dce16208d93616..3a0520c31a77eee127f12169e57281ec48d9afbb 100644 (file)
@@ -1,7 +1,7 @@
 /* Create a tar archive.
 
    Copyright (C) 1985, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
-   2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
 
    Written by John Gilmore, on 1985-08-25.
 
@@ -63,21 +63,22 @@ exclusion_tag_warning (const char *dirname, const char *tagname,
                       const char *message)
 {
   if (verbose_option)
-    WARN ((0, 0,
-          _("%s: contains a cache directory tag %s; %s"),
-          quotearg_colon (dirname),
-          quotearg_n (1, tagname),
-          message));
+    WARNOPT (WARN_CACHEDIR,
+            (0, 0,
+             _("%s: contains a cache directory tag %s; %s"),
+             quotearg_colon (dirname),
+             quotearg_n (1, tagname),
+             message));
 }
 
 enum exclusion_tag_type 
-check_exclusion_tags (char *dirname, const char **tag_file_name)
+check_exclusion_tags (const char *dirname, const char **tag_file_name)
 {
   static char *tagname;
   static size_t tagsize;
   struct exclusion_tag *tag;
   size_t dlen = strlen (dirname);
-  int addslash = dirname[dlen-1] != '/';
+  int addslash = !ISSLASH (dirname[dlen-1]);
   char *nptr = NULL;
   
   for (tag = exclusion_tags; tag; tag = tag->next)
@@ -1072,12 +1073,13 @@ dump_regular_file (int fd, struct tar_stat_info *st)
        {
          char buf[UINTMAX_STRSIZE_BOUND];
          memset (blk->buffer + count, 0, bufsize - count);
-         WARN ((0, 0,
-                ngettext ("%s: File shrank by %s byte; padding with zeros",
-                          "%s: File shrank by %s bytes; padding with zeros",
-                          size_left),
-                quotearg_colon (st->orig_file_name),
-                STRINGIFY_BIGINT (size_left, buf)));
+         WARNOPT (WARN_FILE_SHRANK,
+                  (0, 0,
+                   ngettext ("%s: File shrank by %s byte; padding with zeros",
+                             "%s: File shrank by %s bytes; padding with zeros",
+                             size_left),
+                   quotearg_colon (st->orig_file_name),
+                   STRINGIFY_BIGINT (size_left, buf)));
          if (! ignore_failed_read_option) 
            exit_status = TAREXIT_DIFFERS;
          pad_archive (size_left - (bufsize - count));
@@ -1114,11 +1116,12 @@ dump_dir0 (char *directory,
 
       if (!incremental_option)
        finish_header (st, blk, block_ordinal);
-      else if (gnu_list_name->dir_contents)
+      else if (gnu_list_name->directory)
        {
          if (archive_format == POSIX_FORMAT)
            {
-             xheader_store ("GNU.dumpdir", st, gnu_list_name->dir_contents);
+             xheader_store ("GNU.dumpdir", st,
+                            safe_directory_contents (gnu_list_name->directory));
              finish_header (st, blk, block_ordinal);
            }
          else
@@ -1130,11 +1133,8 @@ dump_dir0 (char *directory,
              const char *buffer, *p_buffer;
 
              block_ordinal = current_block_ordinal ();
-             buffer = gnu_list_name->dir_contents;
-             if (buffer)
-               totsize = dumpdir_size (buffer);
-             else
-               totsize = 0;
+             buffer = safe_directory_contents (gnu_list_name->directory);
+             totsize = dumpdir_size (buffer);
              OFF_TO_CHARS (totsize, blk->header.size);
              finish_header (st, blk, block_ordinal);
              p_buffer = buffer;
@@ -1173,9 +1173,10 @@ dump_dir0 (char *directory,
       && parent_device != st->stat.st_dev)
     {
       if (verbose_option)
-       WARN ((0, 0,
-              _("%s: file is on a different filesystem; not dumped"),
-              quotearg_colon (st->orig_file_name)));
+       WARNOPT (WARN_XDEV,
+                (0, 0,
+                 _("%s: file is on a different filesystem; not dumped"),
+                 quotearg_colon (st->orig_file_name)));
     }
   else
     {
@@ -1300,8 +1301,8 @@ create_archive (void)
              }
            memcpy (buffer, p, plen);
            if (! ISSLASH (buffer[plen - 1]))
-             buffer[plen++] = '/';
-           q = gnu_list_name->dir_contents;
+             buffer[plen++] = DIRECTORY_SEPARATOR;
+           q = directory_contents (gnu_list_name->directory);
            if (q)
              while (*q)
                {
@@ -1358,8 +1359,9 @@ compare_links (void const *entry1, void const *entry2)
 static void
 unknown_file_error (char const *p)
 {
-  WARN ((0, 0, _("%s: Unknown file type; file ignored"),
-        quotearg_colon (p)));
+  WARNOPT (WARN_FILE_IGNORED,
+          (0, 0, _("%s: Unknown file type; file ignored"),
+           quotearg_colon (p)));
   if (!ignore_failed_read_option)
     exit_status = TAREXIT_FAILURE;
 }
@@ -1529,26 +1531,28 @@ dump_file0 (struct tar_stat_info *st, const char *p,
 
   /* See if we want only new files, and check if this one is too old to
      put in the archive.
-
+     
      This check is omitted if incremental_option is set *and* the
      requested file is not explicitely listed in the command line. */
-
+  
   if (!(incremental_option && !is_individual_file (p))
       && !S_ISDIR (st->stat.st_mode)
       && OLDER_TAR_STAT_TIME (*st, m)
       && (!after_date_option || OLDER_TAR_STAT_TIME (*st, c)))
     {
       if (!incremental_option && verbose_option)
-       WARN ((0, 0, _("%s: file is unchanged; not dumped"),
-              quotearg_colon (p)));
+       WARNOPT (WARN_FILE_UNCHANGED,
+                (0, 0, _("%s: file is unchanged; not dumped"),
+                 quotearg_colon (p)));
       return;
     }
 
   /* See if we are trying to dump the archive.  */
   if (sys_file_is_archive (st))
     {
-      WARN ((0, 0, _("%s: file is the archive; not dumped"),
-            quotearg_colon (p)));
+      WARNOPT (WARN_IGNORE_ARCHIVE,
+              (0, 0, _("%s: file is the archive; not dumped"),
+               quotearg_colon (p)));
       return;
     }
 
@@ -1577,8 +1581,9 @@ dump_file0 (struct tar_stat_info *st, const char *p,
          if (fd < 0)
            {
              if (!top_level && errno == ENOENT)
-               WARN ((0, 0, _("%s: File removed before we read it"),
-                      quotearg_colon (p)));
+               WARNOPT (WARN_FILE_REMOVED,
+                        (0, 0, _("%s: File removed before we read it"),
+                         quotearg_colon (p)));
              else
                open_diag (p);
              return;
@@ -1663,8 +1668,9 @@ dump_file0 (struct tar_stat_info *st, const char *p,
               && !(remove_files_option && is_dir))
              || original_size < final_stat.st_size)
            {
-             WARN ((0, 0, _("%s: file changed as we read it"),
-                    quotearg_colon (p)));
+             WARNOPT (WARN_FILE_CHANGED,
+                      (0, 0, _("%s: file changed as we read it"),
+                       quotearg_colon (p)));
              if (exit_status == TAREXIT_SUCCESS)
                exit_status = TAREXIT_DIFFERS;
            }
@@ -1743,12 +1749,14 @@ dump_file0 (struct tar_stat_info *st, const char *p,
     type = FIFOTYPE;
   else if (S_ISSOCK (st->stat.st_mode))
     {
-      WARN ((0, 0, _("%s: socket ignored"), quotearg_colon (p)));
+      WARNOPT (WARN_FILE_IGNORED,
+              (0, 0, _("%s: socket ignored"), quotearg_colon (p)));
       return;
     }
   else if (S_ISDOOR (st->stat.st_mode))
     {
-      WARN ((0, 0, _("%s: door ignored"), quotearg_colon (p)));
+      WARNOPT (WARN_FILE_IGNORED,
+              (0, 0, _("%s: door ignored"), quotearg_colon (p)));
       return;
     }
   else
This page took 0.026891 seconds and 4 git commands to generate.