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;