svn commit: trunk/busybox/libbb

vda at busybox.net vda at busybox.net
Sat Sep 29 19:19:56 UTC 2007


Author: vda
Date: 2007-09-29 12:19:55 -0700 (Sat, 29 Sep 2007)
New Revision: 20120

Log:
xrealloc_getcwd_or_warn: smaller cod and less wasted RAM at run time



Modified:
   trunk/busybox/libbb/xgetcwd.c


Changeset:
Modified: trunk/busybox/libbb/xgetcwd.c
===================================================================
--- trunk/busybox/libbb/xgetcwd.c	2007-09-29 19:17:39 UTC (rev 20119)
+++ trunk/busybox/libbb/xgetcwd.c	2007-09-29 19:19:55 UTC (rev 20120)
@@ -9,9 +9,6 @@
 
 #include "libbb.h"
 
-/* Amount to increase buffer size by in each try. */
-#define PATH_INCR 32
-
 /* Return the current directory, newly allocated, arbitrarily long.
    Return NULL and set errno on error.
    If argument is not NULL (previous usage allocate memory), call free()
@@ -20,25 +17,25 @@
 char *
 xrealloc_getcwd_or_warn(char *cwd)
 {
+#define PATH_INCR 64
+
 	char *ret;
 	unsigned path_max;
 
-	path_max = (unsigned) PATH_MAX;
-	path_max += 2;                /* The getcwd docs say to do this. */
+	path_max = 128;	/* 128 + 64 should be enough for 99% of cases */
 
-	if (cwd == NULL)
-		cwd = xmalloc(path_max);
-
-	while ((ret = getcwd(cwd, path_max)) == NULL && errno == ERANGE) {
+	while (1) {
 		path_max += PATH_INCR;
 		cwd = xrealloc(cwd, path_max);
+		ret = getcwd(cwd, path_max);
+		if (ret == NULL) {
+			if (errno == ERANGE)
+				continue;
+			free(cwd);
+			bb_perror_msg("getcwd");
+			return NULL;
+		}
+		cwd = xrealloc(cwd, strlen(cwd) + 1);
+		return cwd;
 	}
-
-	if (ret == NULL) {
-		free(cwd);
-		bb_perror_msg("getcwd");
-		return NULL;
-	}
-
-	return cwd;
 }




More information about the busybox-cvs mailing list