source: trunk/third/gettext/lib/xgetcwd.c @ 16931

Revision 16931, 1.9 KB checked in by ghudson, 23 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r16930, 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, 2000 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
40extern void *xmalloc ();
41extern char *xstrdup ();
42extern void free ();
43
44/* Return the current directory, newly allocated, arbitrarily long.
45   Return NULL and set errno on error. */
46
47char *
48xgetcwd ()
49{
50  char *ret;
51  unsigned path_max;
52  char buf[1024];
53
54  errno = 0;
55  ret = getcwd (buf, sizeof (buf));
56  if (ret != NULL)
57    return xstrdup (buf);
58  if (errno != ERANGE)
59    return NULL;
60
61  path_max = (unsigned) PATH_MAX;
62  path_max += 2;                /* The getcwd docs say to do this. */
63
64  for (;;)
65    {
66      char *cwd = (char *) xmalloc (path_max);
67
68      errno = 0;
69      ret = getcwd (cwd, path_max);
70      if (ret != NULL)
71        return ret;
72      if (errno != ERANGE)
73        {
74          int save_errno = errno;
75          free (cwd);
76          errno = save_errno;
77          return NULL;
78        }
79
80      free (cwd);
81
82      path_max += path_max / 16;
83      path_max += 32;
84    }
85}
Note: See TracBrowser for help on using the repository browser.