@@ -236,7 +236,7 @@ pub fn ioctl(fd: usize, command: usize, argument: usize) -> Result<usize, Syscal
236
236
// Sets the close-on-exec file descriptor flag. This is equivalent
237
237
// to `fcntl(fd, F_SETFD, FD_CLOEXEC)`
238
238
FIOCLEX => {
239
- handle. fd_flags . lock ( ) . insert ( FdFlags :: CLOEXEC ) ;
239
+ handle. flags . write ( ) . insert ( OpenFlags :: O_CLOEXEC ) ;
240
240
Ok ( 0 )
241
241
}
242
242
@@ -327,6 +327,14 @@ pub fn access(fd: usize, path: &Path, _mode: usize, _flags: usize) -> Result<usi
327
327
}
328
328
}
329
329
330
+ const SETFL_MASK : OpenFlags = OpenFlags :: from_bits_truncate (
331
+ OpenFlags :: O_APPEND . bits ( )
332
+ | OpenFlags :: O_NONBLOCK . bits ( )
333
+ // | OpenFlags::O_NDELAY.bits()
334
+ | OpenFlags :: O_DIRECT . bits ( )
335
+ | OpenFlags :: O_NOATIME . bits ( ) ,
336
+ ) ;
337
+
330
338
#[ syscall]
331
339
pub fn fcntl ( fd : usize , command : usize , arg : usize ) -> Result < usize , SyscallError > {
332
340
let handle = scheduler:: get_scheduler ( )
@@ -361,14 +369,26 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result<usize, SyscallErro
361
369
362
370
// Get the value of file descriptor flags.
363
371
aero_syscall:: prelude:: F_GETFD => {
364
- let flags = handle. fd_flags . lock ( ) . bits ( ) ;
365
- Ok ( flags)
372
+ let flags = handle. flags . read ( ) ;
373
+ let mut result = FdFlags :: empty ( ) ;
374
+
375
+ if flags. contains ( OpenFlags :: O_CLOEXEC ) {
376
+ result. insert ( FdFlags :: CLOEXEC ) ;
377
+ }
378
+
379
+ Ok ( result. bits ( ) )
366
380
}
367
381
368
382
// Set the value of file descriptor flags:
369
383
aero_syscall:: prelude:: F_SETFD => {
370
- let flags = FdFlags :: from_bits ( arg) . ok_or ( SyscallError :: EINVAL ) ?;
371
- handle. fd_flags . lock ( ) . insert ( flags) ;
384
+ let mut flags = handle. flags . write ( ) ;
385
+ let fd_flags = FdFlags :: from_bits_truncate ( arg) ;
386
+
387
+ if fd_flags. contains ( FdFlags :: CLOEXEC ) {
388
+ flags. insert ( OpenFlags :: O_CLOEXEC ) ;
389
+ } else {
390
+ flags. remove ( OpenFlags :: O_CLOEXEC ) ;
391
+ }
372
392
373
393
Ok ( 0 )
374
394
}
@@ -381,7 +401,8 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result<usize, SyscallErro
381
401
382
402
aero_syscall:: prelude:: F_SETFL => {
383
403
let flags = OpenFlags :: from_bits_truncate ( arg) ;
384
- * handle. flags . write ( ) = flags;
404
+ let old_flags = * handle. flags . read ( ) ;
405
+ * handle. flags . write ( ) = ( flags & SETFL_MASK ) | ( old_flags & !SETFL_MASK ) ;
385
406
386
407
Ok ( 0 )
387
408
}
0 commit comments