]> Dogcows Code - chaz/tar/blobdiff - src/create.c
Use AT_DATA for sample output.
[chaz/tar] / src / create.c
index 4ff30542ba8fb27e0d7c268ce09c0f8163165f40..f54e346f777c4828002ac6e24a103d50415312b1 100644 (file)
@@ -7,7 +7,7 @@
 
    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
 
    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
-   Free Software Foundation; either version 2, or (at your option) any later
+   Free Software Foundation; either version 3, or (at your option) any later
    version.
 
    This program is distributed in the hope that it will be useful, but
    version.
 
    This program is distributed in the hope that it will be useful, but
@@ -58,7 +58,7 @@ add_exclusion_tag (const char *name, enum exclusion_tag_type type,
   exclusion_tags = tag;
 }
 
   exclusion_tags = tag;
 }
 
-static void
+void
 exclusion_tag_warning (const char *dirname, const char *tagname,
                       const char *message)
 {
 exclusion_tag_warning (const char *dirname, const char *tagname,
                       const char *message)
 {
@@ -70,19 +70,19 @@ exclusion_tag_warning (const char *dirname, const char *tagname,
           message));
 }
 
           message));
 }
 
-static enum exclusion_tag_type 
+enum exclusion_tag_type 
 check_exclusion_tags (char *dirname, const char **tag_file_name)
 {
   static char *tagname;
   static size_t tagsize;
   struct exclusion_tag *tag;
   size_t dlen = strlen (dirname);
 check_exclusion_tags (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] != '/';
   char *nptr = NULL;
   char *nptr = NULL;
-  char *ret = NULL;
   
   for (tag = exclusion_tags; tag; tag = tag->next)
     {
   
   for (tag = exclusion_tags; tag; tag = tag->next)
     {
-      size_t size = dlen + tag->length + 1;
+      size_t size = dlen + addslash + tag->length + 1;
       if (size > tagsize)
        {
          tagsize = size;
       if (size > tagsize)
        {
          tagsize = size;
@@ -93,6 +93,8 @@ check_exclusion_tags (char *dirname, const char **tag_file_name)
        {
          strcpy (tagname, dirname);
          nptr = tagname + dlen;
        {
          strcpy (tagname, dirname);
          nptr = tagname + dlen;
+         if (addslash)
+           *nptr++ = '/';
        }
       strcpy (nptr, tag->name);
       if (access (tagname, F_OK) == 0
        }
       strcpy (nptr, tag->name);
       if (access (tagname, F_OK) == 0
@@ -711,10 +713,10 @@ write_extended (bool global, struct tar_stat_info *st, union block *old_header)
   char *p;
   int type;
 
   char *p;
   int type;
 
-  if (extended_header.buffer || extended_header.stk == NULL)
+  if (st->xhdr.buffer || st->xhdr.stk == NULL)
     return old_header;
 
     return old_header;
 
-  xheader_finish (&extended_header);
+  xheader_finish (&st->xhdr);
   memcpy (hp.buffer, old_header, sizeof (hp));
   if (global)
     {
   memcpy (hp.buffer, old_header, sizeof (hp));
   if (global)
     {
@@ -726,7 +728,7 @@ write_extended (bool global, struct tar_stat_info *st, union block *old_header)
       type = XHDTYPE;
       p = xheader_xhdr_name (st);
     }
       type = XHDTYPE;
       p = xheader_xhdr_name (st);
     }
-  xheader_write (type, p, &extended_header);
+  xheader_write (type, p, &st->xhdr);
   free (p);
   header = find_next_block ();
   memcpy (header, &hp.buffer, sizeof (hp.buffer));
   free (p);
   header = find_next_block ();
   memcpy (header, &hp.buffer, sizeof (hp.buffer));
@@ -1183,8 +1185,11 @@ dump_dir0 (char *directory,
       
       switch (check_exclusion_tags (st->orig_file_name, &tag_file_name))
        {
       
       switch (check_exclusion_tags (st->orig_file_name, &tag_file_name))
        {
-       case exclusion_tag_none:
        case exclusion_tag_all:
        case exclusion_tag_all:
+         /* Handled in dump_file0 */
+         break;
+         
+       case exclusion_tag_none:
          {
            char const *entry;
            size_t entry_len;
          {
            char const *entry;
            size_t entry_len;
@@ -1195,7 +1200,6 @@ dump_dir0 (char *directory,
 
            /* Now output all the files in the directory.  */
            /* FIXME: Should speed this up by cd-ing into the dir.  */
 
            /* Now output all the files in the directory.  */
            /* FIXME: Should speed this up by cd-ing into the dir.  */
-
            for (entry = directory; (entry_len = strlen (entry)) != 0;
                 entry += entry_len + 1)
              {
            for (entry = directory; (entry_len = strlen (entry)) != 0;
                 entry += entry_len + 1)
              {
@@ -1270,7 +1274,7 @@ create_archive (void)
   const char *p;
 
   open_archive (ACCESS_WRITE);
   const char *p;
 
   open_archive (ACCESS_WRITE);
-  xheader_write_global ();
+  buffer_write_global_xheader ();
 
   if (incremental_option)
     {
 
   if (incremental_option)
     {
@@ -1646,7 +1650,10 @@ dump_file0 (struct tar_stat_info *st, const char *p,
 
       if (ok)
        {
 
       if (ok)
        {
-         if (timespec_cmp (get_stat_ctime (&final_stat), original_ctime) != 0
+         if ((timespec_cmp (get_stat_ctime (&final_stat), original_ctime) != 0
+              /* Original ctime will change if the file is a directory and
+                 --remove-files is given */
+              && !(remove_files_option && is_dir))
              || original_size < final_stat.st_size)
            {
              WARN ((0, 0, _("%s: file changed as we read it"),
              || original_size < final_stat.st_size)
            {
              WARN ((0, 0, _("%s: file changed as we read it"),
This page took 0.022617 seconds and 4 git commands to generate.