diff --git a/kernel/src/syscall/getcwd.rs b/kernel/src/syscall/getcwd.rs index c1ef00ae8..905b2689d 100644 --- a/kernel/src/syscall/getcwd.rs +++ b/kernel/src/syscall/getcwd.rs @@ -1,14 +1,27 @@ // SPDX-License-Identifier: MPL-2.0 use super::SyscallReturn; -use crate::prelude::*; +use crate::{ + fs::fs_resolver::{FsPath, AT_FDCWD}, + prelude::*, +}; pub fn sys_getcwd(buf: Vaddr, len: usize, ctx: &Context) -> Result { - // TODO: getcwd only return a fake result now - let fake_cwd = CString::new("/")?; - let bytes = fake_cwd.as_bytes_with_nul(); + let current = ctx.process; + let dirent = current + .fs() + .read() + .lookup(&FsPath::new(AT_FDCWD, "").unwrap()) + .unwrap(); + let name = dirent.abs_path(); + + debug!("getcwd: {:?}", name); + + let cwd = CString::new(name)?; + let bytes = cwd.as_bytes_with_nul(); let write_len = len.min(bytes.len()); ctx.get_user_space() .write_bytes(buf, &mut VmReader::from(&bytes[..write_len]))?; + Ok(SyscallReturn::Return(write_len as _)) }