busybox/libbb/xgetcwd.c
<<
>>
Prefs
   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