diff options
author | H. Peter Anvin <hpa@zytor.com> | 2001-05-07 00:56:38 +0000 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2001-05-07 00:56:38 +0000 |
commit | 84013251f00ca95a059ab297e4ddaaebc2d3a3e9 (patch) | |
tree | 75158f4b62895d4ed696623058fd84917faca05e | |
parent | 927522f18d813f5956dff812bf54cdfacee6be29 (diff) | |
download | zisofs-tools-84013251f00ca95a059ab297e4ddaaebc2d3a3e9.tar.gz |
mkzftree: add -x option to limit recursion into other filesystems.zisofs-tools-0.08
-rw-r--r-- | mkzftree.c | 26 |
1 files changed, 20 insertions, 6 deletions
@@ -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; |