xrealloc_getcwd_or_warn: smaller cod and less wasted RAM at run time
No binary (build failed)
—
(log yok)
| @@ -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. */ |
| - | |
| - | if (cwd == NULL) |
| - | cwd = xmalloc(path_max); |
| + | path_max = 128; /* 128 + 64 should be enough for 99% of cases */ |
| - | 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; |
| } | |