mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-06 06:55:07 +00:00
linux-sgx: Use non-destructive modes for opening files using SGX IPFS (#1645)
Refer to https://github.com/bytecodealliance/wasm-micro-runtime/pull/1645
This commit is contained in:
parent
15d645476a
commit
264fdfafed
|
@ -260,22 +260,27 @@ ipfs_fopen(int fd, const char *filename, int flags)
|
|||
bool write_only = (flags & O_ACCMODE) == O_WRONLY;
|
||||
bool read_write = (flags & O_ACCMODE) == O_RDWR;
|
||||
|
||||
// The mapping of the mode are described in the table in the official
|
||||
// The mapping of the mode is similar to the table in the official
|
||||
// specifications:
|
||||
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html
|
||||
// Note that POSIX has obtained a file descriptor beforehand.
|
||||
// If opened with a destructive mode ("w" or "w+"), the truncate operation
|
||||
// already occurred and must not be repeated because this will invalidate
|
||||
// the file descriptor obtained by POSIX. Therefore, we do NOT map to the
|
||||
// modes that truncate the file ("w" and "w+"). Instead, we map to a
|
||||
// non-destructive mode ("r+").
|
||||
|
||||
if (read_only)
|
||||
mode = "r";
|
||||
else if (write_only && must_create && must_truncate)
|
||||
mode = "w";
|
||||
// Rather than "w", we map to a non-destructive mode
|
||||
mode = "r+";
|
||||
else if (write_only && must_create && must_append)
|
||||
mode = "a";
|
||||
else if (read_write && must_create && must_truncate)
|
||||
mode = "w+";
|
||||
else if (read_write && must_create && must_append)
|
||||
mode = "a+";
|
||||
else if (read_write && must_create)
|
||||
mode = "w+";
|
||||
else if (read_write)
|
||||
// Rather than "w+", we map to a non-destructive mode
|
||||
mode = "r+";
|
||||
else
|
||||
mode = NULL;
|
||||
|
|
|
@ -26,6 +26,7 @@ main(int argc, char **argv)
|
|||
const char *text = FILE_TEXT;
|
||||
char buffer[1000];
|
||||
int ret;
|
||||
long long stat_size;
|
||||
|
||||
// Test: File opening (fopen)
|
||||
printf("Opening a file..\n");
|
||||
|
@ -114,18 +115,26 @@ main(int argc, char **argv)
|
|||
assert(ftell(file) == strlen(text) + 2 * ADDITIONAL_SPACE);
|
||||
printf("[Test] Extension of the file size passed.\n");
|
||||
|
||||
// Display some debug information
|
||||
printf("Getting the size of the file on disk..\n");
|
||||
struct stat st;
|
||||
stat(PATH_TEST_FILE, &st);
|
||||
stat_size = st.st_size;
|
||||
assert(stat_size != 0);
|
||||
|
||||
// Compare with the size from fstat
|
||||
fstat(fileno(file), &st);
|
||||
printf("The file size is: %lld (stat), %lld (fstat).\n", stat_size,
|
||||
st.st_size);
|
||||
assert(stat_size != 0);
|
||||
assert(stat_size == st.st_size);
|
||||
|
||||
// Test: closing the file (fclose)
|
||||
printf("Closing from the file..\n");
|
||||
ret = fclose(file);
|
||||
assert(ret == 0);
|
||||
printf("[Test] Closing file passed.\n");
|
||||
|
||||
// Display some debug information
|
||||
printf("Getting the size of the file on disk..\n");
|
||||
struct stat st;
|
||||
stat(PATH_TEST_FILE, &st);
|
||||
printf("The file size is %lld.\n", st.st_size);
|
||||
|
||||
printf("All the tests passed!\n");
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue
Block a user