-
Notifications
You must be signed in to change notification settings - Fork 226
Open
Description
fcntl doesn't implement O_NONBLOCK for wasi:socket handles
See
wasi-libc/libc-bottom-half/cloudlibc/src/libc/fcntl/fcntl.c
Lines 10 to 61 in 1b19fc6
| int fcntl(int fildes, int cmd, ...) { | |
| switch (cmd) { | |
| case F_GETFD: | |
| // Act as if the close-on-exec flag is always set. | |
| return FD_CLOEXEC; | |
| case F_SETFD: | |
| // The close-on-exec flag is ignored. | |
| return 0; | |
| case F_GETFL: { | |
| // Obtain the flags and the rights of the descriptor. | |
| __wasi_fdstat_t fds; | |
| __wasi_errno_t error = __wasi_fd_fdstat_get(fildes, &fds); | |
| if (error != 0) { | |
| errno = error; | |
| return -1; | |
| } | |
| // Roughly approximate the access mode by converting the rights. | |
| int oflags = fds.fs_flags; | |
| if ((fds.fs_rights_base & | |
| (__WASI_RIGHTS_FD_READ | __WASI_RIGHTS_FD_READDIR)) != 0) { | |
| if ((fds.fs_rights_base & __WASI_RIGHTS_FD_WRITE) != 0) | |
| oflags |= O_RDWR; | |
| else | |
| oflags |= O_RDONLY; | |
| } else if ((fds.fs_rights_base & __WASI_RIGHTS_FD_WRITE) != 0) { | |
| oflags |= O_WRONLY; | |
| } else { | |
| oflags |= O_SEARCH; | |
| } | |
| return oflags; | |
| } | |
| case F_SETFL: { | |
| // Set new file descriptor flags. | |
| va_list ap; | |
| va_start(ap, cmd); | |
| int flags = va_arg(ap, int); | |
| va_end(ap); | |
| __wasi_fdflags_t fs_flags = flags & 0xfff; | |
| __wasi_errno_t error = | |
| __wasi_fd_fdstat_set_flags(fildes, fs_flags); | |
| if (error != 0) { | |
| errno = error; | |
| return -1; | |
| } | |
| return 0; | |
| } | |
| default: | |
| errno = EINVAL; | |
| return -1; | |
| } |
Metadata
Metadata
Assignees
Labels
No labels