]> git.ipfire.org Git - thirdparty/man-pages.git/blobdiff - man3/getcwd.3
dlopen.3: Clarify that constructors are called only when library is first loaded
[thirdparty/man-pages.git] / man3 / getcwd.3
index c0c53b3118ebc23072883942a49b630a86ef5e30..c8a691b4adf181bdbef07ce0a637f9ae116b5053 100644 (file)
@@ -1,5 +1,6 @@
-.\" (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de)
+.\" Copyright (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de)
 .\"
+.\" %%%LICENSE_START(VERBATIM)
 .\" Permission is granted to make and distribute verbatim copies of this
 .\" manual provided the copyright notice and this permission notice are
 .\" preserved on all copies.
@@ -19,7 +20,8 @@
 .\"
 .\" Formatted or processed versions of this manual, if unaccompanied by
 .\" the source, must acknowledge the copyright and authors of this work.
-.\" License.
+.\" %%%LICENSE_END
+.\"
 .\" Modified Wed Jul 21 22:35:42 1993 by Rik Faith (faith@cs.unc.edu)
 .\" Modified 18 Mar 1996 by Martin Schulze (joey@infodrom.north.de):
 .\"   Corrected description of getwd().
 .\" Modified Mon Dec 11 13:32:51 MET 2000 by aeb
 .\" Modified Thu Apr 22 03:49:15 CEST 2002 by Roger Luethi <rl@hellgate.ch>
 .\"
-.TH GETCWD 3 2007-07-26 "GNU" "Linux Programmer's Manual"
+.TH GETCWD 3 2018-04-30 "GNU" "Linux Programmer's Manual"
 .SH NAME
-getcwd, getwd, get_current_dir_name \- Get current working directory
+getcwd, getwd, get_current_dir_name \- get current working directory
 .SH SYNOPSIS
 .nf
 .B #include <unistd.h>
-.sp
+.PP
 .BI "char *getcwd(char *" buf ", size_t " size );
-.sp
+.PP
 .BI "char *getwd(char *" buf );
-.sp
+.PP
 .B "char *get_current_dir_name(void);"
 .fi
-.sp
+.PP
 .in -4n
 Feature Test Macro Requirements for glibc (see
 .BR feature_test_macros (7)):
 .in
-.sp
-.BR getcwd ():
-_BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500
-.br
+.PP
 .BR get_current_dir_name ():
+.RS
 _GNU_SOURCE
+.RE
+.PP
+.BR getwd ():
+.ad l
+.RS 4
+.PD 0
+.TP 4
+Since glibc 2.12:
+.nf
+(_XOPEN_SOURCE\ >=\ 500) && ! (_POSIX_C_SOURCE\ >=\ 200809L)
+    || /* Glibc since 2.19: */ _DEFAULT_SOURCE
+    || /* Glibc versions <= 2.19: */ _BSD_SOURCE
+.TP 4
+.fi
+Before glibc 2.12:
+_BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500
+.\"    || _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED
+.PD
+.RE
+.ad b
 .SH DESCRIPTION
+These functions return a null-terminated string containing an
+absolute pathname that is the current working directory of
+the calling process.
+The pathname is returned as the function result and via the argument
+.IR buf ,
+if present.
+.PP
 The
 .BR getcwd ()
 function copies an absolute pathname of the current working directory
@@ -60,28 +87,23 @@ to the array pointed to by
 which is of length
 .IR size .
 .PP
-If the current absolute pathname would require a buffer longer than
+If the length of the absolute pathname of the current working directory,
+including the terminating null byte, exceeds
 .I size
-elements, NULL is returned, and
+bytes, NULL is returned, and
 .I errno
 is set to
 .BR ERANGE ;
 an application should check for this error, and allocate a larger
 buffer if necessary.
 .PP
-If
-.I buf
-is NULL, the behavior of
-.BR getcwd ()
-is undefined.
-.PP
-As an extension to the POSIX.1-2001 standard, Linux (libc4, libc5, glibc)
+As an extension to the POSIX.1-2001 standard, glibc's
 .BR getcwd ()
 allocates the buffer dynamically using
 .BR malloc (3)
 if
 .I buf
-is NULL on call.
+is NULL.
 In this case, the allocated buffer has the length
 .I size
 unless
@@ -89,21 +111,24 @@ unless
 is zero, when
 .I buf
 is allocated as big as necessary.
-It is possible (and, indeed,
-advisable) to
+The caller should
 .BR free (3)
-the buffers if they have been obtained this way.
-
-.BR get_current_dir_name (),
+the returned buffer.
+.PP
+.BR get_current_dir_name ()
 will
 .BR malloc (3)
-an array big enough to hold the current directory name.
+an array big enough to hold the absolute pathname of
+the current working directory.
 If the environment
 variable
 .B PWD
 is set, and its value is correct, then that value will be returned.
-
-.BR getwd (),
+The caller should
+.BR free (3)
+the returned buffer.
+.PP
+.BR getwd ()
 does not
 .BR malloc (3)
 any memory.
@@ -112,27 +137,37 @@ The
 argument should be a pointer to an array at least
 .B PATH_MAX
 bytes long.
-.BR getwd ()
-does only return the first
+If the length of the absolute pathname of the current working directory,
+including the terminating null byte, exceeds
 .B PATH_MAX
