annotate lib/readlinkat.c @ 17769:05d77e098e6e

readlinkat: port to AIX 7.1 * doc/posix-functions/readlink.texi (readlink): * doc/posix-functions/readlinkat.texi (readlinkat): Mention AIX porting problem. * lib/readlinkat.c (rpl_readlinkat) [HAVE_READLINKAT]: New function. * lib/unistd.in.h (readlinkat): Add replacement machinery. * m4/readlinkat.m4 (gl_FUNC_READLINKAT): Check readlinkat signature. * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add REPLACE_READLINKAT. * modules/readlinkat (configure.ac): Also compile replacement if REPLACE_READLINKAT. * modules/unistd (unistd.h): Substitute REPLACE_READLINKAT.
author Paul Eggert <eggert@cs.ucla.edu>
date Sat, 18 Oct 2014 22:35:28 -0700
parents 344018b6e5d7
children ab58d4870664
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13539
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
1 /* Read a symlink relative to an open directory.
17587
344018b6e5d7 maint: update copyright
Eric Blake <eblake@redhat.com>
parents: 17249
diff changeset
2 Copyright (C) 2009-2014 Free Software Foundation, Inc.
13539
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
3
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
4 This program is free software: you can redistribute it and/or modify
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
6 the Free Software Foundation; either version 3 of the License, or
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
7 (at your option) any later version.
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
8
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
12 GNU General Public License for more details.
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
13
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
16
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
17 /* written by Eric Blake */
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
18
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
19 #include <config.h>
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
20
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
21 #include <unistd.h>
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
22
17769
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
23 #if HAVE_READLINKAT
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
24
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
25 # undef readlinkat
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
26
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
27 ssize_t
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
28 rpl_readlinkat (int fd, char const *file, char *buf, size_t len)
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
29 {
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
30 return readlinkat (fd, file, buf, len);
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
31 }
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
32
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
33 #else
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
34
13539
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
35 /* Gnulib provides a readlink stub for mingw; use it for distinction
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
36 between EINVAL and ENOENT, rather than always failing with ENOSYS. */
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
37
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
38 /* POSIX 2008 says that unlike readlink, readlinkat returns 0 for
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
39 success instead of the buffer length. But this would render
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
40 readlinkat worthless since readlink does not guarantee a
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
41 NUL-terminated buffer. Assume this was a bug in POSIX. */
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
42
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
43 /* Read the contents of symlink FILE into buffer BUF of size LEN, in the
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
44 directory open on descriptor FD. If possible, do it without changing
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
45 the working directory. Otherwise, resort to using save_cwd/fchdir,
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
46 then readlink/restore_cwd. If either the save_cwd or the restore_cwd
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
47 fails, then give a diagnostic and exit nonzero. */
56e31af9a41e readlinkat: split into its own module
Eric Blake <eblake@redhat.com>
parents:
diff changeset
48
17769
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
49 # define AT_FUNC_NAME readlinkat
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
50 # define AT_FUNC_F1 readlink
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
51 # define AT_FUNC_POST_FILE_PARAM_DECLS , char *buf, size_t len
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
52 # define AT_FUNC_POST_FILE_ARGS , buf, len
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
53 # define AT_FUNC_RESULT ssize_t
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
54 # include "at-func.c"
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
55 # undef AT_FUNC_NAME
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
56 # undef AT_FUNC_F1
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
57 # undef AT_FUNC_POST_FILE_PARAM_DECLS
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
58 # undef AT_FUNC_POST_FILE_ARGS
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
59 # undef AT_FUNC_RESULT
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
60
05d77e098e6e readlinkat: port to AIX 7.1
Paul Eggert <eggert@cs.ucla.edu>
parents: 17587
diff changeset
61 #endif