@@ -24,10 +24,7 @@ typedef struct {
2424 // and initially set to 0.
2525 streams_own_pollable_t read_pollable ;
2626 streams_own_pollable_t write_pollable ;
27- // File was opened for reading
28- bool readable ;
29- // File was opened for writing
30- bool writable ;
27+ int oflag ;
3128} file_t ;
3229
3330static void file_close_streams (void * data ) {
@@ -172,14 +169,60 @@ static off_t file_seek(void *data, off_t offset, int whence) {
172169 return file -> offset ;
173170}
174171
172+ static int file_set_blocking (void * data , bool blocking ) {
173+ file_t * file = (file_t * )data ;
174+ if (blocking )
175+ file -> oflag &= ~O_NONBLOCK ;
176+ else
177+ file -> oflag |= O_NONBLOCK ;
178+ return 0 ;
179+ }
180+
181+ static int file_fcntl_getfl (void * data ) {
182+ file_t * file = (file_t * )data ;
183+
184+ // Get the flags of the descriptor
185+ filesystem_descriptor_flags_t flags ;
186+ filesystem_error_code_t error_code ;
187+
188+ filesystem_borrow_descriptor_t file_handle = filesystem_borrow_descriptor (file -> file_handle );
189+ if (!filesystem_method_descriptor_get_flags (file_handle , & flags , & error_code )) {
190+ translate_error (error_code );
191+ return -1 ;
192+ }
193+
194+ int oflags = file -> oflag & (O_NONBLOCK | O_APPEND );
195+ if (flags & FILESYSTEM_DESCRIPTOR_FLAGS_READ ) {
196+ if (flags & FILESYSTEM_DESCRIPTOR_FLAGS_WRITE )
197+ oflags |= O_RDWR ;
198+ else
199+ oflags |= O_RDONLY ;
200+ } else if (flags & FILESYSTEM_DESCRIPTOR_FLAGS_WRITE ) {
201+ oflags |= O_WRONLY ;
202+ } else {
203+ oflags |= O_SEARCH ;
204+ }
205+ return oflags ;
206+ }
207+
208+ static int file_fcntl_setfl (void * data , int flags ) {
209+ file_t * file = (file_t * )data ;
210+ flags &= O_NONBLOCK | O_APPEND ;
211+ file -> oflag = (file -> oflag & ~(O_NONBLOCK | O_APPEND )) | flags ;
212+ return 0 ;
213+ }
214+
175215static descriptor_vtable_t file_vtable = {
176216 .free = file_free ,
177217 .get_read_stream = file_get_read_stream ,
178218 .get_write_stream = file_get_write_stream ,
179219 .get_file = file_get_file ,
220+ .set_blocking = file_set_blocking ,
180221 .fstat = file_fstat ,
181222 .seek = file_seek ,
182223 .close_streams = file_close_streams ,
224+ .fcntl_getfl = file_fcntl_getfl ,
225+ .fcntl_setfl = file_fcntl_setfl ,
183226};
184227
185228int __wasilibc_add_file (filesystem_own_descriptor_t file_handle , int oflag ) {
@@ -191,8 +234,7 @@ int __wasilibc_add_file(filesystem_own_descriptor_t file_handle, int oflag) {
191234 }
192235 assert (file_handle .__handle != 0 );
193236 file -> file_handle = file_handle ;
194- file -> readable = oflag & O_RDONLY ;
195- file -> writable = oflag & O_WRONLY ;
237+ file -> oflag = oflag ;
196238
197239 descriptor_table_entry_t entry ;
198240 entry .vtable = & file_vtable ;
0 commit comments