1 /* Test the access rights of a file.
2 Copyright (C) 2019-2024 Free Software Foundation, Inc.
4 This file is free software: you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as
6 published by the Free Software Foundation; either version 2.1 of the
7 License, or (at your option) any later version.
9 This file 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 Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
25 #include <sys/types.h>
28 #if defined _WIN32 && !defined __CYGWIN__
33 access (const char *file
, int mode
)
38 #if defined _WIN32 && !defined __CYGWIN__
39 if ((mode
& X_OK
) != 0)
40 mode
= (mode
& ~X_OK
) | R_OK
;
41 ret
= _access (file
, mode
);
43 ret
= access (file
, mode
);
46 #if (defined _WIN32 && !defined __CYGWIN__) || ACCESS_TRAILING_SLASH_BUG
47 # if defined _WIN32 && !defined __CYGWIN__
48 if (ret
== 0 || errno
== EINVAL
)
53 size_t file_len
= strlen (file
);
54 if (file_len
> 0 && file
[file_len
- 1] == '/')
57 if (stat (file
, &st
) == 0)
59 if (! S_ISDIR (st
.st_mode
))
66 return (mode
== F_OK
&& errno
== EOVERFLOW
? 0 : -1);