
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
        "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <link rel="stylesheet" type="text/css" href="../../../style.css" title="style" />
    <link rel="stylesheet" type="text/css" href="../style.css" title="style" />
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />

    <title>readlink.3p - Linux manual page</title>
</head>

<body>

<div class="page-top"><a id="top_of_page"></a></div>
<!--%%%TOP_BAR%%%-->
    <div class="nav-bar">
        <table class="nav-table">
            <tr>
                <td class="nav-cell">
                    <p class="nav-text">
                        <a href="http://man7.org/index.html">man7.org</a> &gt; Linux &gt; <a href="../index.html">man-pages</a>
                    </p>
                </td>
                <td class="training-cell">
                    <p class="training-text"><a class="training-link" href="http://man7.org/training/">Linux/UNIX system programming training</a></p>
                </td>
            </tr>
        </table>
    </div>

<hr class="nav-end" />

<!--%%%PAGE_START%%%-->


<table class="sec-table">
<tr>
    <td>
        <p class="section-dir">
<a href="readlinkat.3p.html#PROLOG">PROLOG</a> | <a href="readlinkat.3p.html#NAME">NAME</a> | <a href="readlinkat.3p.html#SYNOPSIS">SYNOPSIS</a> | <a href="readlinkat.3p.html#DESCRIPTION">DESCRIPTION</a> | <a href="readlinkat.3p.html#RETURN_VALUE">RETURN&nbsp;VALUE</a> | <a href="readlinkat.3p.html#ERRORS">ERRORS</a> | <a href="readlinkat.3p.html#EXAMPLES">EXAMPLES</a> | <a href="readlinkat.3p.html#APPLICATION_USAGE">APPLICATION&nbsp;USAGE</a> | <a href="readlinkat.3p.html#RATIONALE">RATIONALE</a> | <a href="readlinkat.3p.html#FUTURE_DIRECTIONS">FUTURE&nbsp;DIRECTIONS</a> | <a href="readlinkat.3p.html#SEE_ALSO">SEE&nbsp;ALSO</a> | <a href="readlinkat.3p.html#COPYRIGHT">COPYRIGHT</a>
        </p>
    </td>
    <td class="search-box">
        <div class="man-search-box">

            <form method="get" action="http://www.google.com/search">
                <fieldset class="man-search">
                    <input type="text" name="q" size="10" maxlength="255" value="" />
                    <input type="hidden" name="sitesearch" value="man7.org/linux/man-pages" />
                    <input type="submit" name="sa" value="Search online pages" />
                </fieldset>
            </form>

        </div>
    </td>
    <td> </td>
</tr>
</table>

<pre>
<span class="headline">READLINK(3P)              POSIX Programmer's Manual             READLINK(3P)</span>
</pre>
<h2><a id="PROLOG" href="readlinkat.3p.html#PROLOG"></a>PROLOG  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       This manual page is part of the POSIX Programmer's Manual.  The Linux
       implementation of this interface may differ (consult the
       corresponding Linux manual page for details of Linux behavior), or
       the interface may not be implemented on Linux.
</pre>
<h2><a id="NAME" href="readlinkat.3p.html#NAME"></a>NAME  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       readlink, readlinkat — read the contents of a symbolic link
</pre>
<h2><a id="SYNOPSIS" href="readlinkat.3p.html#SYNOPSIS"></a>SYNOPSIS  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       #include &lt;unistd.h&gt;

       ssize_t readlink(const char *restrict <i>path</i>, char *restrict <i>buf</i>,
           size_t <i>bufsize</i>);
       ssize_t readlinkat(int <i>fd</i>, const char *restrict <i>path</i>,
           char *restrict <i>buf</i>, size_t <i>bufsize</i>);
</pre>
<h2><a id="DESCRIPTION" href="readlinkat.3p.html#DESCRIPTION"></a>DESCRIPTION  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       The <i>readlink</i>() function shall place the contents of the symbolic link
       referred to by <i>path</i> in the buffer <i>buf</i> which has size <i>bufsize</i>.  If the
       number of bytes in the symbolic link is less than <i>bufsize</i>, the
       contents of the remainder of <i>buf</i> are unspecified. If the <i>buf</i> argument
       is not large enough to contain the link content, the first <i>bufsize</i>
       bytes shall be placed in <i>buf</i>.

       If the value of <i>bufsize</i> is greater than {SSIZE_MAX}, the result is
       implementation-defined.

       Upon successful completion, <i>readlink</i>() shall mark for update the last
       data access timestamp of the symbolic link.

       The <i>readlinkat</i>() function shall be equivalent to the <i>readlink</i>()
       function except in the case where <i>path</i> specifies a relative path. In
       this case the symbolic link whose content is read is relative to the
       directory associated with the file descriptor <i>fd</i> instead of the
       current working directory. If the file descriptor was opened without
       O_SEARCH, the function shall check whether directory searches are
       permitted using the current permissions of the directory underlying
       the file descriptor. If the file descriptor was opened with O_SEARCH,
       the function shall not perform the check.

       If <i>readlinkat</i>() is passed the special value AT_FDCWD in the <i>fd</i>
       parameter, the current working directory shall be used and the
       behavior shall be identical to a call to <i>readlink</i>().
