blob: c5c0a3155ab31ed24ae8d4da656fa04222527c2e [file]
/*
* Copyright 2026 The Emscripten Authors. All rights reserved.
* Emscripten is available under two separate licenses, the MIT license and the
* University of Illinois/NCSA Open Source License. Both these licenses can be
* found in the LICENSE file.
*/
// Verify that the file system enforces the open file access mode on read/write, as
// POSIX requires: writing to an O_RDONLY descriptor and reading from an
// O_WRONLY descriptor must fail with EBADF. This should behave identically
// across all of our filesystems (MEMFS, WASMFS, NODEFS, NODERAWFS).
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(void) {
const char* msg = "hello";
const size_t len = strlen(msg);
char buf[16];
// Create a file with some content.
int fd = open("testfile", O_WRONLY | O_CREAT | O_TRUNC, 0666);
assert(fd >= 0);
assert(write(fd, msg, len) == (ssize_t)len);
assert(close(fd) == 0);
// O_RDONLY: reads are allowed, writes must fail with EBADF.
fd = open("testfile", O_RDONLY);
assert(fd >= 0);
errno = 0;
assert(write(fd, msg, len) == -1);
assert(errno == EBADF);
errno = 0;
assert(pwrite(fd, msg, len, 0) == -1);
assert(errno == EBADF);
errno = 0;
memset(buf, 0, sizeof buf);
assert(read(fd, buf, sizeof buf) == (ssize_t)len);
assert(errno == 0);
assert(strcmp(buf, msg) == 0);
assert(close(fd) == 0);
// O_WRONLY: writes are allowed, reads must fail with EBADF.
fd = open("testfile", O_WRONLY);
assert(fd >= 0);
errno = 0;
assert(read(fd, buf, sizeof buf) == -1);
assert(errno == EBADF);
errno = 0;
assert(pread(fd, buf, sizeof buf, 0) == -1);
assert(errno == EBADF);
errno = 0;
assert(write(fd, msg, len) == (ssize_t)len);
assert(errno == 0);
assert(close(fd) == 0);
// O_RDWR: both reads and writes are allowed.
fd = open("testfile", O_RDWR);
assert(fd >= 0);
errno = 0;
memset(buf, 0, sizeof buf);
assert(read(fd, buf, sizeof buf) == (ssize_t)len);
assert(write(fd, msg, len) == (ssize_t)len);
assert(errno == 0);
assert(close(fd) == 0);
printf("done\n");
return 0;
}