NAME
getcwd — get the
pathname of the current working directory
SYNOPSIS
#include
<unistd.h>
char *getcwd(char *buf, size_t size);
DESCRIPTION
The getcwd () function shall place an
absolute pathname of the current working directory in the array pointed to
by buf, and return buf. The pathname
shall contain no components that are dot or dot-dot, or are symbolic
links.
If there are multiple pathnames that
getcwd () could place in the array pointed to by
buf, one beginning with a single <slash> character
and one or more beginning with two <slash> characters, then
getcwd () shall place the pathname beginning with a
single <slash> character in the array. The pathname shall not contain
any unnecessary <slash> characters after the leading one or two
<slash> characters.
The size argument is the size in bytes of the
character array pointed to by the buf argument. If
buf is a null pointer, the behavior of
getcwd () is unspecified.
RETURN VALUE
Upon successful completion, getcwd ()
shall return the buf argument. Otherwise,
getcwd () shall return a null pointer and set
errno to indicate the error. The contents of the array
pointed to by buf are then undefined.
ERRORS
The getcwd () function shall fail if:
- [EINVAL]
- The size argument is 0.
- [ERANGE]
- The size argument is greater than 0, but is smaller than the length of the string +1.
The getcwd () function may fail if:
EXAMPLES
The following example uses {PATH_MAX} as the initial buffer size
(unless it is indeterminate or very large), and calls
getcwd () with progressively larger buffers until it
does not give an [ERANGE] error.
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
...
long path_max;
size_t size;
char *buf;
char *ptr;
path_max = pathconf(".", _PC_PATH_MAX);
if (path_max == -1)
size = 1024;
else if (path_max > 10240)
size = 10240;
else
size = path_max;
for (buf = ptr = NULL; ptr == NULL; size *= 2)
{
if ((buf = realloc(buf, size)) == NULL)
{
... handle error ...
}
ptr = getcwd(buf, size);
if (ptr == NULL && errno != ERANGE)
{
... handle error ...
}
}
...
free (buf);
APPLICATION USAGE
If the pathname obtained from getcwd () is
longer than {PATH_MAX} bytes, it could produce an [ENAMETOOLONG] error if
passed to chdir(3). Therefore, in order to return to that
directory it may be necessary to break the pathname into sections shorter
than {PATH_MAX} bytes and call chdir(3) on each section in
turn (the first section being an absolute pathname and subsequent sections
being relative pathnames). A simpler way to handle saving and restoring the
working directory when it may be deeper than {PATH_MAX} bytes in the file
hierarchy is to use a file descriptor and fchdir(3),
rather than getcwd () and
chdir(3). However, the two methods do have some
differences. The fchdir(3) approach causes the program to
restore a working directory even if it has been renamed in the meantime,
whereas the chdir(3) approach restores to a directory with
the same name as the original, even if the directories were renamed in the
meantime. Since the fchdir(3) approach does not access
parent directories, it can succeed when getcwd ()
would fail due to permissions problems. In applications conforming to
earlier versions of this standard, it was not possible to use the
fchdir(3) approach when the working directory is
searchable but not readable, as the only way to open a directory was with
O_RDONLY, whereas the getcwd () approach can succeed
in this case.
RATIONALE
Having getcwd () take no arguments and
instead use the malloc(3) function to produce space for
the returned argument was considered. The advantage is that
getcwd () knows how big the working directory
pathname is and can allocate an appropriate amount of space. But the
programmer would have to use the free(3) function to free
the resulting object, or each use of getcwd () would
further reduce the available memory. Finally, getcwd
() is taken from the SVID where it has the two arguments used in this volume
of POSIX.1-2017.
The older function getwd () was rejected for use in this context because it had only a buffer argument and no size argument, and thus had no way to prevent overwriting the buffer, except to depend on the programmer to provide a large enough buffer.
On some implementations, if buf is a null
pointer, getcwd () may obtain size
bytes of memory using malloc(3). In this case, the pointer
returned by getcwd () may be used as the argument in
a subsequent call to free(3). Invoking
getcwd () with buf as a null
pointer is not recommended in conforming applications.
Earlier implementations of getcwd ()
sometimes generated pathnames like
"../../../subdirname" internally, using
them to explore the path of ancestor directories back to the root. If one of
these internal pathnames exceeded {PATH_MAX} in length, the implementation
could fail with errno set to [ENAMETOOLONG]. This is no
longer allowed.
If a program is operating in a directory where some (grand)parent
directory does not permit reading, getcwd () may
fail, as in most implementations it must read the directory to determine the
name of the file. This can occur if search, but not read, permission is
granted in an intermediate directory, or if the program is placed in that
directory by some more privileged process (for example, login). Including
the [EACCES] error condition makes the reporting of the error consistent and
warns the application developer that getcwd () can
fail for reasons beyond the control of the application developer or user.
Some implementations can avoid this occurrence (for example, by implementing
getcwd () using pwd(1), where
pwd(1) is a set-user-root process), thus the error was
made optional. Since this volume of POSIX.1-2017 permits the addition of
other errors, this would be a common addition and yet one that applications
could not be expected to deal with without this addition.
FUTURE DIRECTIONS
None.
SEE ALSO
XBD <unistd.h>
CHANGE HISTORY
First released in Issue 1. Derived from Issue 1 of the SVID.
Issue 6
The following new requirements on POSIX implementations derive from alignment with the Single UNIX Specification:
- The [ENOMEM] optional error condition is added.
Issue 7
Austin Group Interpretation 1003.1-2001 #140 is applied, changing the text for consistency with the pwd(1) utility, adding text to address the case where the current directory is deeper in the file hierarchy than {PATH_MAX} bytes, and adding the requirements relating to pathnames beginning with two <slash> characters.