blob: d61605a04cf90f7e5a6f962b7ddf9a302908755f [file] [log] [blame]
<html lang="en">
<head>
<title>Symbolic Links - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="File-System-Interface.html#File-System-Interface" title="File System Interface">
<link rel="prev" href="Hard-Links.html#Hard-Links" title="Hard Links">
<link rel="next" href="Deleting-Files.html#Deleting-Files" title="Deleting Files">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Symbolic-Links"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Deleting-Files.html#Deleting-Files">Deleting Files</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Hard-Links.html#Hard-Links">Hard Links</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="File-System-Interface.html#File-System-Interface">File System Interface</a>
<hr>
</div>
<h3 class="section">14.5 Symbolic Links</h3>
<p><a name="index-soft-link-1462"></a><a name="index-link_002c-soft-1463"></a><a name="index-symbolic-link-1464"></a><a name="index-link_002c-symbolic-1465"></a>
The GNU system supports <dfn>soft links</dfn> or <dfn>symbolic links</dfn>. This
is a kind of &ldquo;file&rdquo; that is essentially a pointer to another file
name. Unlike hard links, symbolic links can be made to directories or
across file systems with no restrictions. You can also make a symbolic
link to a name which is not the name of any file. (Opening this link
will fail until a file by that name is created.) Likewise, if the
symbolic link points to an existing file which is later deleted, the
symbolic link continues to point to the same file name even though the
name no longer names any file.
<p>The reason symbolic links work the way they do is that special things
happen when you try to open the link. The <code>open</code> function realizes
you have specified the name of a link, reads the file name contained in
the link, and opens that file name instead. The <code>stat</code> function
likewise operates on the file that the symbolic link points to, instead
of on the link itself.
<p>By contrast, other operations such as deleting or renaming the file
operate on the link itself. The functions <code>readlink</code> and
<code>lstat</code> also refrain from following symbolic links, because their
purpose is to obtain information about the link. <code>link</code>, the
function that makes a hard link, does too. It makes a hard link to the
symbolic link, which one rarely wants.
<p>Some systems have for some functions operating on files have a limit on
how many symbolic links are followed when resolving a path name. The
limit if it exists is published in the <samp><span class="file">sys/param.h</span></samp> header file.
<!-- sys/param.h -->
<!-- BSD -->
<div class="defun">
&mdash; Macro: int <b>MAXSYMLINKS</b><var><a name="index-MAXSYMLINKS-1466"></a></var><br>
<blockquote>
<p>The macro <code>MAXSYMLINKS</code> specifies how many symlinks some function
will follow before returning <code>ELOOP</code>. Not all functions behave the
same and this value is not the same a that returned for
<code>_SC_SYMLOOP</code> by <code>sysconf</code>. In fact, the <code>sysconf</code>
result can indicate that there is no fixed limit although
<code>MAXSYMLINKS</code> exists and has a finite value.
</p></blockquote></div>
<p>Prototypes for most of the functions listed in this section are in
<samp><span class="file">unistd.h</span></samp>.
<a name="index-unistd_002eh-1467"></a>
<!-- unistd.h -->
<!-- BSD -->
<div class="defun">
&mdash; Function: int <b>symlink</b> (<var>const char *oldname, const char *newname</var>)<var><a name="index-symlink-1468"></a></var><br>
<blockquote><p>The <code>symlink</code> function makes a symbolic link to <var>oldname</var> named
<var>newname</var>.
<p>The normal return value from <code>symlink</code> is <code>0</code>. A return value
of <code>-1</code> indicates an error. In addition to the usual file name
syntax errors (see <a href="File-Name-Errors.html#File-Name-Errors">File Name Errors</a>), the following <code>errno</code>
error conditions are defined for this function:
<dl>
<dt><code>EEXIST</code><dd>There is already an existing file named <var>newname</var>.
<br><dt><code>EROFS</code><dd>The file <var>newname</var> would exist on a read-only file system.
<br><dt><code>ENOSPC</code><dd>The directory or file system cannot be extended to make the new link.
<br><dt><code>EIO</code><dd>A hardware error occurred while reading or writing data on the disk.
</dl>
</p></blockquote></div>
<!-- unistd.h -->
<!-- BSD -->
<div class="defun">
&mdash; Function: int <b>readlink</b> (<var>const char *filename, char *buffer, size_t size</var>)<var><a name="index-readlink-1469"></a></var><br>
<blockquote><p>The <code>readlink</code> function gets the value of the symbolic link
<var>filename</var>. The file name that the link points to is copied into
<var>buffer</var>. This file name string is <em>not</em> null-terminated;
<code>readlink</code> normally returns the number of characters copied. The
<var>size</var> argument specifies the maximum number of characters to copy,
usually the allocation size of <var>buffer</var>.
<p>If the return value equals <var>size</var>, you cannot tell whether or not
there was room to return the entire name. So make a bigger buffer and
call <code>readlink</code> again. Here is an example:
<pre class="smallexample"> char *
readlink_malloc (const char *filename)
{
int size = 100;
char *buffer = NULL;
while (1)
{
buffer = (char *) xrealloc (buffer, size);
int nchars = readlink (filename, buffer, size);
if (nchars &lt; 0)
{
free (buffer);
return NULL;
}
if (nchars &lt; size)
return buffer;
size *= 2;
}
}
</pre>
<!-- @group Invalid outside example. -->
<p>A value of <code>-1</code> is returned in case of error. In addition to the
usual file name errors (see <a href="File-Name-Errors.html#File-Name-Errors">File Name Errors</a>), the following
<code>errno</code> error conditions are defined for this function:
<dl>
<dt><code>EINVAL</code><dd>The named file is not a symbolic link.
<br><dt><code>EIO</code><dd>A hardware error occurred while reading or writing data on the disk.
</dl>
<!-- @end group -->
</p></blockquote></div>
<p>In some situations it is desirable to resolve all the
symbolic links to get the real
name of a file where no prefix names a symbolic link which is followed
and no filename in the path is <code>.</code> or <code>..</code>. This is for
instance desirable if files have to be compare in which case different
names can refer to the same inode.
<!-- stdlib.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: char * <b>canonicalize_file_name</b> (<var>const char *name</var>)<var><a name="index-canonicalize_005ffile_005fname-1470"></a></var><br>
<blockquote>
<p>The <code>canonicalize_file_name</code> function returns the absolute name of
the file named by <var>name</var> which contains no <code>.</code>, <code>..</code>
components nor any repeated path separators (<code>/</code>) or symlinks. The
result is passed back as the return value of the function in a block of
memory allocated with <code>malloc</code>. If the result is not used anymore
the memory should be freed with a call to <code>free</code>.
<p>If any of the path components is missing the function returns a NULL
pointer. This is also what is returned if the length of the path
reaches or exceeds <code>PATH_MAX</code> characters. In any case
<code>errno</code> is set accordingly.
<dl>
<dt><code>ENAMETOOLONG</code><dd>The resulting path is too long. This error only occurs on systems which
have a limit on the file name length.
<br><dt><code>EACCES</code><dd>At least one of the path components is not readable.
<br><dt><code>ENOENT</code><dd>The input file name is empty.
<br><dt><code>ENOENT</code><dd>At least one of the path components does not exist.
<br><dt><code>ELOOP</code><dd>More than <code>MAXSYMLINKS</code> many symlinks have been followed.
</dl>
<p>This function is a GNU extension and is declared in <samp><span class="file">stdlib.h</span></samp>.
</p></blockquote></div>
<p>The Unix standard includes a similar function which differs from
<code>canonicalize_file_name</code> in that the user has to provide the buffer
where the result is placed in.
<!-- stdlib.h -->
<!-- XPG -->
<div class="defun">
&mdash; Function: char * <b>realpath</b> (<var>const char *restrict name, char *restrict resolved</var>)<var><a name="index-realpath-1471"></a></var><br>
<blockquote>
<p>A call to <code>realpath</code> where the <var>resolved</var> parameter is
<code>NULL</code> behaves exactly like <code>canonicalize_file_name</code>. The
function allocates a buffer for the file name and returns a pointer to
it. If <var>resolved</var> is not <code>NULL</code> it points to a buffer into
which the result is copied. It is the callers responsibility to
allocate a buffer which is large enough. On systems which define
<code>PATH_MAX</code> this means the buffer must be large enough for a
pathname of this size. For systems without limitations on the pathname
length the requirement cannot be met and programs should not call
<code>realpath</code> with anything but <code>NULL</code> for the second parameter.
<p>One other difference is that the buffer <var>resolved</var> (if nonzero) will
contain the part of the path component which does not exist or is not
readable if the function returns <code>NULL</code> and <code>errno</code> is set to
<code>EACCES</code> or <code>ENOENT</code>.
<p>This function is declared in <samp><span class="file">stdlib.h</span></samp>.
</p></blockquote></div>
<p>The advantage of using this function is that it is more widely
available. The drawback is that it reports failures for long path on
systems which have no limits on the file name length.
</body></html>