From: Sergey Poznyakoff Date: Wed, 26 Sep 2007 22:08:13 +0000 (+0000) Subject: (struct directory): New member tagfile X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=efe6609cd997116b4f29181b57117ff6d91c7d98;p=chaz%2Ftar (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. --- diff --git a/src/incremen.c b/src/incremen.c index 372e11b..acccb8f 100644 --- a/src/incremen.c +++ b/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)