@@ -236,7 +236,7 @@ pub fn ioctl(fd: usize, command: usize, argument: usize) -> Result<usize, Syscal
236236 // Sets the close-on-exec file descriptor flag. This is equivalent
237237 // to `fcntl(fd, F_SETFD, FD_CLOEXEC)`
238238 FIOCLEX => {
239- handle. fd_flags . lock ( ) . insert ( FdFlags :: CLOEXEC ) ;
239+ handle. flags . write ( ) . insert ( OpenFlags :: O_CLOEXEC ) ;
240240 Ok ( 0 )
241241 }
242242
@@ -327,6 +327,14 @@ pub fn access(fd: usize, path: &Path, _mode: usize, _flags: usize) -> Result<usi
327327 }
328328}
329329
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+
330338#[ syscall]
331339pub fn fcntl ( fd : usize , command : usize , arg : usize ) -> Result < usize , SyscallError > {
332340 let handle = scheduler:: get_scheduler ( )
@@ -361,14 +369,26 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result<usize, SyscallErro
361369
362370 // Get the value of file descriptor flags.
363371 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 ( ) )
366380 }
367381
368382 // Set the value of file descriptor flags:
369383 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+ }
372392
373393 Ok ( 0 )
374394 }
@@ -381,7 +401,8 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result<usize, SyscallErro
381401
382402 aero_syscall:: prelude:: F_SETFL => {
383403 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 ) ;
385406
386407 Ok ( 0 )
387408 }
0 commit comments