</pre>
<h2><a id="RETURN_VALUE" href="readlinkat.3p.html#RETURN_VALUE"></a>RETURN VALUE  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       Upon successful completion, these functions shall return the count of
       bytes placed in the buffer. Otherwise, these functions shall return a
       value of −1, leave the buffer unchanged, and set <i><a href="errno.3.html">errno</a></i> to indicate
       the error.
</pre>
<h2><a id="ERRORS" href="readlinkat.3p.html#ERRORS"></a>ERRORS  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       These functions shall fail if:

       <b>EACCES </b>Search permission is denied for a component of the path prefix
              of <i>path</i>.

       <b>EINVAL </b>The <i>path</i> argument names a file that is not a symbolic link.

       <b>EIO    </b>An I/O error occurred while reading from the file system.

       <b>ELOOP  </b>A loop exists in symbolic links encountered during resolution
              of the <i>path</i> argument.

       <b>ENAMETOOLONG</b>
              The length of a component of a pathname is longer than
              {NAME_MAX}.

       <b>ENOENT </b>A component of <i>path</i> does not name an existing file or <i>path</i> is
              an empty string.

       <b>ENOTDIR</b>
              A component of the path prefix names an existing file that is
              neither a directory nor a symbolic link to a directory, or the
              <i>path</i> argument contains at least one non-&lt;slash&gt; character and
              ends with one or more trailing &lt;slash&gt; characters and the last
              pathname component names an existing file that is neither a
              directory nor a symbolic link to a directory.

       The <i>readlinkat</i>() function shall fail if:

       <b>EACCES </b><i>fd</i> was not opened with O_SEARCH and the permissions of the
              directory underlying <i>fd</i> do not permit directory searches.

       <b>EBADF  </b>The <i>path</i> argument does not specify an absolute path and the <i>fd</i>
              argument is neither AT_FDCWD nor a valid file descriptor open
              for reading or searching.

       <b>ENOTDIR</b>
              The <i>path</i> argument is not an absolute path and <i>fd</i> is a file
              descriptor associated with a non-directory file.

       These functions may fail if:

       <b>ELOOP  </b>More than {SYMLOOP_MAX} symbolic links were encountered during
              resolution of the <i>path</i> argument.

       <b>ENAMETOOLONG</b>
              The length of a pathname exceeds {PATH_MAX}, or pathname
              resolution of a symbolic link produced an intermediate result
              with a length that exceeds {PATH_MAX}.

       <i>The following sections are informative.</i>
</pre>
<h2><a id="EXAMPLES" href="readlinkat.3p.html#EXAMPLES"></a>EXAMPLES  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
   <b>Reading the Name of a Symbolic Link</b>
       The following example shows how to read the name of a symbolic link
       named <b>/modules/pass1</b>.

           <b>#include &lt;unistd.h&gt;</b>

           char buf[1024];
           ssize_t len;
           ...
           if ((len = readlink("/modules/pass1", buf, sizeof(buf)-1)) != -1)
               buf[len] = '\0';
</pre>
<h2><a id="APPLICATION_USAGE" href="readlinkat.3p.html#APPLICATION_USAGE"></a>APPLICATION USAGE  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       Conforming applications should not assume that the returned contents
       of the symbolic link are null-terminated.
</pre>
<h2><a id="RATIONALE" href="readlinkat.3p.html#RATIONALE"></a>RATIONALE  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       The type associated with <i>bufsiz</i> is a <b>size_t </b>in order to be consistent
       with both the ISO C standard and the definition of <i>read</i>().  The
       behavior specified for <i>readlink</i>() when <i>bufsiz</i> is zero represents
       historical practice. For this case, the standard developers
       considered a change whereby <i>readlink</i>() would return the number of
       non-null bytes contained in the symbolic link with the buffer <i>buf</i>
       remaining unchanged; however, since the <b>stat </b>structure member <i>st_size</i>
       value can be used to determine the size of buffer necessary to
       contain the contents of the symbolic link as returned by <i>readlink</i>(),
       this proposal was rejected, and the historical practice retained.

       The purpose of the <i>readlinkat</i>() function is to read the content of
       symbolic links in directories other than the current working
       directory without exposure to race conditions.  Any part of the path
       of a file could be changed in parallel to a call to <i>readlink</i>(),
       resulting in unspecified behavior. By opening a file descriptor for
       the target directory and using the <i>readlinkat</i>() function it can be
       guaranteed that the symbolic link read is located relative to the
       desired directory.
