]> git.proxmox.com Git - wasi-libc.git/blob - libc-bottom-half/cloudlibc/src/libc/unistd/pwrite.c
56672e5b572d1d3823cbf52100d6ac9b9904c2a6
[wasi-libc.git] / libc-bottom-half / cloudlibc / src / libc / unistd / pwrite.c
1 // Copyright (c) 2015-2016 Nuxi, https://nuxi.nl/
2 //
3 // SPDX-License-Identifier: BSD-2-Clause
4
5 #include <wasi/api.h>
6 #include <errno.h>
7 #include <unistd.h>
8
9 ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset) {
10 if (offset < 0) {
11 errno = EINVAL;
12 return -1;
13 }
14 __wasi_ciovec_t iov = {.buf = buf, .buf_len = nbyte};
15 size_t bytes_written;
16 __wasi_errno_t error =
17 __wasi_fd_pwrite(fildes, &iov, 1, offset, &bytes_written);
18 if (error != 0) {
19 __wasi_fdstat_t fds;
20 #ifdef __wasilibc_unmodified_upstream
21 if (error == ENOTCAPABLE && __wasi_fd_stat_get(fildes, &fds) == 0) {
22 #else
23 if (error == ENOTCAPABLE && __wasi_fd_fdstat_get(fildes, &fds) == 0) {
24 #endif
25 // Determine why we got ENOTCAPABLE.
26 #ifdef __wasilibc_unmodified_upstream // generated constant names
27 if ((fds.fs_rights_base & __WASI_RIGHT_FD_WRITE) == 0)
28 #else
29 if ((fds.fs_rights_base & __WASI_RIGHTS_FD_WRITE) == 0)
30 #endif
31 error = EBADF;
32 else
33 error = ESPIPE;
34 }
35 errno = error;
36 return -1;
37 }
38 return bytes_written;
39 }