- char *ret;
- unsigned path_max;
-
- errno = 0;
- path_max = (unsigned) PATH_MAX;
- path_max += 2; /* The getcwd docs say to do this. */
-
- if(cwd==0)
- cwd = xmalloc (path_max);
-
- errno = 0;
- while ((ret = getcwd (cwd, path_max)) == NULL && errno == ERANGE) {
- path_max += PATH_INCR;
- cwd = xrealloc (cwd, path_max);
- errno = 0;
- }
-
- if (ret == NULL) {
- int save_errno = errno;
- free (cwd);
- errno = save_errno;
- perror_msg("getcwd()");
- return NULL;
- }
-
- return cwd;
+#define PATH_INCR 64
+
+ char *ret;
+ unsigned path_max;
+
+ path_max = 128; /* 128 + 64 should be enough for 99% of cases */
+
+ 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;
+ }