mirror of
				https://git.proxmox.com/git/wasi-libc
				synced 2025-10-31 19:38:27 +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 | ||||
| __wasilibc_fd_renumber | ||||
| __wasilibc_find_relpath | ||||
| __wasilibc_open_nomode | ||||
| __wasilibc_openat_nomode | ||||
| __wasilibc_populate_environ | ||||
| __wasilibc_register_preopened_fd | ||||
| __wasilibc_rmdirat | ||||
|  | ||||
| @ -2,6 +2,7 @@ | ||||
| //
 | ||||
| // SPDX-License-Identifier: BSD-2-Clause
 | ||||
| 
 | ||||
| #include <wasi/libc.h> | ||||
| #include <dirent.h> | ||||
| #include <fcntl.h> | ||||
| #include <stddef.h> | ||||
| @ -9,7 +10,11 @@ | ||||
| 
 | ||||
| DIR *opendirat(int dir, const char *dirname) { | ||||
|   // Open directory.
 | ||||
| #ifdef __wasilibc_unmodified_upstream // avoid making a varargs call
 | ||||
|   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) | ||||
|     return NULL; | ||||
| 
 | ||||
|  | ||||
| @ -3,6 +3,7 @@ | ||||
| // SPDX-License-Identifier: BSD-2-Clause
 | ||||
| 
 | ||||
| #include <wasi/core.h> | ||||
| #include <wasi/libc.h> | ||||
| #include <dirent.h> | ||||
| #include <errno.h> | ||||
| #include <fcntl.h> | ||||
| @ -24,7 +25,11 @@ int scandirat(int dirfd, const char *dir, struct dirent ***namelist, | ||||
|     sel = sel_true; | ||||
| 
 | ||||
|   // Open the directory.
 | ||||
| #ifdef __wasilibc_unmodified_upstream // avoid making a varargs call
 | ||||
|   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) | ||||
|     return -1; | ||||
| 
 | ||||
|  | ||||
| @ -6,6 +6,7 @@ | ||||
| 
 | ||||
| #include <assert.h> | ||||
| #include <wasi/core.h> | ||||
| #include <wasi/libc.h> | ||||
| #include <errno.h> | ||||
| #include <fcntl.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"); | ||||
| 
 | ||||
| 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.
 | ||||
|   // Attempt to obtain all rights, except the ones that contradict the
 | ||||
|   // 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_unlinkat(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); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
|  | ||||
| @ -65,6 +65,14 @@ | ||||
| 
 | ||||
| int | ||||
| 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; | ||||
|     int dirfd = __wasilibc_find_relpath(path, __WASI_RIGHT_PATH_OPEN, 0, | ||||
| @ -77,9 +85,7 @@ open(const char *path, int flags, ...) | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     // WASI libc's openat ignores the mode argument, so don't bother passing
 | ||||
|     // the actual mode value through.
 | ||||
|     return openat(dirfd, relative_path, flags); | ||||
|     return __wasilibc_openat_nomode(dirfd, relative_path, flags); | ||||
| } | ||||
| 
 | ||||
| int | ||||
|  | ||||
| @ -1,23 +1,21 @@ | ||||
| #include <unistd.h> | ||||
| #include <fcntl.h> | ||||
| #include <errno.h> | ||||
| #include <wasi/libc.h> | ||||
| 
 | ||||
| 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) | ||||
|         return -1; | ||||
| 
 | ||||
|     int result = ftruncate(fd, length); | ||||
|     if (result < 0) { | ||||
|     if (result != 0) { | ||||
|         int save_errno = errno; | ||||
|         (void)close(fd); | ||||
|         errno = save_errno; | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|     if (close(fd) < 0) | ||||
|         return -1; | ||||
| 
 | ||||
|     return 0; | ||||
|     return close(fd); | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| #ifdef __wasilibc_unmodified_upstream // WASI has no syscall
 | ||||
| #else | ||||
| #include <unistd.h> | ||||
| #include <wasi/libc.h> | ||||
| #endif | ||||
| #include "stdio_impl.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
 | ||||
| 	fd = sys_open(filename, flags, 0666); | ||||
| #else | ||||
| 	fd = open(filename, flags, 0666); | ||||
| 	// WASI libc ignores the mode parameter anyway, so skip the varargs.
 | ||||
| 	fd = __wasilibc_open_nomode(filename, flags); | ||||
| #endif | ||||
| 	if (fd < 0) return 0; | ||||
| #ifdef __wasilibc_unmodified_upstream // WASI has no syscall
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Dan Gohman
						Dan Gohman