1/* vi: set sw=4 ts=4: */ 2/* 3 * xgetcwd.c -- return current directory with unlimited length 4 * Copyright (C) 1992, 1996 Free Software Foundation, Inc. 5 * Written by David MacKenzie <djm@gnu.ai.mit.edu>. 6 * 7 * Special function for busybox written by Vladimir Oleynik <dzo@simtreas.ru> 8 * 9 * Licensed under GPLv2, see file LICENSE in this source tree. 10 */ 11 12#include "libbb.h" 13 14/* Return the current directory, newly allocated, arbitrarily long. 15 Return NULL and set errno on error. 16 If argument is not NULL (previous usage allocate memory), call free() 17*/ 18 19char* FAST_FUNC 20xrealloc_getcwd_or_warn(char *cwd) 21{ 22#define PATH_INCR 64 23 24 char *ret; 25 unsigned path_max; 26 27 path_max = 128; /* 128 + 64 should be enough for 99% of cases */ 28 29 while (1) { 30 path_max += PATH_INCR; 31 cwd = xrealloc(cwd, path_max); 32 ret = getcwd(cwd, path_max); 33 if (ret == NULL) { 34 if (errno == ERANGE) 35 continue; 36 free(cwd); 37 bb_perror_msg("getcwd"); 38 return NULL; 39 } 40 cwd = xrealloc(cwd, strlen(cwd) + 1); 41 return cwd; 42 } 43} 44