svn commit: r203588 - head/usr.bin/tar
Tim Kientzle
kientzle at FreeBSD.org
Sun Feb 7 01:22:56 UTC 2010
Author: kientzle
Date: Sun Feb 7 01:22:55 2010
New Revision: 203588
URL: http://svn.freebsd.org/changeset/base/203588
Log:
Restructure the logic that determines when we're crossing a mount
point. In particular, this carves out a place for detecting and
excluding synthetic or network filesystems.
Modified:
head/usr.bin/tar/write.c
Modified: head/usr.bin/tar/write.c
==============================================================================
--- head/usr.bin/tar/write.c Sun Feb 7 01:16:05 2010 (r203587)
+++ head/usr.bin/tar/write.c Sun Feb 7 01:22:55 2010 (r203588)
@@ -82,8 +82,8 @@ __FBSDID("$FreeBSD$");
#endif
#include "bsdtar.h"
-#include "tree.h"
#include "err.h"
+#include "tree.h"
/* Size of buffer for holding file data prior to writing. */
#define FILEDATABUFLEN 65536
@@ -733,17 +733,38 @@ write_hierarchy(struct bsdtar *bsdtar, s
}
/*
- * If user has asked us not to cross mount points,
- * then don't descend into into a dir on a different
- * device.
+ * Are we about to cross to a new filesystem?
*/
if (!dev_recorded) {
+ /* This is the initial file system. */
first_dev = lst->st_dev;
dev_recorded = 1;
- }
- if (bsdtar->option_dont_traverse_mounts) {
- if (lst->st_dev != first_dev)
- descend = 0;
+ } else if (lst->st_dev == first_dev) {
+ /* The starting file system is always acceptable. */
+ } else if (descend == 0) {
+ /* We're not descending, so no need to check. */
+ } else if (bsdtar->option_dont_traverse_mounts) {
+ /* User has asked us not to cross mount points. */
+ descend = 0;
+ } else {
+ /* We're prepared to cross a mount point. */
+
+ /* XXX TODO: check whether this filesystem is
+ * synthetic and/or local. Add a new
+ * --local-only option to skip non-local
+ * filesystems. Skip synthetic filesystems
+ * regardless.
+ *
+ * The results should be cached, since
+ * tree.c doesn't usually visit a directory
+ * and the directory contents together. A simple
+ * move-to-front list should perform quite well.
+ *
+ * This is going to be heavily OS dependent:
+ * FreeBSD's statfs() in conjunction with getvfsbyname()
+ * provides all of this; NetBSD's statvfs() does
+ * most of it; other systems will vary.
+ */
}
/*
More information about the svn-src-head
mailing list