blob: ffaef6ed6238dd14cb4e5a58450185731731fa8f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
// Copyright (c) 2016 Nuxi, https://nuxi.nl/
//
// SPDX-License-Identifier: BSD-2-Clause
#include <wasi/api.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int __wasilibc_nocwd_faccessat(int fd, const char *path, int amode, int flag) {
// Validate function parameters.
if ((amode & ~(F_OK | R_OK | W_OK | X_OK)) != 0 ||
(flag & ~AT_EACCESS) != 0) {
errno = EINVAL;
return -1;
}
// Check for target file existence and obtain the file type.
__wasi_lookupflags_t lookup_flags = __WASI_LOOKUPFLAGS_SYMLINK_FOLLOW;
__wasi_filestat_t file;
__wasi_errno_t error =
__wasi_path_filestat_get(fd, lookup_flags, path, &file);
if (error != 0) {
errno = error;
return -1;
}
// Test whether the requested access rights are present on the
// directory file descriptor.
if (amode != 0) {
__wasi_fdstat_t directory;
error = __wasi_fd_fdstat_get(fd, &directory);
if (error != 0) {
errno = error;
return -1;
}
__wasi_rights_t min = 0;
if ((amode & R_OK) != 0)
min |= file.filetype == __WASI_FILETYPE_DIRECTORY
? __WASI_RIGHTS_FD_READDIR
: __WASI_RIGHTS_FD_READ;
if ((amode & W_OK) != 0)
min |= __WASI_RIGHTS_FD_WRITE;
if ((min & directory.fs_rights_inheriting) != min) {
errno = EACCES;
return -1;
}
}
return 0;
}
|