find: make -mindepth N -xdev correctly stop on mountpoints

function                                             old     new   delta
fileAction                                           153     193     +40

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2012-09-06 15:24:11 +02:00
parent 9e71e3cea5
commit 2dc1a97272

View File

@ -728,10 +728,27 @@ static int FAST_FUNC fileAction(const char *fileName,
int depth IF_NOT_FEATURE_FIND_MAXDEPTH(UNUSED_PARAM))
{
int r;
int same_fs = 1;
#if ENABLE_FEATURE_FIND_XDEV
if (S_ISDIR(statbuf->st_mode) && G.xdev_count) {
int i;
for (i = 0; i < G.xdev_count; i++) {
if (G.xdev_dev[i] == statbuf->st_dev)
goto found;
}
//bb_error_msg("'%s': not same fs", fileName);
same_fs = 0;
found: ;
}
#endif
#if ENABLE_FEATURE_FIND_MAXDEPTH
if (depth < G.minmaxdepth[0])
return TRUE; /* skip this, continue recursing */
if (depth < G.minmaxdepth[0]) {
if (same_fs)
return TRUE; /* skip this, continue recursing */
return SKIP; /* stop recursing */
}
if (depth > G.minmaxdepth[1])
return SKIP; /* stop recursing */
#endif
@ -747,21 +764,11 @@ static int FAST_FUNC fileAction(const char *fileName,
return SKIP;
}
#endif
#if ENABLE_FEATURE_FIND_XDEV
/* -xdev stops on mountpoints, but AFTER mountpoit itself
* is processed as usual */
if (S_ISDIR(statbuf->st_mode)) {
if (G.xdev_count) {
int i;
for (i = 0; i < G.xdev_count; i++) {
if (G.xdev_dev[i] == statbuf->st_dev)
goto found;
}
return SKIP;
found: ;
}
if (!same_fs) {
return SKIP;
}
#endif
/* Cannot return 0: our caller, recursive_action(),
* will perror() and skip dirs (if called on dir) */