realpath - return the canonicalized absolute pathname
char *realpath(const char *path, char *resolved_path);
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.
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.
EACCES Read or search permission was denied for a component of the path
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
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.
A component of the path prefix is not a directory.
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.
The realpath function first appeared in BSD 4.4, contributed by Jan-
Simon Pendry. In Linux this function appears in libc 4.5.21.
path_max = pathconf (path, _PC_PATH_MAX);
if (path_max <= 0)
path_max = 4096;
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.
readlink(2), getcwd(3), pathconf(3), sysconf(3)