summaryrefslogtreecommitdiff
path: root/libbb/recursive_action.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbb/recursive_action.c')
-rw-r--r--libbb/recursive_action.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/libbb/recursive_action.c b/libbb/recursive_action.c
index 3ec596a..3a4eb28 100644
--- a/libbb/recursive_action.c
+++ b/libbb/recursive_action.c
@@ -61,6 +61,7 @@ int FAST_FUNC recursive_action(const char *fileName,
unsigned depth)
{
struct stat statbuf;
+ unsigned follow;
int status;
DIR *dir;
struct dirent *next;
@@ -68,14 +69,22 @@ int FAST_FUNC recursive_action(const char *fileName,
if (!fileAction) fileAction = true_action;
if (!dirAction) dirAction = true_action;
- status = ACTION_FOLLOWLINKS; /* hijack a variable for bitmask... */
- if (!depth)
- status = ACTION_FOLLOWLINKS | ACTION_FOLLOWLINKS_L0;
- status = ((flags & status) ? stat : lstat)(fileName, &statbuf);
+ follow = ACTION_FOLLOWLINKS;
+ if (depth == 0)
+ follow = ACTION_FOLLOWLINKS | ACTION_FOLLOWLINKS_L0;
+ follow &= flags;
+ status = (follow ? stat : lstat)(fileName, &statbuf);
if (status < 0) {
#ifdef DEBUG_RECURS_ACTION
bb_error_msg("status=%d flags=%x", status, flags);
#endif
+ if ((flags & ACTION_DANGLING_OK)
+ && errno == ENOENT
+ && lstat(fileName, &statbuf) == 0
+ ) {
+ /* Dangling link */
+ return fileAction(fileName, &statbuf, userData, depth);
+ }
goto done_nak_warn;
}