X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fxgetcwd.c;h=2089b8897c89e98d236c4377638df58ed2894520;hb=22c1c15d0a29a1b7ea75456abe3f7062f835c887;hp=85ac368738950bfd7183c944ca2eedc8871ae8ee;hpb=e6995fc57b107d86e2601d1c3f3538d42ba1bade;p=gnulib.git diff --git a/lib/xgetcwd.c b/lib/xgetcwd.c index 85ac36873..2089b8897 100644 --- a/lib/xgetcwd.c +++ b/lib/xgetcwd.c @@ -1,5 +1,5 @@ /* xgetcwd.c -- return current directory with unlimited length - Copyright (C) 1992, 1996, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1992, 1996, 2000, 2001, 2003 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,10 +28,8 @@ extern int errno; #endif #include +#include -#if HAVE_STDLIB_H -# include -#endif #if HAVE_UNISTD_H # include #endif @@ -45,14 +43,23 @@ char *getwd (); # define getcwd(Buf, Max) getwd (Buf) #endif -/* Return the current directory, newly allocated, arbitrarily long. - Return NULL and set errno on error. */ +#include "xalloc.h" +#include "xgetcwd.h" + +/* Return the current directory, newly allocated, assuming it fits + within PATH_MAX bytes -- this is a common system-imposed limit + on how getcwd works. + Upon an out-of-memory error, call xalloc_die. + Upon any other type of error, return NULL. */ char * -xgetcwd () +xgetcwd (void) { #if HAVE_GETCWD_NULL - return getcwd (NULL, 0); + char *cwd = getcwd (NULL, 0); + if (! cwd && errno == ENOMEM) + xalloc_die (); + return cwd; #else /* The initial buffer size for the working directory. A power of 2 @@ -65,12 +72,9 @@ xgetcwd () while (1) { - char *cwd; + char *buf = xmalloc (buf_size); + char *cwd = getcwd (buf, buf_size); int saved_errno; - char *buf = malloc (buf_size); - if (! buf) - return NULL; - cwd = getcwd (buf, buf_size); if (cwd) return cwd; saved_errno = errno; @@ -79,10 +83,7 @@ xgetcwd () return NULL; buf_size *= 2; if (buf_size == 0) - { - errno = ENOMEM; - return NULL; - } + xalloc_die (); } #endif }