OSDN Git Service

LDP: Update original to LDP v3.68
[linuxjm/LDP_man-pages.git] / original / man2 / readlink.2
1 .\" Copyright (c) 1983, 1991 The Regents of the University of California.
2 .\" And Copyright (C) 2011 Guillem Jover <guillem@hadrons.org>
3 .\" And Copyright (C) 2006, 2014 Michael Kerrisk
4 .\" All rights reserved.
5 .\"
6 .\" %%%LICENSE_START(BSD_4_CLAUSE_UCB)
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.
34 .\" %%%LICENSE_END
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
41 .\" 2011-09-20, Guillem Jover <guillem@hadrons.org>:
42 .\"     Added text on dynamically allocating buffer + example program
43 .\"
44 .TH READLINK 2 2014-05-10 "Linux" "Linux Programmer's Manual"
45 .SH NAME
46 readlink, readlinkat \- read value of a symbolic link
47 .SH SYNOPSIS
48 .nf
49 .B #include <unistd.h>
50 .sp
51 .BI "ssize_t readlink(const char *" pathname ", char *" buf \
52 ", size_t " bufsiz );
53 .sp
54 .BR "#include <fcntl.h>           " "/* Definition of AT_* constants */"
55 .B #include <unistd.h>
56 .sp
57 .BI "ssize_t readlinkat(int " dirfd ", const char *" pathname ,
58 .BI "                   char *" buf ", size_t " bufsiz );
59 .sp
60 .fi
61 .in -4n
62 Feature Test Macro Requirements for glibc (see
63 .BR feature_test_macros (7)):
64 .in
65 .sp
66 .ad l
67 .BR readlink ():
68 .RS 4
69 _BSD_SOURCE || _XOPEN_SOURCE\ >=\ 500 ||
70 _XOPEN_SOURCE\ &&\ _XOPEN_SOURCE_EXTENDED || _POSIX_C_SOURCE\ >=\ 200112L
71 .RE
72 .sp
73 .BR readlinkat ():
74 .PD 0
75 .ad l
76 .RS 4
77 .TP 4
78 Since glibc 2.10:
79 _XOPEN_SOURCE\ >=\ 700 || _POSIX_C_SOURCE\ >=\ 200809L
80 .TP
81 Before glibc 2.10:
82 _ATFILE_SOURCE
83 .RE
84 .ad b
85 .PD
86 .SH DESCRIPTION
87 .BR readlink ()
88 places the contents of the symbolic link
89 .I pathname
90 in the buffer
91 .IR buf ,
92 which has size
93 .IR bufsiz .
94 .BR readlink ()
95 does not append a null byte to
96 .IR buf .
97 It will truncate the contents (to a length of
98 .I bufsiz
99 characters), in case the buffer is too small to hold all of the contents.
100 .SS readlinkat()
101 The
102 .BR readlinkat ()
103 system call operates in exactly the same way as
104 .BR readlink (),
105 except for the differences described here.
106
107 If the pathname given in
108 .I pathname
109 is relative, then it is interpreted relative to the directory
110 referred to by the file descriptor
111 .I dirfd
112 (rather than relative to the current working directory of
113 the calling process, as is done by
114 .BR readlink ()
115 for a relative pathname).
116
117 If
118 .I pathname
119 is relative and
120 .I dirfd
121 is the special value
122 .BR AT_FDCWD ,
123 then
124 .I pathname
125 is interpreted relative to the current working
126 directory of the calling process (like
127 .BR readlink ()).
128
129 If
130 .I pathname
131 is absolute, then
132 .I dirfd
133 is ignored.
134
135 Since Linux 2.6.39,
136 .\" commit 65cfc6722361570bfe255698d9cd4dccaf47570d
137 .I pathname
138 can be an empty string,
139 in 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
144 flag).
145 In this case,
146 .I dirfd
147 can refer to any type of file, not just a directory.
148 .PP
149 See
150 .BR openat (2)
151 for an explanation of the need for
152 .BR readlinkat ().
153 .SH RETURN VALUE
154 On success, these calls return the number of bytes placed in
155 .IR buf .
156 On error, \-1 is returned and
157 .I errno
158 is set to indicate the error.
159 .SH ERRORS
160 .TP
161 .B EACCES
162 Search permission is denied for a component of the path prefix.
163 (See also
164 .BR path_resolution (7).)
165 .TP
166 .B EFAULT
167 .I buf
168 extends outside the process's allocated address space.
169 .TP
170 .B EINVAL
171 .I bufsiz
172 is not positive.
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?
178 .TP
179 .B EINVAL
180 The named file is not a symbolic link.
181 .TP
182 .B EIO
183 An I/O error occurred while reading from the filesystem.
184 .TP
185 .B ELOOP
186 Too many symbolic links were encountered in translating the pathname.
187 .TP
188 .B ENAMETOOLONG
189 A pathname, or a component of a pathname, was too long.
190 .TP
191 .B ENOENT
192 The named file does not exist.
193 .TP
194 .B ENOMEM
195 Insufficient kernel memory was available.
196 .TP
197 .B ENOTDIR
198 A component of the path prefix is not a directory.
199 .PP
200 The following additional errors can occur for
201 .BR readlinkat ():
202 .TP
203 .B EBADF
204 .I dirfd
205 is not a valid file descriptor.
206 .TP
207 .B ENOTDIR
208 .I pathname
209 is relative and
210 .I dirfd
211 is a file descriptor referring to a file other than a directory.
212 .SH VERSIONS
213 .BR readlinkat ()
214 was added to Linux in kernel 2.6.16;
215 library support was added to glibc in version 2.4.
216 .SH CONFORMING TO
217 .BR readlink ():
218 4.4BSD
219 .RB ( readlink ()
220 first appeared in 4.2BSD),
221 POSIX.1-2001, POSIX.1-2008.
222
223 .BR readlinkat ():
224 POSIX.1-2008.
225 .SH NOTES
226 In versions of glibc up to and including glibc 2.4, the return type of
227 .BR readlink ()
228 was declared as
229 .IR int .
230 Nowadays, the return type is declared as
231 .IR ssize_t ,
232 as (newly) required in POSIX.1-2001.
233
234 Using a statically sized buffer might not provide enough room for the
235 symbolic link contents.
236 The required size for the buffer can be obtained from the
237 .I stat.st_size
238 value returned by a call to
239 .BR lstat (2)
240 on the link.
241 However, the number of bytes written by
242 .BR readlink ()
243 and
244 .BR readlinkat ()
245 should be checked to make sure that the size of the
246 symbolic link did not increase between the calls.
247 Dynamically allocating the buffer for
248 .BR readlink ()
249 and
250 .BR readlinkat ()
251 also addresses a common portability problem when using
252 .I PATH_MAX
253 for the buffer size,
254 as this constant is not guaranteed to be defined per POSIX
255 if the system does not have such limit.
256 .SH EXAMPLE
257 The following program allocates the buffer needed by
258 .BR readlink ()
259 dynamically from the information provided by
260 .BR lstat (),
261 making sure there's no race condition between the calls.
262 .nf
263
264 #include <sys/types.h>
265 #include <sys/stat.h>
266 #include <stdio.h>
267 #include <stdlib.h>
268 #include <unistd.h>
269
270 int
271 main(int argc, char *argv[])
272 {
273     struct stat sb;
274     char *linkname;
275     ssize_t r;
276
277     if (argc != 2) {
278         fprintf(stderr, "Usage: %s <pathname>\\n", argv[0]);
279         exit(EXIT_FAILURE);
280     }
281
282     if (lstat(argv[1], &sb) == \-1) {
283         perror("lstat");
284         exit(EXIT_FAILURE);
285     }
286
287     linkname = malloc(sb.st_size + 1);
288     if (linkname == NULL) {
289         fprintf(stderr, "insufficient memory\\n");
290         exit(EXIT_FAILURE);
291     }
292
293     r = readlink(argv[1], linkname, sb.st_size + 1);
294
295     if (r == \-1) {
296         perror("readlink");
297         exit(EXIT_FAILURE);
298     }
299
300     if (r > sb.st_size) {
301         fprintf(stderr, "symlink increased in size "
302                         "between lstat() and readlink()\\n");
303         exit(EXIT_FAILURE);
304     }
305
306     linkname[r] = \(aq\\0\(aq;
307
308     printf("\(aq%s\(aq points to \(aq%s\(aq\\n", argv[1], linkname);
309
310     exit(EXIT_SUCCESS);
311 }
312 .fi
313 .SH SEE ALSO
314 .BR readlink (1),
315 .BR lstat (2),
316 .BR stat (2),
317 .BR symlink (2),
318 .BR path_resolution (7),
319 .BR symlink (7)
320 .SH COLOPHON
321 This page is part of release 3.68 of the Linux
322 .I man-pages
323 project.
324 A description of the project,
325 information about reporting bugs,
326 and the latest version of this page,
327 can be found at
328 \%http://www.kernel.org/doc/man\-pages/.