</pre>
<h2><a id="FUTURE_DIRECTIONS" href="readlinkat.3p.html#FUTURE_DIRECTIONS"></a>FUTURE DIRECTIONS  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       None.
</pre>
<h2><a id="SEE_ALSO" href="readlinkat.3p.html#SEE_ALSO"></a>SEE ALSO  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       <a href="fstatat.3p.html">fstatat(3p)</a>, <a href="symlink.3p.html">symlink(3p)</a>

       The Base Definitions volume of POSIX.1‐2008, <a href="../man0/unistd.h.0p.html">unistd.h(0p)</a>
</pre>
<h2><a id="COPYRIGHT" href="readlinkat.3p.html#COPYRIGHT"></a>COPYRIGHT  &nbsp; &nbsp; &nbsp; &nbsp; <a href="readlinkat.3p.html#top_of_page"><span class="top-link">top</span></a></h2><pre>
       Portions of this text are reprinted and reproduced in electronic form
       from IEEE Std 1003.1, 2013 Edition, Standard for Information
       Technology -- Portable Operating System Interface (POSIX), The Open
       Group Base Specifications Issue 7, Copyright (C) 2013 by the
       Institute of Electrical and Electronics Engineers, Inc and The Open
       Group.  (This is POSIX.1-2008 with the 2013 Technical Corrigendum 1
       applied.) In the event of any discrepancy between this version and
       the original IEEE and The Open Group Standard, the original IEEE and
       The Open Group Standard is the referee document. The original
       Standard can be obtained online at <a href="http://www.unix.org/online.html">http://www.unix.org/online.html</a> .

       Any typographical or formatting errors that appear in this page are
       most likely to have been introduced during the conversion of the
       source files to man page format. To report such errors, see
       <a href="https://www.kernel.org/doc/man-pages/reporting_bugs.html">https://www.kernel.org/doc/man-pages/reporting_bugs.html</a> .

<span class="footline">IEEE/The Open Group                 2013                        READLINK(3P)</span>
</pre>

<hr class="end-man-text" />
<p>Pages that refer to this page: 
    <a href="../man0/unistd.h.0p.html">unistd.h(0p)</a>,&nbsp; 
    <a href="fstatat.3p.html">fstatat(3p)</a>,&nbsp; 
    <a href="symlink.3p.html">symlink(3p)</a>
</p>
<hr/>

 
<hr class="start-footer" />

<div class="footer"> 

<table class="colophon-table">
    <tr>
    <td class="pub-info">
        <p>
            HTML rendering created 2018-02-02
            by <a href="http://man7.org/mtk/index.html">Michael Kerrisk</a>, 
            author of 
            <a href="http://man7.org/tlpi/"><em>The Linux Programming Interface</em></a>, 
            maintainer of the 
            <a href="https://www.kernel.org/doc/man-pages/">Linux <em>man-pages</em> project</a>.
        </p>
        <p>
            For details of in-depth
            <strong>Linux/UNIX system programming training courses</strong>
            that I teach, look <a href="http://man7.org/training/">here</a>.
        </p>
        <p>
            Hosting by <a href="http://www.jambit.com/index_en.html">jambit GmbH</a>.
        </p>
        <p>
            <a href="http://validator.w3.org/check?uri=referer">
            <img src="http://www.w3.org/Icons/valid-xhtml11"
                alt="Valid XHTML 1.1" height="31" width="88" />
            </a>
        </p>
    </td>
    <td class="colophon-divider">
    </td>
    <td class="tlpi-cover">
        <a href="http://man7.org/tlpi/"><img src="../../../tlpi/cover/TLPI-front-cover-vsmall.png" alt="Cover of TLPI" /></a>
    </td>
    </tr>
</table>

</div>

<hr class="end-footer" />



<!--BEGIN-SITETRACKING-->
<!-- SITETRACKING.man7.org_linux_man-pages -->

<!-- Start of StatCounter Code (xhtml) -->

<script type="text/javascript">
//<![CDATA[
var sc_project=7422636; 
var sc_invisible=1; 
var sc_security="9b6714ff"; 
//]]>
</script>
<script type="text/javascript"
src="http://www.statcounter.com/counter/counter_xhtml.js"></script>
<noscript><div class="statcounter"><a title="website
statistics" href="http://statcounter.com/"
class="statcounter"><img class="statcounter"
src="http://c.statcounter.com/7422636/0/9b6714ff/1/"
alt="website statistics" /></a></div></noscript>

<!-- End of StatCounter Code -->


<!-- Start of Google Analytics Code -->

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-9830363-8']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

<!-- End of Google Analytics Code -->

<!--END-SITETRACKING-->

</body>
</html>
