|  | @@ -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)
 |