1 /* xgetwd.c -- return current directory with unlimited length 2 Copyright (C) 1992, 1997 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2, or (at your option) 7 any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. */ 13 14 /* Derived from xgetcwd.c in e.g. the GNU sh-utils. */ 15 16 #ifdef HAVE_CONFIG_H 17 #include <config.h> 18 #endif 19 20 #include "system.h" 21 22 #include <stdio.h> 23 #include <errno.h> 24 #ifndef errno 25 extern int errno; 26 #endif 27 #include <sys/types.h> 28 29 /* Amount by which to increase buffer size when allocating more space. */ 30 #define PATH_INCR 32 31 32 char *xmalloc (); 33 char *xrealloc (); 34 35 /* Return the current directory, newly allocated, arbitrarily long. 36 Return NULL and set errno on error. */ 37 38 char * 39 xgetwd () 40 { 41 char *cwd; 42 char *ret; 43 unsigned path_max; 44 45 errno = 0; 46 path_max = (unsigned) PATH_MAX; 47 path_max += 2; /* The getcwd docs say to do this. */ 48 49 cwd = xmalloc (path_max); 50 51 errno = 0; 52 while ((ret = getcwd (cwd, path_max)) == NULL && errno == ERANGE) 53 { 54 path_max += PATH_INCR; 55 cwd = xrealloc (cwd, path_max); 56 errno = 0; 57 } 58 59 if (ret == NULL) 60 { 61 int save_errno = errno; 62 free (cwd); 63 errno = save_errno; 64 return NULL; 65 } 66 return cwd; 67 } 68