mkzftree: add -x option to limit recursion into other filesystems.
diff --git a/mkzftree.c b/mkzftree.c
index be7a3bf..242104d 100644
--- a/mkzftree.c
+++ b/mkzftree.c
@@ -79,6 +79,7 @@
int force = 0; /* Always compress */
int level = 9; /* Compression level */
int parallel = 0; /* Parallelism (0 = strictly serial) */
+int onefs = 0; /* One filesystem only */
int verbosity = 0;
/* Program name */
@@ -620,7 +621,7 @@
char *in_path, *out_path, *in_file, *out_file;
DIR *thisdir;
struct dirent *dirent;
- struct stat st;
+ struct stat st, dirst;
struct utimbuf ut;
int err = 0;
@@ -638,6 +639,13 @@
*in_file++ = '/';
*out_file++ = '/';
+ /* Get directory information */
+ if ( stat(intree, &dirst) ) {
+ fprintf(stderr, "%s: Failed to stat directory %s: %s\n",
+ program, intree, strerror(errno));
+ return 1;
+ }
+
/* Open the directory */
thisdir = opendir(intree);
if ( !thisdir ) {
@@ -701,9 +709,12 @@
}
} else if ( S_ISDIR(st.st_mode) ) {
/* Recursion: see recursion */
- err = munge_tree(in_path, out_path, munger);
- if ( err )
- break;
+ /* Don't decend if -x is specified and st_dev is different */
+ if ( !onefs || dirst.st_dev == st.st_dev ) {
+ err = munge_tree(in_path, out_path, munger);
+ if ( err )
+ break;
+ }
} else if ( S_ISLNK(st.st_mode) ) {
int chars;
if ( (chars = readlink(in_path, buffer, BUFSIZ)) < 0 ) {
@@ -781,7 +792,7 @@
static void usage(int err)
{
fprintf(stderr,
- "Usage: %s [-vfhu] [-p parallelism] [-z level] intree outtree\n",
+ "Usage: %s [-vfhux] [-p parallelism] [-z level] intree outtree\n",
program);
exit(err);
}
@@ -796,7 +807,7 @@
program = argv[0];
- while ( (opt = getopt(argc, argv, "vfz:p:hu")) != EOF ) {
+ while ( (opt = getopt(argc, argv, "vfz:p:hux")) != EOF ) {
switch(opt) {
case 'f':
force = 1; /* Always compress */
@@ -822,6 +833,9 @@
case 'p':
parallel = atoi(optarg);
break;
+ case 'x':
+ onefs = 1;
+ break;
default:
usage(1);
break;