diff options
author | Denys Vlasenko | 2009-10-08 03:06:04 +0200 |
---|---|---|
committer | Denys Vlasenko | 2009-10-08 03:06:04 +0200 |
commit | 4ac9819263114edb9b5b638ffa6d2e41a4bb46e7 (patch) | |
tree | f0c5bc9c7a2bf3a384b85350bfe4c9ca5ec4858f /libbb/recursive_action.c | |
parent | 5b807cd5acd1f27b3e7aa36aac2728be27c5907c (diff) | |
download | busybox-4ac9819263114edb9b5b638ffa6d2e41a4bb46e7.zip busybox-4ac9819263114edb9b5b638ffa6d2e41a4bb46e7.tar.gz |
apply post-1.15.1 fixes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb/recursive_action.c')
-rw-r--r-- | libbb/recursive_action.c | 17 |
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; } |