Browse Source

(struct directory): New member tagfile
(make_directory): Initialize tagfile to NULL
(procdir): New argument: entry
Hanlde exclusion tags.
(makedumpdir): Take into account directory->tagfile.
(scan_directory): Hanlde exclusion tags.

Sergey Poznyakoff 17 years ago
parent
commit
efe6609cd9
1 changed files with 57 additions and 8 deletions
  1. 57 8
      src/incremen.c

+ 57 - 8
src/incremen.c

@@ -62,6 +62,8 @@ struct directory
     unsigned flags;             /* See DIRF_ macros above */
     struct directory *orig;     /* If the directory was renamed, points to
 				   the original directory structure */
+    const char *tagfile;        /* Tag file, if the directory falls under
+				   exclusion_tag_under */
     char name[1];		/* file name of directory */
   };
 
@@ -124,6 +126,7 @@ make_directory (const char *name)
   strcpy (directory->name, name);
   if (ISSLASH (directory->name[namelen-1]))
     directory->name[namelen-1] = 0;
+  directory->tagfile = NULL;
   return directory;
 }
 
@@ -229,7 +232,8 @@ static struct directory *
 procdir (char *name_buffer, struct stat *stat_data,
 	 dev_t device,
 	 enum children children,
-	 bool verbose)
+	 bool verbose,
+	 char *entry)
 {
   struct directory *directory;
   bool nfs = NFS_FILE_STAT (*stat_data);
@@ -330,6 +334,40 @@ procdir (char *name_buffer, struct stat *stat_data,
 
   DIR_SET_FLAG (directory, DIRF_INIT);
 
+  {
+    const char *tag_file_name;
+    size_t len;
+    
+    switch (check_exclusion_tags (name_buffer, &tag_file_name))
+      {
+      case exclusion_tag_all:
+	/* This warning can be duplicated by code in dump_file0, but only
+	   in case when the topmost directory being archived contains
+	   an exclusion tag. */
+	exclusion_tag_warning (name_buffer, tag_file_name,
+			       _("directory not dumped"));
+	if (entry)
+	  *entry = 'N';
+	directory->children = NO_CHILDREN;
+	break;
+
+      case exclusion_tag_contents:
+	exclusion_tag_warning (name_buffer, tag_file_name,
+			       _("contents not dumped"));
+	directory->children = NO_CHILDREN;
+	break;
+	
+      case exclusion_tag_under:
+	exclusion_tag_warning (name_buffer, tag_file_name,
+			       _("contents not dumped"));
+	directory->tagfile = tag_file_name;
+	break;
+	
+      case exclusion_tag_none:
+	break;
+      }
+  }
+
   return directory;
 }
 
@@ -436,9 +474,17 @@ makedumpdir (struct directory *directory, const char *dir)
       const char *loc = dumpdir_locate (dump, array[i]);
       if (loc)
 	{
-	  *new_dump_ptr++ = ' ';
+	  if (directory->tagfile)
+	    *new_dump_ptr = strcmp (directory->tagfile, array[i]) == 0 ?
+		               ' ' : 'I';
+	  else
+	    *new_dump_ptr = ' ';
+	  new_dump_ptr++;
 	  dump = loc + strlen (loc) + 1;
 	}
+      else if (directory->tagfile)
+	*new_dump_ptr++ = strcmp (directory->tagfile, array[i]) == 0 ?
+		               ' ' : 'I';
       else
 	*new_dump_ptr++ = 'Y'; /* New entry */
 
@@ -462,7 +508,7 @@ scan_directory (char *dir, dev_t device)
   size_t name_length;		/* used length in name_buffer */
   struct stat stat_data;
   struct directory *directory;
-
+  
   if (! dirp)
     savedir_error (dir);
 
@@ -484,8 +530,9 @@ scan_directory (char *dir, dev_t device)
       return NULL;
     }
 
-  directory = procdir (name_buffer, &stat_data, device, NO_CHILDREN, false);
-
+  directory = procdir (name_buffer, &stat_data, device, NO_CHILDREN, false,
+		       NULL);
+  
   if (dirp && directory->children != NO_CHILDREN)
     {
       char  *entry;	/* directory entry being scanned */
@@ -506,7 +553,9 @@ scan_directory (char *dir, dev_t device)
 	    }
 	  strcpy (name_buffer + name_length, entry + 1);
 
-	  if (excluded_name (name_buffer))
+	  if (*entry == 'I') /* Ignored entry */
+	    *entry = 'N';
+	  else if (excluded_name (name_buffer))
 	    *entry = 'N';
 	  else
 	    {
@@ -519,10 +568,10 @@ scan_directory (char *dir, dev_t device)
 
 	      if (S_ISDIR (stat_data.st_mode))
 		{
+		  *entry = 'D';
 		  procdir (name_buffer, &stat_data, device,
 			   directory->children,
-			   verbose_option);
-		  *entry = 'D';
+			   verbose_option, entry);
 		}
 
 	      else if (one_file_system_option && device != stat_data.st_dev)