]> Dogcows Code - chaz/tar/blobdiff - src/create.c
Started merging with cpio into paxutils.
[chaz/tar] / src / create.c
index 27c914a6558049e3aa6179f6ba36bc82dbedac79..d583e7febecdbaee6a96d0fe4bd3acdc4f5ce8b4 100644 (file)
@@ -19,7 +19,7 @@
    with this program; if not, write to the Free Software Foundation, Inc.,
    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
-#include "system.h"
+#include <system.h>
 
 #if HAVE_UTIME_H
 # include <utime.h>
@@ -406,6 +406,11 @@ write_short_name (struct tar_stat_info *st)
   return header;
 }
 
+#define FILL(field,byte) do {            \
+  memset(field, byte, sizeof(field)-1);  \
+  (field)[sizeof(field)-1] = 0;          \
+} while (0)
+  
 /* Write a GNUTYPE_LONGLINK or GNUTYPE_LONGNAME block.  */
 static void
 write_gnu_long_link (struct tar_stat_info *st, const char *p, char type)
@@ -413,8 +418,22 @@ write_gnu_long_link (struct tar_stat_info *st, const char *p, char type)
   size_t size = strlen (p) + 1;
   size_t bufsize;
   union block *header;
-
+  char *tmpname;
+  
   header = start_private_header ("././@LongLink", size);
+  FILL(header->header.mtime, '0');
+  FILL(header->header.mode, '0');
+  FILL(header->header.uid, '0');
+  FILL(header->header.gid, '0');
+  FILL(header->header.devmajor, 0);
+  FILL(header->header.devminor, 0);
+  uid_to_uname (0, &tmpname);
+  UNAME_TO_CHARS (tmpname, header->header.uname);
+  free (tmpname);
+  gid_to_gname (0, &tmpname);
+  GNAME_TO_CHARS (tmpname, header->header.gname);
+  free (tmpname);
+  
   strcpy (header->header.magic, OLDGNU_MAGIC);
   header->header.typeflag = type;
   finish_header (st, header, -1);
@@ -664,7 +683,7 @@ start_header (struct tar_stat_info *st)
       else
        MAJOR_TO_CHARS (st->devminor, header->header.devminor);
     }
-  else
+  else if (archive_format != GNU_FORMAT && archive_format != OLDGNU_FORMAT)
     {
       MAJOR_TO_CHARS (0, header->header.devmajor);
       MINOR_TO_CHARS (0, header->header.devminor);
@@ -1303,16 +1322,19 @@ dump_file0 (struct tar_stat_info *st, char *p,
 #endif
 
   /* See if we want only new files, and check if this one is too old to
-     put in the archive.  */
+     put in the archive.
 
-  if (!S_ISDIR (st->stat.st_mode)
+     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_STAT_TIME (st->stat, m)
       && (!after_date_option || OLDER_STAT_TIME (st->stat, c)))
     {
-      if (0 < top_level) /* equivalent to !incremental_option */
+      if (!incremental_option)
        WARN ((0, 0, _("%s: file is unchanged; not dumped"),
               quotearg_colon (p)));
-      /* FIXME: recheck this return.  */
       return;
     }
 
This page took 0.023851 seconds and 4 git commands to generate.