source: trunk/third/findutils/lib/xgetcwd.c @ 18890

Revision 18890, 1.9 KB checked in by zacheiss, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18889, which included commits to RCS files with non-trunk default branches.
Line 
1/* xgetcwd.c -- return current directory with unlimited length
2   Copyright (C) 1992, 1996 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   You should have received a copy of the GNU General Public License
15   along with this program; if not, write to the Free Software Foundation,
16   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
17
18/* Written by David MacKenzie <djm@gnu.ai.mit.edu>.  */
19
20#if HAVE_CONFIG_H
21# include <config.h>
22#endif
23
24#include <stdio.h>
25#include <errno.h>
26#ifndef errno
27extern int errno;
28#endif
29
30#include <sys/types.h>
31#include "pathmax.h"
32
33#if HAVE_GETCWD
34char *getcwd ();
35#else
36char *getwd ();
37# define getcwd(Buf, Max) getwd (Buf)
38#endif
39
40/* Amount to increase buffer size by in each try. */
41#define PATH_INCR 32
42
43char *xmalloc ();
44char *xrealloc ();
45void free ();
46
47/* Return the current directory, newly allocated, arbitrarily long.
48   Return NULL and set errno on error. */
49
50char *
51xgetcwd ()
52{
53  char *cwd;
54  char *ret;
55  unsigned path_max;
56
57  errno = 0;
58  path_max = (unsigned) PATH_MAX;
59  path_max += 2;                /* The getcwd docs say to do this. */
60
61  cwd = xmalloc (path_max);
62
63  errno = 0;
64  while ((ret = getcwd (cwd, path_max)) == NULL && errno == ERANGE)
65    {
66      path_max += PATH_INCR;
67      cwd = xrealloc (cwd, path_max);
68      errno = 0;
69    }
70
71  if (ret == NULL)
72    {
73      int save_errno = errno;
74      free (cwd);
75      errno = save_errno;
76      return NULL;
77    }
78  return cwd;
79}
Note: See TracBrowser for help on using the repository browser.