realpath
REALPATH(3) Linux Programmer's Manual REALPATH(3)
NAME
realpath - return the canonicalized absolute pathname
SYNOPSIS
#include <limits.h>
#include <stdlib.h>
char *realpath(const char *path, char *resolved_path);
DESCRIPTION
realpath expands all symbolic links and resolves references to '/./',
'/../' and extra '/' characters in the null terminated string named by
path and stores the canonicalized absolute pathname in the buffer of
size PATH_MAX named by resolved_path. The resulting path will have no
symbolic link, '/./' or '/../' components.
RETURN VALUE
If there is no error, it returns a pointer to the resolved_path.
Otherwise it returns a NULL pointer, and the contents of the array
resolved_path are undefined. The global variable errno is set to indi-
cate the error.
ERRORS
EACCES Read or search permission was denied for a component of the path
prefix.
EINVAL Either path or resolved_path is NULL. (In libc5 this would just
cause a segfault.)
EIO An I/O error occurred while reading from the file system.
ELOOP Too many symbolic links were encountered in translating the
pathname.
ENAMETOOLONG
A component of a path name exceeded NAME_MAX characters, or an
entire path name exceeded PATH_MAX characters.
ENOENT The named file does not exist.
ENOTDIR
A component of the path prefix is not a directory.
BUGS
The libc4 and libc5 implementation contains a buffer overflow (fixed in
libc-5.4.13). Thus, suid programs like mount need a private version.
The length of the output buffer should have been an additional parame-
ter, especially since pathconf(3) warns that the result of pathconf()
may be huge and unsuitable for mallocing memory.
HISTORY
The realpath function first appeared in BSD 4.4, contributed by Jan-
Simon Pendry. In Linux this function appears in libc 4.5.21.
CONFORMING TO
In BSD 4.4 and Solaris the limit on the pathname length is MAXPATHLEN
(found in <sys/param.h>). The SUSv2 prescribes PATH_MAX and NAME_MAX,
as found in <limits.h> or provided by the pathconf() function. A typi-
cal source fragment would be
#ifdef PATH_MAX
path_max = PATH_MAX;
#else
path_max = pathconf (path, _PC_PATH_MAX);
if (path_max <= 0)
path_max = 4096;
#endif
The BSD 4.4, Linux and SUSv2 versions always return an absolute path
name. Solaris may return a relative path name when the path argument is
relative. The prototype of realpath is given in <unistd.h> in libc4
and libc5, but in <stdlib.h> everywhere else.
SEE ALSO
readlink(2), getcwd(3), pathconf(3), sysconf(3)
1999-08-24 REALPATH(3)