@@ -28,7 +28,7 @@ use crate::fs::eventfd::EventFd;
28
28
use crate :: fs:: file_table:: { DuplicateHint , FileHandle } ;
29
29
use crate :: fs:: inode:: { DirEntry , PollTable } ;
30
30
use crate :: fs:: pipe:: Pipe ;
31
- use crate :: fs:: { self , lookup_path , LookupMode } ;
31
+ use crate :: fs:: { self , LookupMode } ;
32
32
use crate :: syscall:: SysArg ;
33
33
use crate :: userland:: scheduler;
34
34
@@ -353,14 +353,19 @@ pub fn unlink(_fd: usize, _path: &Path, _flags: usize) -> Result<usize, SyscallE
353
353
}
354
354
355
355
#[ syscall]
356
- pub fn access ( fd : usize , path : & Path , _mode : usize , _flags : usize ) -> Result < usize , SyscallError > {
357
- if fd as isize == aero_syscall:: AT_FDCWD {
358
- lookup_path ( path) ?;
359
- Ok ( 0x00 )
360
- } else {
361
- // TODO: Implement atfd access
362
- unimplemented ! ( )
363
- }
356
+ pub fn access ( fd : usize , path : & Path , _mode : usize , flags : usize ) -> Result < usize , SyscallError > {
357
+ let at = match fd as isize {
358
+ AT_FDCWD if !path. is_absolute ( ) => scheduler:: current_thread ( ) . cwd_dirent ( ) ,
359
+ _ if !path. is_absolute ( ) => FileDescriptor :: from_usize ( fd) . handle ( ) ?. inode . clone ( ) ,
360
+ _ => fs:: root_dir ( ) . clone ( ) ,
361
+ } ;
362
+
363
+ let flags = AtFlags :: from_bits ( flags) . ok_or ( SyscallError :: EINVAL ) ?;
364
+
365
+ let resolve_last = !flags. contains ( AtFlags :: SYMLINK_NOFOLLOW ) ;
366
+ let _ = fs:: lookup_path_with ( at, path, LookupMode :: None , resolve_last) ?;
367
+
368
+ Ok ( 0 )
364
369
}
365
370
366
371
const SETFL_MASK : OpenFlags = OpenFlags :: from_bits_truncate (
0 commit comments