How about adding the nodump flag processing in tar?

Something like:

--- /usr/src/gnu/usr.bin/tar/create.c   Wed Aug 11 09:03:39 1999
+++ create.c    Wed Nov 21 13:52:54 2001
@@ -817,6 +817,8 @@
          strcpy (namebuf + len, d->d_name);
          if (f_exclude && check_exclude (namebuf))
            continue;
+         if (hstat.st_flags & UF_NODUMP)
+           continue;
          dump_file (namebuf, our_device, 0);
        }
 
Or something like this patch I've submited to the GNU tar mailing
list:

diff -r -u tar-1.13.orig/src/common.h tar-1.13/src/common.h
--- tar-1.13.orig/src/common.h  Tue Nov 20 15:04:26 2001
+++ tar-1.13/src/common.h       Tue Nov 20 15:14:49 2001
@@ -143,6 +143,9 @@
 /* Boolean value.  */
 GLOBAL int dereference_option;
 
+/* Boolean value.  */
+GLOBAL int honor_nodump_option;
+
 /* Patterns that match file names to be excluded.  */
 GLOBAL struct exclude *excluded;
 
diff -r -u tar-1.13.orig/src/create.c tar-1.13/src/create.c
--- tar-1.13.orig/src/create.c  Tue Nov 20 15:04:25 2001
+++ tar-1.13/src/create.c       Tue Nov 20 15:18:14 2001
@@ -1483,6 +1483,12 @@
          if (is_dot_or_dotdot (entry->d_name)
              || excluded_filename (excluded, entry->d_name))
            continue;
+#ifdef __FreeBSD__
+         /* If file has NODUMP flag set, ignore it.  Accordingly skip
+            the whole tree under a directory. */
+         if (honor_nodump_option && (current_stat.st_flags & UF_NODUMP))
+           continue;
+#endif
 
          if ((int) NAMLEN (entry) + len >= buflen)
            {
diff -r -u tar-1.13.orig/src/tar.c tar-1.13/src/tar.c
--- tar-1.13.orig/src/tar.c     Tue Nov 20 15:04:26 2001
+++ tar-1.13/src/tar.c  Tue Nov 20 15:21:57 2001
@@ -187,6 +187,7 @@
   {"gunzip", no_argument, NULL, 'z'},
   {"gzip", no_argument, NULL, 'z'},
   {"help", no_argument, &show_help, 1},
+  {"honor-nodump", no_argument, NULL, 'H'},
   {"ignore-failed-read", no_argument, &ignore_failed_read_option, 1},
   {"ignore-zeros", no_argument, NULL, 'i'},
   /* FIXME: --ignore-end as a new name for --ignore-zeros?  */
@@ -416,7 +417,7 @@
    Y  per-block gzip compression */
 
 #define OPTION_STRING \
-  "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxz"
+  "-01234567ABC:F:GHK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxz"
 
 static void
 set_subcommand_option (enum subcommand subcommand)
@@ -623,6 +624,12 @@
        /* Follow symbolic links.  */
 
        dereference_option = 1;
+       break;
+
+      case 'H':
+       /* Honor NODUMP flag.  */
+
+       honor_nodump_option = 1;
        break;
 
       case 'i':


BTW, the ancient GNU tar (1.11.2) FreeBSD has bundled with the system
happens to have a bug that makes it inconvenient with modern tapes.
The tape length (option -L) is stored in a signed integer; a DAT DDS-2
is already too big for that.

I would recommend to upgrade to the new 1.13, which, together with a
brand new set of bugs, introduces the TARLONG type to store such
informations as tape length.


-- 
walter pelissero
http://www.pelissero.org

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to