mirror of
https://git.proxmox.com/git/wasi-libc
synced 2025-06-14 09:46:55 +00:00
Avoid varargs conventions when calling open (#126)
* Add an entrypoint for calling open that bypasses the varargs. * Add an entrypoint for calling openat that bypasses the varargs.
This commit is contained in:
parent
7fcc4f29df
commit
a94d2d04e7
@ -251,6 +251,8 @@ __uselocale
|
|||||||
__utc
|
__utc
|
||||||
__wasilibc_fd_renumber
|
__wasilibc_fd_renumber
|
||||||
__wasilibc_find_relpath
|
__wasilibc_find_relpath
|
||||||
|
__wasilibc_open_nomode
|
||||||
|
__wasilibc_openat_nomode
|
||||||
__wasilibc_populate_environ
|
__wasilibc_populate_environ
|
||||||
__wasilibc_register_preopened_fd
|
__wasilibc_register_preopened_fd
|
||||||
__wasilibc_rmdirat
|
__wasilibc_rmdirat
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
//
|
//
|
||||||
// SPDX-License-Identifier: BSD-2-Clause
|
// SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
|
||||||
|
#include <wasi/libc.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
@ -9,7 +10,11 @@
|
|||||||
|
|
||||||
DIR *opendirat(int dir, const char *dirname) {
|
DIR *opendirat(int dir, const char *dirname) {
|
||||||
// Open directory.
|
// Open directory.
|
||||||
|
#ifdef __wasilibc_unmodified_upstream // avoid making a varargs call
|
||||||
int fd = openat(dir, dirname, O_RDONLY | O_NONBLOCK | O_DIRECTORY);
|
int fd = openat(dir, dirname, O_RDONLY | O_NONBLOCK | O_DIRECTORY);
|
||||||
|
#else
|
||||||
|
int fd = __wasilibc_openat_nomode(dir, dirname, O_RDONLY | O_NONBLOCK | O_DIRECTORY);
|
||||||
|
#endif
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
// SPDX-License-Identifier: BSD-2-Clause
|
// SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
|
||||||
#include <wasi/core.h>
|
#include <wasi/core.h>
|
||||||
|
#include <wasi/libc.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@ -24,7 +25,11 @@ int scandirat(int dirfd, const char *dir, struct dirent ***namelist,
|
|||||||
sel = sel_true;
|
sel = sel_true;
|
||||||
|
|
||||||
// Open the directory.
|
// Open the directory.
|
||||||
|
#ifdef __wasilibc_unmodified_upstream // avoid making a varargs call
|
||||||
int fd = openat(dirfd, dir, O_RDONLY | O_NONBLOCK | O_DIRECTORY);
|
int fd = openat(dirfd, dir, O_RDONLY | O_NONBLOCK | O_DIRECTORY);
|
||||||
|
#else
|
||||||
|
int fd = __wasilibc_openat_nomode(dirfd, dir, O_RDONLY | O_NONBLOCK | O_DIRECTORY);
|
||||||
|
#endif
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <wasi/core.h>
|
#include <wasi/core.h>
|
||||||
|
#include <wasi/libc.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -22,6 +23,13 @@ static_assert(O_EXCL >> 12 == __WASI_O_EXCL, "Value mismatch");
|
|||||||
static_assert(O_TRUNC >> 12 == __WASI_O_TRUNC, "Value mismatch");
|
static_assert(O_TRUNC >> 12 == __WASI_O_TRUNC, "Value mismatch");
|
||||||
|
|
||||||
int openat(int fd, const char *path, int oflag, ...) {
|
int openat(int fd, const char *path, int oflag, ...) {
|
||||||
|
#ifdef __wasilibc_unmodified_upstream // fstat
|
||||||
|
#else
|
||||||
|
return __wasilibc_openat_nomode(fd, path, oflag);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __wasilibc_openat_nomode(int fd, const char *path, int oflag) {
|
||||||
|
#endif
|
||||||
// Compute rights corresponding with the access modes provided.
|
// Compute rights corresponding with the access modes provided.
|
||||||
// Attempt to obtain all rights, except the ones that contradict the
|
// Attempt to obtain all rights, except the ones that contradict the
|
||||||
// access mode provided to openat().
|
// access mode provided to openat().
|
||||||
|
@ -11,6 +11,8 @@ int __wasilibc_register_preopened_fd(int fd, const char *path);
|
|||||||
int __wasilibc_fd_renumber(int fd, int newfd);
|
int __wasilibc_fd_renumber(int fd, int newfd);
|
||||||
int __wasilibc_unlinkat(int fd, const char *path);
|
int __wasilibc_unlinkat(int fd, const char *path);
|
||||||
int __wasilibc_rmdirat(int fd, const char *path);
|
int __wasilibc_rmdirat(int fd, const char *path);
|
||||||
|
int __wasilibc_open_nomode(const char *path, int oflag);
|
||||||
|
int __wasilibc_openat_nomode(int fd, const char *path, int oflag);
|
||||||
off_t __wasilibc_tell(int fd);
|
off_t __wasilibc_tell(int fd);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -65,6 +65,14 @@
|
|||||||
|
|
||||||
int
|
int
|
||||||
open(const char *path, int flags, ...)
|
open(const char *path, int flags, ...)
|
||||||
|
{
|
||||||
|
// WASI libc's openat ignores the mode argument, so call a special
|
||||||
|
// entrypoint which avoids the varargs calling convention.
|
||||||
|
return __wasilibc_open_nomode(path, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
__wasilibc_open_nomode(const char *path, int flags)
|
||||||
{
|
{
|
||||||
const char *relative_path;
|
const char *relative_path;
|
||||||
int dirfd = __wasilibc_find_relpath(path, __WASI_RIGHT_PATH_OPEN, 0,
|
int dirfd = __wasilibc_find_relpath(path, __WASI_RIGHT_PATH_OPEN, 0,
|
||||||
@ -77,9 +85,7 @@ open(const char *path, int flags, ...)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// WASI libc's openat ignores the mode argument, so don't bother passing
|
return __wasilibc_openat_nomode(dirfd, relative_path, flags);
|
||||||
// the actual mode value through.
|
|
||||||
return openat(dirfd, relative_path, flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -1,23 +1,21 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <wasi/libc.h>
|
||||||
|
|
||||||
int truncate(const char *path, off_t length)
|
int truncate(const char *path, off_t length)
|
||||||
{
|
{
|
||||||
int fd = open(path, O_WRONLY | O_CLOEXEC | O_NOCTTY);
|
int fd = __wasilibc_open_nomode(path, O_WRONLY | O_CLOEXEC | O_NOCTTY);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int result = ftruncate(fd, length);
|
int result = ftruncate(fd, length);
|
||||||
if (result < 0) {
|
if (result != 0) {
|
||||||
int save_errno = errno;
|
int save_errno = errno;
|
||||||
(void)close(fd);
|
(void)close(fd);
|
||||||
errno = save_errno;
|
errno = save_errno;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (close(fd) < 0)
|
return close(fd);
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
|
#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
|
||||||
#else
|
#else
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <wasi/libc.h>
|
||||||
#endif
|
#endif
|
||||||
#include "stdio_impl.h"
|
#include "stdio_impl.h"
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@ -25,7 +26,8 @@ FILE *fopen(const char *restrict filename, const char *restrict mode)
|
|||||||
#ifdef __wasilibc_unmodified_upstream // WASI has no sys_open
|
#ifdef __wasilibc_unmodified_upstream // WASI has no sys_open
|
||||||
fd = sys_open(filename, flags, 0666);
|
fd = sys_open(filename, flags, 0666);
|
||||||
#else
|
#else
|
||||||
fd = open(filename, flags, 0666);
|
// WASI libc ignores the mode parameter anyway, so skip the varargs.
|
||||||
|
fd = __wasilibc_open_nomode(filename, flags);
|
||||||
#endif
|
#endif
|
||||||
if (fd < 0) return 0;
|
if (fd < 0) return 0;
|
||||||
#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
|
#ifdef __wasilibc_unmodified_upstream // WASI has no syscall
|
||||||
|
Loading…
Reference in New Issue
Block a user