]> Dogcows Code - chaz/tar/blobdiff - src/create.c
tar: handle files that occur multiple times but have link count 1
[chaz/tar] / src / create.c
index ce7d966f6aec94e0652736f33eadbd372f53354b..0a6bacf183aac19b32ccb8acff57dd5696b39d30 100644 (file)
@@ -1265,6 +1265,12 @@ dump_dir (int fd, struct tar_stat_info *st, bool top_level,
   return true;
 }
 
+\f
+/* Number of links a file can have without having to be entered into
+   the link table.  Typically this is 1, but in trickier circumstances
+   it is 0.  */
+static nlink_t trivial_link_count;
+
 \f
 /* Main functions of this module.  */
 
@@ -1273,6 +1279,8 @@ create_archive (void)
 {
   struct name const *p;
 
+  trivial_link_count = name_count <= 1 && ! dereference_option;
+
   open_archive (ACCESS_WRITE);
   buffer_write_global_xheader ();
 
@@ -1380,7 +1388,8 @@ static Hash_table *link_table;
 static bool
 dump_hard_link (struct tar_stat_info *st)
 {
-  if (link_table && (st->stat.st_nlink > 1 || remove_files_option))
+  if (link_table
+      && (trivial_link_count < st->stat.st_nlink || remove_files_option))
     {
       struct link lp;
       struct link *duplicate;
@@ -1427,7 +1436,7 @@ file_count_links (struct tar_stat_info *st)
 {
   if (hard_dereference_option)
     return;
-  if (st->stat.st_nlink > 1)
+  if (trivial_link_count < st->stat.st_nlink)
     {
       struct link *duplicate;
       char *linkname = NULL;
This page took 0.021012 seconds and 4 git commands to generate.