xrealloc_getcwd_or_warn: smaller cod and less wasted RAM at run time

This commit is contained in:
Denis Vlasenko 2007-09-29 19:19:55 +00:00
parent 1ebd0a6d91
commit 2450e4ba44

View File

@ -9,9 +9,6 @@
#include "libbb.h" #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 the current directory, newly allocated, arbitrarily long.
Return NULL and set errno on error. Return NULL and set errno on error.
If argument is not NULL (previous usage allocate memory), call free() If argument is not NULL (previous usage allocate memory), call free()
@ -20,25 +17,25 @@
char * char *
xrealloc_getcwd_or_warn(char *cwd) xrealloc_getcwd_or_warn(char *cwd)
{ {
#define PATH_INCR 64
char *ret; char *ret;
unsigned path_max; unsigned path_max;
path_max = (unsigned) PATH_MAX; path_max = 128; /* 128 + 64 should be enough for 99% of cases */
path_max += 2; /* The getcwd docs say to do this. */
if (cwd == NULL) while (1) {
cwd = xmalloc(path_max);
while ((ret = getcwd(cwd, path_max)) == NULL && errno == ERANGE) {
path_max += PATH_INCR; path_max += PATH_INCR;
cwd = xrealloc(cwd, path_max); 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;
} }