1/* Internals for openat-like functions.
2
3   Copyright (C) 2005, 2006 Free Software Foundation, Inc.
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 2, or (at your option)
8   any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program; if not, write to the Free Software Foundation,
17   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
18
19/* written by Jim Meyering */
20
21#include <errno.h>
22#include <stdlib.h>
23
24#define OPENAT_BUFFER_SIZE 512
25char *openat_proc_name (char buf[OPENAT_BUFFER_SIZE], int fd, char const *file);
26
27/* Some systems don't have ENOSYS.  */
28#ifndef ENOSYS
29# ifdef ENOTSUP
30#  define ENOSYS ENOTSUP
31# else
32/* Some systems don't have ENOTSUP either.  */
33#  define ENOSYS EINVAL
34# endif
35#endif
36
37/* Some systems don't have EOPNOTSUPP.  */
38#ifndef EOPNOTSUPP
39# ifdef ENOTSUP
40#  define EOPNOTSUPP ENOTSUP
41# else
42/* Some systems don't have ENOTSUP either.  */
43#  define EOPNOTSUPP EINVAL
44# endif
45#endif
46
47/* Trying to access a BUILD_PROC_NAME file will fail on systems without
48   /proc support, and even on systems *with* ProcFS support.  Return
49   nonzero if the failure may be legitimate, e.g., because /proc is not
50   readable, or the particular .../fd/N directory is not present.  */
51#define EXPECTED_ERRNO(Errno)			\
52  ((Errno) == ENOTDIR || (Errno) == ENOENT	\
53   || (Errno) == EPERM || (Errno) == EACCES	\
54   || (Errno) == ENOSYS /* Solaris 8 */		\
55   || (Errno) == EOPNOTSUPP /* FreeBSD */)
56