svn commit: trunk/busybox/libbb
vda at busybox.net
vda at busybox.net
Fri Oct 27 17:59:14 UTC 2006
Author: vda
Date: 2006-10-27 10:59:14 -0700 (Fri, 27 Oct 2006)
New Revision: 16460
Log:
recursive_action: preparatory changes. will introduce "int level".
Modified:
trunk/busybox/libbb/recursive_action.c
Changeset:
Modified: trunk/busybox/libbb/recursive_action.c
===================================================================
--- trunk/busybox/libbb/recursive_action.c 2006-10-27 16:07:20 UTC (rev 16459)
+++ trunk/busybox/libbb/recursive_action.c 2006-10-27 17:59:14 UTC (rev 16460)
@@ -22,21 +22,28 @@
* and so isn't sufficiently portable to take over since glibc2.1
* is so stinking huge.
*/
+
+static int true_action(const char *fileName, struct stat *statbuf, void* userData)
+{
+ return TRUE;
+}
+
int recursive_action(const char *fileName,
int recurse, int followLinks, int depthFirst,
int (*fileAction) (const char *fileName, struct stat * statbuf, void* userData),
int (*dirAction) (const char *fileName, struct stat * statbuf, void* userData),
void* userData)
{
- int status;
struct stat statbuf;
+ int status;
+ DIR *dir;
struct dirent *next;
- if (followLinks)
- status = stat(fileName, &statbuf);
- else
- status = lstat(fileName, &statbuf);
+ if (!fileAction) fileAction = true_action;
+ if (!dirAction) dirAction = true_action;
+ status = (followLinks ? stat : lstat)(fileName, &statbuf);
+
if (status < 0) {
#ifdef DEBUG_RECURS_ACTION
bb_error_msg("status=%d followLinks=%d TRUE=%d",
@@ -47,63 +54,54 @@
}
if (!followLinks && (S_ISLNK(statbuf.st_mode))) {
- if (fileAction == NULL)
- return TRUE;
- else
- return fileAction(fileName, &statbuf, userData);
+ return fileAction(fileName, &statbuf, userData);
}
if (!recurse) {
if (S_ISDIR(statbuf.st_mode)) {
- if (dirAction != NULL)
- return (dirAction(fileName, &statbuf, userData));
- else
- return TRUE;
+ return dirAction(fileName, &statbuf, userData);
}
}
- if (S_ISDIR(statbuf.st_mode)) {
- DIR *dir;
+ if (!S_ISDIR(statbuf.st_mode))
+ return fileAction(fileName, &statbuf, userData);
- if (dirAction != NULL && !depthFirst) {
- status = dirAction(fileName, &statbuf, userData);
- if (!status) {
- bb_perror_msg("%s", fileName);
- return FALSE;
- } else if (status == SKIP)
- return TRUE;
- }
- dir = opendir(fileName);
- if (!dir) {
+ if (!depthFirst) {
+ status = dirAction(fileName, &statbuf, userData);
+ if (!status) {
+ bb_perror_msg("%s", fileName);
return FALSE;
}
- status = TRUE;
- while ((next = readdir(dir)) != NULL) {
- char *nextFile;
+ if (status == SKIP)
+ return TRUE;
+ }
- nextFile = concat_subpath_file(fileName, next->d_name);
- if(nextFile == NULL)
- continue;
- if (!recursive_action(nextFile, TRUE, followLinks, depthFirst,
- fileAction, dirAction, userData)) {
- status = FALSE;
- }
- free(nextFile);
+ dir = opendir(fileName);
+ if (!dir) {
+ return FALSE;
+ }
+ status = TRUE;
+ while ((next = readdir(dir)) != NULL) {
+ char *nextFile;
+
+ nextFile = concat_subpath_file(fileName, next->d_name);
+ if (nextFile == NULL)
+ continue;
+ if (!recursive_action(nextFile, TRUE, followLinks, depthFirst,
+ fileAction, dirAction, userData)) {
+ status = FALSE;
}
- closedir(dir);
- if (dirAction != NULL && depthFirst) {
- if (!dirAction(fileName, &statbuf, userData)) {
- bb_perror_msg("%s", fileName);
- return FALSE;
- }
- }
- if (!status)
+ free(nextFile);
+ }
+ closedir(dir);
+ if (depthFirst) {
+ if (!dirAction(fileName, &statbuf, userData)) {
+ bb_perror_msg("%s", fileName);
return FALSE;
- } else {
- if (fileAction == NULL)
- return TRUE;
- else
- return fileAction(fileName, &statbuf, userData);
+ }
}
+
+ if (!status)
+ return FALSE;
return TRUE;
}
More information about the busybox-cvs
mailing list