From 9e471628579bbb6225fa6a34f91a72a3a3e905d0 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Fri, 21 Feb 2020 14:35:16 -0500 Subject: [PATCH] update unions Unions became tagged unions in snapsnot preview 2. Refs: https://github.com/cjihrig/uvwasi/issues/59 --- README.md | 6 ++--- include/wasi_types.h | 47 ++++++++++++++++++++------------- src/uvwasi.c | 2 +- test/test-fd-prestat-dir-name.c | 2 +- 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 83ad2a1..1f0a4ce 100644 --- a/README.md +++ b/README.md @@ -1694,13 +1694,13 @@ Members: - When `type` is [`UVWASI_EVENTTYPE_FD_READ`](#eventtype.fd_read) or [`UVWASI_EVENTTYPE_FD_WRITE`](#eventtype.fd_write): - - **`u.fd_readwrite`** + - **`fd_readwrite`** - - [\_\_wasi\_filesize\_t](#filesize) nbytes + - [\_\_wasi\_filesize\_t](#filesize) nbytes The number of bytes available for reading or writing. - - [\_\_wasi\_eventrwflags\_t](#eventrwflags) flags + - [\_\_wasi\_eventrwflags\_t](#eventrwflags) flags The state of the file descriptor. diff --git a/include/wasi_types.h b/include/wasi_types.h index 3b30fd3..e10e77d 100644 --- a/include/wasi_types.h +++ b/include/wasi_types.h @@ -169,7 +169,7 @@ typedef uint8_t uvwasi_preopentype_t; #define UVWASI_PREOPENTYPE_DIR 0 typedef struct uvwasi_prestat_s { - uvwasi_preopentype_t pr_type; + uvwasi_preopentype_t tag; union uvwasi_prestat_u { struct uvwasi_prestat_dir_t { size_t pr_name_len; @@ -236,20 +236,29 @@ typedef uint64_t uvwasi_timestamp_t; typedef uint64_t uvwasi_userdata_t; +typedef union uvwasi_subscription_u_u_s { + struct { + uvwasi_clockid_t clock_id; + uvwasi_timestamp_t timeout; + uvwasi_timestamp_t precision; + uvwasi_subclockflags_t flags; + } clock; + struct { + uvwasi_fd_t fd; + } fd_read; + struct { + uvwasi_fd_t fd; + } fd_write; +} uvwasi_subscription_u_u_t; + +typedef struct uvwasi_subscription_u_s { + uvwasi_eventtype_t tag; + uvwasi_subscription_u_u_t u; +} uvwasi_subscription_u_t; + typedef struct uvwasi_subscription_s { uvwasi_userdata_t userdata; - uvwasi_eventtype_t type; - union { - struct { - uvwasi_clockid_t clock_id; - uvwasi_timestamp_t timeout; - uvwasi_timestamp_t precision; - uvwasi_subclockflags_t flags; - } clock; - struct { - uvwasi_fd_t fd; - } fd_readwrite; - } u; + uvwasi_subscription_u_t u; } uvwasi_subscription_t; typedef struct uvwasi_dirent_s { @@ -278,16 +287,16 @@ typedef struct uvwasi_filestat_s { uvwasi_timestamp_t st_ctim; } uvwasi_filestat_t; +typedef struct uvwasi_event_fd_readwrite_s { + uvwasi_filesize_t nbytes; + uvwasi_eventrwflags_t flags; +} uvwasi_event_fd_readwrite_t; + typedef struct uvwasi_event_s { uvwasi_userdata_t userdata; uvwasi_errno_t error; uvwasi_eventtype_t type; - union { - struct { - uvwasi_filesize_t nbytes; - uvwasi_eventrwflags_t flags; - } fd_readwrite; - } u; + uvwasi_event_fd_readwrite_t fd_readwrite; } uvwasi_event_t; typedef uint8_t uvwasi_whence_t; diff --git a/src/uvwasi.c b/src/uvwasi.c index 2c475c7..1631afc 100644 --- a/src/uvwasi.c +++ b/src/uvwasi.c @@ -1255,7 +1255,7 @@ uvwasi_errno_t uvwasi_fd_prestat_get(uvwasi_t* uvwasi, goto exit; } - buf->pr_type = UVWASI_PREOPENTYPE_DIR; + buf->tag = UVWASI_PREOPENTYPE_DIR; buf->u.dir.pr_name_len = strlen(wrap->path) + 1; err = UVWASI_ESUCCESS; exit: diff --git a/test/test-fd-prestat-dir-name.c b/test/test-fd-prestat-dir-name.c index 783484d..e4d2be3 100644 --- a/test/test-fd-prestat-dir-name.c +++ b/test/test-fd-prestat-dir-name.c @@ -35,7 +35,7 @@ int main(void) { /* Verify uvwasi_fd_prestat_get(). */ err = uvwasi_fd_prestat_get(&uvwasi, 3, &prestat); assert(err == 0); - assert(prestat.pr_type == UVWASI_PREOPENTYPE_DIR); + assert(prestat.tag == UVWASI_PREOPENTYPE_DIR); assert(prestat.u.dir.pr_name_len == strlen(init_options.preopens[0].mapped_path) + 1);