]> git.ipfire.org Git - thirdparty/man-pages.git/blame - man2/readlink.2
proc.5: Minor tweaks to Elie De Brauwer's patch
[thirdparty/man-pages.git] / man2 / readlink.2
CommitLineData
fea681da 1.\" Copyright (c) 1983, 1991 The Regents of the University of California.
f497e456 2.\" And Copyright (C) 2011 Guillem Jover <guillem@hadrons.org>
dcdd0751 3.\" And Copyright (C) 2006, 2014 Michael Kerrisk
fea681da
MK
4.\" All rights reserved.
5.\"
a9cd9cb7 6.\" %%%LICENSE_START(BSD_4_CLAUSE_UCB)
fea681da
MK
7.\" Redistribution and use in source and binary forms, with or without
8.\" modification, are permitted provided that the following conditions
9.\" are met:
10.\" 1. Redistributions of source code must retain the above copyright
11.\" notice, this list of conditions and the following disclaimer.
12.\" 2. Redistributions in binary form must reproduce the above copyright
13.\" notice, this list of conditions and the following disclaimer in the
14.\" documentation and/or other materials provided with the distribution.
15.\" 3. All advertising materials mentioning features or use of this software
16.\" must display the following acknowledgement:
17.\" This product includes software developed by the University of
18.\" California, Berkeley and its contributors.
19.\" 4. Neither the name of the University nor the names of its contributors
20.\" may be used to endorse or promote products derived from this software
21.\" without specific prior written permission.
22.\"
23.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33.\" SUCH DAMAGE.
8c9302dc 34.\" %%%LICENSE_END
fea681da
MK
35.\"
36.\" @(#)readlink.2 6.8 (Berkeley) 3/10/91
37.\"
38.\" Modified Sat Jul 24 00:10:21 1993 by Rik Faith (faith@cs.unc.edu)
39.\" Modified Tue Jul 9 23:55:17 1996 by aeb
40.\" Modified Fri Jan 24 00:26:00 1997 by aeb
96f62554
MK
41.\" 2011-09-20, Guillem Jover <guillem@hadrons.org>:
42.\" Added text on dynamically allocating buffer + example program
fea681da 43.\"
8980a500 44.TH READLINK 2 2014-08-19 "Linux" "Linux Programmer's Manual"
fea681da 45.SH NAME
dcdd0751 46readlink, readlinkat \- read value of a symbolic link
fea681da 47.SH SYNOPSIS
dcdd0751 48.nf
fea681da
MK
49.B #include <unistd.h>
50.sp
634e5fa8
MK
51.BI "ssize_t readlink(const char *" pathname ", char *" buf \
52", size_t " bufsiz );
cc4615cc 53.sp
dcdd0751
MK
54.BR "#include <fcntl.h> " "/* Definition of AT_* constants */"
55.B #include <unistd.h>
56.sp
479fd9ad
RV
57.BI "ssize_t readlinkat(int " dirfd ", const char *" pathname ,
58.BI " char *" buf ", size_t " bufsiz );
dcdd0751
MK
59.sp
60.fi
cc4615cc
MK
61.in -4n
62Feature Test Macro Requirements for glibc (see
63.BR feature_test_macros (7)):
64.in
65.sp
66.ad l
67.BR readlink ():
cde2506f
MK
68.RS 4
69_BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500 ||
70_XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED || _POSIX_C_SOURCE\ >=\ 200112L
71.RE
dcdd0751
MK
72.sp
73.BR readlinkat ():
74.PD 0
75.ad l
76.RS 4
77.TP 4
78Since glibc 2.10:
79_XOPEN_SOURCE\ >=\ 700 || _POSIX_C_SOURCE\ >=\ 200809L
80.TP
81Before glibc 2.10:
82_ATFILE_SOURCE
83.RE
cc4615cc 84.ad b
dcdd0751 85.PD
fea681da 86.SH DESCRIPTION
e511ffb6 87.BR readlink ()
fea681da 88places the contents of the symbolic link
634e5fa8 89.I pathname
fea681da
MK
90in the buffer
91.IR buf ,
92which has size
93.IR bufsiz .
e511ffb6 94.BR readlink ()
28d88c17 95does not append a null byte to
fea681da
MK
96.IR buf .
97It will truncate the contents (to a length of
98.I bufsiz
99characters), in case the buffer is too small to hold all of the contents.
dcdd0751
MK
100.SS readlinkat()
101The
102.BR readlinkat ()
103system call operates in exactly the same way as
cadd38ba 104.BR readlink (),
dcdd0751
MK
105except for the differences described here.
106
107If the pathname given in
108.I pathname
109is relative, then it is interpreted relative to the directory
110referred to by the file descriptor
111.I dirfd
112(rather than relative to the current working directory of
113the calling process, as is done by
cadd38ba 114.BR readlink ()
dcdd0751
MK
115for a relative pathname).
116
117If
118.I pathname
119is relative and
120.I dirfd
121is the special value
122.BR AT_FDCWD ,
123then
124.I pathname
125is interpreted relative to the current working
126directory of the calling process (like
cadd38ba 127.BR readlink ()).
dcdd0751
MK
128
129If
130.I pathname
131is absolute, then
132.I dirfd
133is ignored.
134
135Since Linux 2.6.39,
136.\" commit 65cfc6722361570bfe255698d9cd4dccaf47570d
137.I pathname
138can be an empty string,
139in which case the call operates on the file referred to by
140.IR dirfd
141(which may have been obtained using the
142.BR open (2)
143.B O_PATH
144flag).
145In this case,
146.I dirfd
147can refer to any type of file, not just a directory.
148.PP
149See
150.BR openat (2)
151for an explanation of the need for
152.BR readlinkat ().
47297adb 153.SH RETURN VALUE
dcdd0751 154On success, these calls return the number of bytes placed in
64aae2b1
MK
155.IR buf .
156On error, \-1 is returned and
157.I errno
158is set to indicate the error.
fea681da
MK
159.SH ERRORS
160.TP
161.B EACCES
162Search permission is denied for a component of the path prefix.
163(See also
ad7cc990 164.BR path_resolution (7).)
fea681da
MK
165.TP
166.B EFAULT
167.I buf
168extends outside the process's allocated address space.
169.TP
170.B EINVAL
171.I bufsiz
172is not positive.
89cb804a
MK
173.\" At the glibc level, bufsiz is unsigned, so this error can only occur
174.\" if bufsiz==0. However, the in the kernel syscall, bufsiz is signed,
175.\" and this error can also occur if bufsiz < 0.
176.\" See: http://thread.gmane.org/gmane.linux.man/380
177.\" Subject: [patch 0/3] [RFC] kernel/glibc mismatch of "readlink" syscall?
fea681da
MK
178.TP
179.B EINVAL
180The named file is not a symbolic link.
181.TP
182.B EIO
9ee4a2b6 183An I/O error occurred while reading from the filesystem.
fea681da
MK
184.TP
185.B ELOOP
186Too many symbolic links were encountered in translating the pathname.
187.TP
188.B ENAMETOOLONG
189A pathname, or a component of a pathname, was too long.
190.TP
191.B ENOENT
192The named file does not exist.
193.TP
194.B ENOMEM
195Insufficient kernel memory was available.
196.TP
197.B ENOTDIR
198A component of the path prefix is not a directory.
dcdd0751
MK
199.PP
200The following additional errors can occur for
201.BR readlinkat ():
202.TP
203.B EBADF
204.I dirfd
205is not a valid file descriptor.
206.TP
207.B ENOTDIR
208.I pathname
209is relative and
210.I dirfd
211is a file descriptor referring to a file other than a directory.
212.SH VERSIONS
213.BR readlinkat ()
214was added to Linux in kernel 2.6.16;
215library support was added to glibc in version 2.4.
47297adb 216.SH CONFORMING TO
dcdd0751 217.BR readlink ():
5d127cc9
MK
2184.4BSD
219.RB ( readlink ()
220first appeared in 4.2BSD),
6315ed1f 221POSIX.1-2001, POSIX.1-2008.
dcdd0751
MK
222
223.BR readlinkat ():
224POSIX.1-2008.
889829be 225.SH NOTES
4595d739
MK
226In versions of glibc up to and including glibc 2.4, the return type of
227.BR readlink ()
228was declared as
229.IR int .
230Nowadays, the return type is declared as
231.IR ssize_t ,
232as (newly) required in POSIX.1-2001.
b61acee9
MK
233
234Using a statically sized buffer might not provide enough room for the
235symbolic link contents.
236The required size for the buffer can be obtained from the
237.I stat.st_size
238value returned by a call to
239.BR lstat (2)
240on the link.
241However, the number of bytes written by
242.BR readlink ()
787b49e7
MK
243and
244.BR readlinkat ()
b61acee9
MK
245should be checked to make sure that the size of the
246symbolic link did not increase between the calls.
247Dynamically allocating the buffer for
248.BR readlink ()
787b49e7
MK
249and
250.BR readlinkat ()
b61acee9
MK
251also addresses a common portability problem when using
252.I PATH_MAX
253for the buffer size,
254as this constant is not guaranteed to be defined per POSIX
255if the system does not have such limit.
1e40dbf5
MK
256.SS Glibc notes
257On older kernels where
258.BR readlinkat ()
259is unavailable, the glibc wrapper function falls back to the use of
260.BR readlink ().
261When
262.I pathname
263is a relative pathname,
264glibc constructs a pathname based on the symbolic link in
265.IR /proc/self/fd
266that corresponds to the
267.IR dirfd
268argument.
f91c6bd7 269.SH EXAMPLE
b61acee9 270The following program allocates the buffer needed by
f91c6bd7
GJ
271.BR readlink ()
272dynamically from the information provided by
273.BR lstat (),
b61acee9 274making sure there's no race condition between the calls.
f91c6bd7
GJ
275.nf
276
277#include <sys/types.h>
278#include <sys/stat.h>
279#include <stdio.h>
280#include <stdlib.h>
281#include <unistd.h>
282
283int
284main(int argc, char *argv[])
285{
286 struct stat sb;
287 char *linkname;
288 ssize_t r;
289
290 if (argc != 2) {
291 fprintf(stderr, "Usage: %s <pathname>\\n", argv[0]);
292 exit(EXIT_FAILURE);
293 }
294
295 if (lstat(argv[1], &sb) == \-1) {
296 perror("lstat");
297 exit(EXIT_FAILURE);
298 }
299
300 linkname = malloc(sb.st_size + 1);
301 if (linkname == NULL) {
302 fprintf(stderr, "insufficient memory\\n");
303 exit(EXIT_FAILURE);
304 }
305
306 r = readlink(argv[1], linkname, sb.st_size + 1);
1976f57a 307
4b80b37c 308 if (r == \-1) {
3468b312 309 perror("readlink");
f91c6bd7 310 exit(EXIT_FAILURE);
1976f57a 311 }
b61acee9 312
f497e456 313 if (r > sb.st_size) {
b61acee9
MK
314 fprintf(stderr, "symlink increased in size "
315 "between lstat() and readlink()\\n");
f91c6bd7
GJ
316 exit(EXIT_FAILURE);
317 }
b61acee9 318
c1de8e3e 319 linkname[r] = \(aq\\0\(aq;
f91c6bd7 320
836830b4 321 printf("\(aq%s\(aq points to \(aq%s\(aq\\n", argv[1], linkname);
f91c6bd7
GJ
322
323 exit(EXIT_SUCCESS);
324}
325.fi
47297adb 326.SH SEE ALSO
c370cc1b 327.BR readlink (1),
fea681da 328.BR lstat (2),
fea681da 329.BR stat (2),
ad7cc990 330.BR symlink (2),
2333bf67 331.BR realpath (3),
a9cfde1d 332.BR path_resolution (7),
ad22ad55 333.BR symlink (7)