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