aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2001-05-07 00:56:38 +0000
committerH. Peter Anvin <hpa@zytor.com>2001-05-07 00:56:38 +0000
commit84013251f00ca95a059ab297e4ddaaebc2d3a3e9 (patch)
tree75158f4b62895d4ed696623058fd84917faca05e
parent927522f18d813f5956dff812bf54cdfacee6be29 (diff)
downloadzisofs-tools-84013251f00ca95a059ab297e4ddaaebc2d3a3e9.tar.gz
mkzftree: add -x option to limit recursion into other filesystems.zisofs-tools-0.08
-rw-r--r--mkzftree.c26
1 files changed, 20 insertions, 6 deletions
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 @@ int munge_tree(const char *intree, const char *outtree, munger_func munger)
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 @@ int munge_tree(const char *intree, const char *outtree, munger_func munger)
*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 @@ int munge_tree(const char *intree, const char *outtree, munger_func munger)
}
} 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 @@ int munge_tree(const char *intree, const char *outtree, munger_func munger)
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 @@ int main(int argc, char *argv[])
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 @@ int main(int argc, char *argv[])
case 'p':
parallel = atoi(optarg);
break;
+ case 'x':
+ onefs = 1;
+ break;
default:
usage(1);
break;