]> Dogcows Code - chaz/tar/blobdiff - src/create.c
Moved system dependencies to system.c
[chaz/tar] / src / create.c
index 7b7e28f19aa54cebe68b41c4d643dc47c0190ff7..b712f93b716aa220eea16ed6b52bb4115ef424b7 100644 (file)
 
 #include "system.h"
 
-#if !MSDOS
-# include <pwd.h>
-# include <grp.h>
-#endif
-
 #if HAVE_UTIME_H
 # include <utime.h>
 #else
@@ -41,11 +36,6 @@ struct utimbuf
 #include "common.h"
 #include <hash.h>
 
-#ifndef MSDOS
-extern dev_t ar_dev;
-extern ino_t ar_ino;
-#endif
-
 struct link
   {
     dev_t dev;
@@ -402,6 +392,16 @@ write_long (const char *p, char type)
   set_next_block_after (header + (size - 1) / BLOCKSIZE);
 }
 
+/* Write a long link name, depending on the current archive format */
+static void
+write_long_link (struct tar_stat_info *st)
+{
+  if (archive_format == POSIX_FORMAT)
+    xheader_store ("linkpath", st);
+  else
+    write_long (st->link_name, GNUTYPE_LONGNAME);
+}
+
 /* NOTE: Cross recursion between start_header and write_extended  */
 
 static union block *
@@ -410,7 +410,6 @@ write_extended (union block *old_header, char type)
   union block *header, hp;
   struct tar_stat_info foo;
   size_t size;
-  size_t bufsize;
   char *p;
 
   if (extended_header.buffer || extended_header.stk == NULL)
@@ -1049,16 +1048,13 @@ dump_file (char *p, int top_level, dev_t parent_device)
       return;
     }
 
-#if !MSDOS
   /* See if we are trying to dump the archive.  */
-
-  if (ar_dev && current_stat_info.stat.st_dev == ar_dev && current_stat_info.stat.st_ino == ar_ino)
+  if (sys_file_is_archive (&current_stat_info))
     {
       WARN ((0, 0, _("%s: file is the archive; not dumped"),
             quotearg_colon (p)));
       return;
     }
-#endif
 
   if (S_ISDIR (current_stat_info.stat.st_mode))
     {
@@ -1246,9 +1242,9 @@ dump_file (char *p, int top_level, dev_t parent_device)
              dup->nlink--;
              
              block_ordinal = current_block_ordinal ();
-             if (NAME_FIELD_SIZE <= strlen (link_name))
-               write_long (link_name, GNUTYPE_LONGLINK);
              assign_string (&current_stat_info.link_name, link_name);
+             if (NAME_FIELD_SIZE <= strlen (link_name))
+               write_long_link (&current_stat_info);
 
              current_stat_info.stat.st_size = 0;
              header = start_header (p, &current_stat_info);
@@ -1488,7 +1484,9 @@ dump_file (char *p, int top_level, dev_t parent_device)
                    char buf[UINTMAX_STRSIZE_BOUND];
                    memset (start->buffer + count, 0, bufsize - count);
                    WARN ((0, 0,
-                          _("%s: File shrank by %s bytes; padding with zeros"),
+                          ngettext ("%s: File shrank by %s byte; padding with zeros",
+                                    "%s: File shrank by %s bytes; padding with zeros",
+                                    sizeleft),
                           quotearg_colon (p),
                           STRINGIFY_BIGINT (sizeleft, buf)));
                    if (! ignore_failed_read_option)
@@ -1573,9 +1571,9 @@ dump_file (char *p, int top_level, dev_t parent_device)
              return;
            }
          buffer[size] = '\0';
-         if (size >= NAME_FIELD_SIZE)
-           write_long (buffer, GNUTYPE_LONGLINK);
          assign_string (&current_stat_info.link_name, buffer);
+         if (size >= NAME_FIELD_SIZE)
+           write_long_link (&current_stat_info);
 
          block_ordinal = current_block_ordinal ();
          current_stat_info.stat.st_size = 0;   /* force 0 size on symlink */
This page took 0.021721 seconds and 4 git commands to generate.