|
@@ -1,13 +1,14 @@
|
|
|
use alloc::borrow::ToOwned;
|
|
|
use alloc::ffi::CString;
|
|
|
use arch::{ExtendedContext, InterruptContext};
|
|
|
-use bindings::{EINVAL, ENOENT, ENOTDIR, ESRCH};
|
|
|
+use bindings::{EINVAL, ENOENT, ENOTDIR, ERANGE, ESRCH};
|
|
|
use bitflags::bitflags;
|
|
|
|
|
|
use crate::elf::ParsedElf32;
|
|
|
use crate::io::Buffer;
|
|
|
use crate::kernel::constants::{PR_GET_NAME, PR_SET_NAME, SIG_BLOCK, SIG_SETMASK, SIG_UNBLOCK};
|
|
|
-use crate::kernel::mem::VAddr;
|
|
|
+use crate::kernel::mem::phys::PhysPtr;
|
|
|
+use crate::kernel::mem::{Page, PageBuffer, VAddr};
|
|
|
use crate::kernel::task::{
|
|
|
ProcessList, Scheduler, Signal, SignalAction, Thread, UserDescriptor, WaitObject, WaitType,
|
|
|
};
|
|
@@ -33,9 +34,12 @@ fn do_umask(mask: u32) -> KResult<u32> {
|
|
|
|
|
|
fn do_getcwd(buffer: *mut u8, bufsize: usize) -> KResult<usize> {
|
|
|
let context = FsContext::get_current();
|
|
|
- let mut buffer = UserBuffer::new(buffer, bufsize)?;
|
|
|
+ let mut user_buffer = UserBuffer::new(buffer, bufsize)?;
|
|
|
|
|
|
+ let page = Page::alloc_one();
|
|
|
+ let mut buffer = PageBuffer::new(page.clone());
|
|
|
context.cwd.lock().get_path(&context, &mut buffer)?;
|
|
|
+ user_buffer.fill(page.as_cached().as_slice(page.len()))?.ok_or(ERANGE)?;
|
|
|
|
|
|
Ok(buffer.wrote())
|
|
|
}
|