-bytes of the actual pathname.
-Note that
+bytes, NULL is returned, and
+.I errno
+is set to
+.BR ENAMETOOLONG .
+(Note that on some systems,
 .B PATH_MAX
-need not be a compile-time constant; it may depend on the file system
-and may even be unlimited.
+may not be a compile-time constant;
+furthermore, its value may depend on the filesystem, see
+.BR pathconf (3).)
 For portability and security reasons, use of
 .BR getwd ()
 is deprecated.
-.SH "RETURN VALUE"
-NULL
-on failure with
+.SH RETURN VALUE
+On success, these functions return a pointer to a string containing
+the pathname of the current working directory.
+In the case
+.BR getcwd ()
+and
+.BR getwd ()
+this is the same value as
+.IR buf .
+.PP
+On failure, these functions return NULL, and
 .I errno
-set accordingly, and
-.I buf
-on success.
+is set to indicate the error.
 The contents of the array pointed to by
 .I buf
-is undefined on error.
+are undefined on error.
 .SH ERRORS
 .TP
 .B EACCES
@@ -149,33 +184,79 @@ argument is zero and
 .I buf
 is not a null pointer.
 .TP
+.B EINVAL
+.BR getwd ():
+.I buf
+is NULL.
+.TP
+.B ENAMETOOLONG
+.BR getwd ():
+The size of the null-terminated absolute pathname string exceeds
+.B PATH_MAX
+bytes.
+.TP
 .B ENOENT
 The current working directory has been unlinked.
 .TP
+.B ENOMEM
+Out of memory.
+.TP
 .B ERANGE
 The
 .I size
-argument is less than the length of the working directory name.
+argument is less than the length of the absolute pathname of the
+working directory, including the terminating null byte.
 You need to allocate a bigger array and try again.
-.SH "CONFORMING TO"
+.SH ATTRIBUTES
+For an explanation of the terms used in this section, see
+.BR attributes (7).
+.TS
+allbox;
+lbw22 lb lb
+l l l.
+Interface      Attribute       Value
+T{
+.BR getcwd (),
+.BR getwd ()
+T}     Thread safety   MT-Safe
+T{
+.BR get_current_dir_name ()
+T}     Thread safety   MT-Safe env
+.TE
+.SH CONFORMING TO
 .BR getcwd ()
 conforms to POSIX.1-2001.
+Note however that POSIX.1-2001 leaves the behavior of
+.BR getcwd ()
+unspecified if
+.I buf
+is NULL.
+.PP
 .BR getwd ()
 is present in POSIX.1-2001, but marked LEGACY.
+POSIX.1-2008 removes the specification of
+.BR getwd ().
+Use
+.BR getcwd ()
+instead.
+POSIX.1-2001
+does not define any errors for
+.BR getwd ().
+.PP
 .BR get_current_dir_name ()
 is a GNU extension.
 .SH NOTES
-Under Linux, the function
+Under Linux, these functions make use of the
 .BR getcwd ()
-is a system call (since 2.1.92).
-On older systems it would query
+system call (available since Linux 2.1.92).
+On older systems they would query
 .IR /proc/self/cwd .
-If both system call and proc file system are missing, a
+If both system call and proc filesystem are missing, a
 generic implementation is called.
 Only in that case can
 these calls fail under Linux with
 .BR EACCES .
-.LP
+.PP
 These functions are often used to save the location of the current working
 directory for the purpose of returning to it later.
 Opening the current
@@ -183,7 +264,57 @@ directory (".") and calling
 .BR fchdir (2)
 to return is usually a faster and more reliable alternative when sufficiently
 many file descriptors are available, especially on platforms other than Linux.
-.SH "SEE ALSO"
+.\"
+.SS C library/kernel differences
+On Linux, the kernel provides a
+.BR getcwd ()
+system call, which the functions described in this page will use if possible.
+The system call takes the same arguments as the library function
+of the same name, but is limited to returning at most
+.BR PATH_MAX
+bytes.
+(Before Linux 3.12,
+.\" commit 3272c544da48f8915a0e34189182aed029bd0f2b
+the limit on the size of the returned pathname was the system page size.
+On many architectures,
+.BR PATH_MAX
+and the system page size are both 4096 bytes,
+but a few architectures have a larger page size.)
+If the length of the pathname of the current working directory
+exceeds this limit, then the system call fails with the error
+.BR ENAMETOOLONG .
+In this case, the library functions fall back to
+a (slower) alternative implementation that returns the full pathname.
+.PP
+Following a change in Linux 2.6.36,
+.\" commit 8df9d1a4142311c084ffeeacb67cd34d190eff74
+the pathname returned by the
+.BR getcwd ()
+system call will be prefixed with the string "(unreachable)"
+if the current directory is not below the root directory of the current
+process (e.g., because the process set a new filesystem root using
+.BR chroot (2)
+without changing its current directory into the new root).
+Such behavior can also be caused by an unprivileged user by changing
+the current directory into another mount namespace.
+When dealing with pathname from untrusted sources, callers of the
+functions described in this page
+should consider checking whether the returned pathname starts
+with '/' or '(' to avoid misinterpreting an unreachable path
+as a relative pathname.
+.SH BUGS
+Since the Linux 2.6.36 change that added "(unreachable)" in the
+circumstances described above, the glibc implementation of
+.BR getcwd ()
+has failed to conform to POSIX and returned a relative pathname when the API
+contract requires an absolute pathname.
+With glibc 2.27 onwards this is corrected;
+calling
+.BR getcwd ()
+from such a pathname will now result in failure with
+.BR ENOENT .
+.SH SEE ALSO
+.BR pwd (1),
 .BR chdir (2),
 .BR fchdir (2),
 .BR open (2),