]> Dogcows Code - chaz/tar/commitdiff
/tmp/F
authorSergey Poznyakoff <gray@gnu.org.ua>
Sun, 27 Jul 2003 12:00:31 +0000 (12:00 +0000)
committerSergey Poznyakoff <gray@gnu.org.ua>
Sun, 27 Jul 2003 12:00:31 +0000 (12:00 +0000)
src/create.c

index 981280eddc2ad41a3364e652eaf4102e526017d2..b4b487f7225f0c3e5ceb23c096e9f4fc6b9fefb1 100644 (file)
@@ -50,6 +50,7 @@ struct link
   {
     dev_t dev;
     ino_t ino;
+    size_t nlink;
     char name[1];
   };
 \f
@@ -847,6 +848,11 @@ compare_links (void const *entry1, void const *entry2)
   return ((link1->dev ^ link2->dev) | (link1->ino ^ link2->ino)) == 0;
 }
 
+/* Table of all non-directories that we've written so far.  Any time
+   we see another, we check the table and avoid dumping the data
+   again if we've done it once already.  */
+static Hash_table *link_table;
+
 /* Dump a single file, recursing on directories.  P is the file name
    to dump.  TOP_LEVEL tells whether this is a top-level call; zero
    means no, positive means yes, and negative means the top level
@@ -869,11 +875,6 @@ dump_file (char *p, int top_level, dev_t parent_device)
   struct utimbuf restore_times;
   off_t block_ordinal = -1;
 
-  /* Table of all non-directories that we've written so far.  Any time
-     we see another, we check the table and avoid dumping the data
-     again if we've done it once already.  */
-  static Hash_table *link_table;
-
   /* FIXME: `header' might be used uninitialized in this
      function.  Reported by Bruno Haible.  */
 
@@ -1115,6 +1116,8 @@ dump_file (char *p, int top_level, dev_t parent_device)
              /* We found a link.  */
              char const *link_name = safer_name_suffix (dup->name, 1);
 
+             dup->nlink--;
+             
              block_ordinal = current_block_ordinal ();
              if (NAME_FIELD_SIZE <= strlen (link_name))
                write_long (link_name, GNUTYPE_LONGLINK);
@@ -1521,6 +1524,7 @@ file_was_dumped:
                                 + strlen (p) + 1);
       lp->ino = current_stat.st_ino;
       lp->dev = current_stat.st_dev;
+      lp->nlink = current_stat.st_nlink;
       strcpy (lp->name, p);
 
       if (! ((link_table
@@ -1531,6 +1535,27 @@ file_was_dumped:
 
       if (dup != lp)
        abort ();
+      lp->nlink--;
     }
 
 }
+
+/* For each dumped file, check if all its links were dumped. Emit
+   warnings if it is not so. */
+void
+check_links ()
+{
+  struct link *lp;
+
+  if (!link_table)
+    return;
+
+  for (lp = hash_get_first (link_table); lp;
+       lp = hash_get_next (link_table, lp))
+    {
+      if (lp->nlink)
+       {
+         WARN ((0, 0, _("Missing links to '%s'.\n"), lp->name));
+       }
+    }
+}
This page took 0.030461 seconds and 4 git commands to generate.