X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=lib%2Fxgetcwd.c;h=23fbaeab1dd8b992d8ecd4c32afd65f7fe546c5f;hb=c3d4fee823c6e4fdc96698b952ec7346f298ce81;hp=0af66fb88844942c178cf2b8295888a1af15005b;hpb=07c3d5fe321be9931cc9132c5783ef5a7dddde57;p=chaz%2Ftar diff --git a/lib/xgetcwd.c b/lib/xgetcwd.c index 0af66fb..23fbaea 100644 --- a/lib/xgetcwd.c +++ b/lib/xgetcwd.c @@ -54,38 +54,25 @@ xgetcwd () #if defined __GLIBC__ && __GLIBC__ >= 2 return getcwd (NULL, 0); #else - char *ret; - size_t path_max; - char buf[1024]; + size_t buf_size = 128; /* must be a power of 2 */ + char *buf = NULL; - errno = 0; - ret = getcwd (buf, sizeof (buf)); - if (ret != NULL) - return xstrdup (buf); - if (errno != ERANGE) - return NULL; - - path_max = 1 << 10; - - for (;;) + while (1) { - char *cwd = (char *) xmalloc (path_max); - int save_errno; + char *cwd; + buf = (char *) xrealloc (buf, buf_size); - errno = 0; - ret = getcwd (cwd, path_max); - if (ret != NULL) - return ret; - save_errno = errno; - free (cwd); - if (save_errno != ERANGE) + cwd = getcwd (buf, buf_size); + if (cwd != NULL) + return cwd; + if (errno != ERANGE) { - errno = save_errno; + free (buf); return NULL; } - path_max *= 2; - if (path_max == 0) + buf_size *= 2; + if (buf_size == 0) xalloc_die (); } #endif