Commit | Line | Data |
---|---|---|
8654f9d7 | 1 | /* Read a symlink relative to an open directory. |
ba318903 | 2 | Copyright (C) 2009-2014 Free Software Foundation, Inc. |
8654f9d7 PE |
3 | |
4 | This program is free software: you can redistribute it and/or modify | |
5 | it under the terms of the GNU General Public License as published by | |
6 | the Free Software Foundation; either version 3 of the License, or | |
7 | (at your option) any later version. | |
8 | ||
9 | This program is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | GNU General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU General Public License | |
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
16 | ||
17 | /* written by Eric Blake */ | |
18 | ||
19 | #include <config.h> | |
20 | ||
21 | #include <unistd.h> | |
22 | ||
23 | /* Gnulib provides a readlink stub for mingw; use it for distinction | |
24 | between EINVAL and ENOENT, rather than always failing with ENOSYS. */ | |
25 | ||
26 | /* POSIX 2008 says that unlike readlink, readlinkat returns 0 for | |
27 | success instead of the buffer length. But this would render | |
28 | readlinkat worthless since readlink does not guarantee a | |
29 | NUL-terminated buffer. Assume this was a bug in POSIX. */ | |
30 | ||
31 | /* Read the contents of symlink FILE into buffer BUF of size LEN, in the | |
32 | directory open on descriptor FD. If possible, do it without changing | |
33 | the working directory. Otherwise, resort to using save_cwd/fchdir, | |
34 | then readlink/restore_cwd. If either the save_cwd or the restore_cwd | |
35 | fails, then give a diagnostic and exit nonzero. */ | |
36 | ||
37 | #define AT_FUNC_NAME readlinkat | |
38 | #define AT_FUNC_F1 readlink | |
39 | #define AT_FUNC_POST_FILE_PARAM_DECLS , char *buf, size_t len | |
40 | #define AT_FUNC_POST_FILE_ARGS , buf, len | |
41 | #define AT_FUNC_RESULT ssize_t | |
42 | #include "at-func.c" | |
43 | #undef AT_FUNC_NAME | |
44 | #undef AT_FUNC_F1 | |
45 | #undef AT_FUNC_POST_FILE_PARAM_DECLS | |
46 | #undef AT_FUNC_POST_FILE_ARGS | |
47 | #undef AT_FUNC_RESULT |