mirror of
https://github.com/rcore-os/rCore.git
synced 2024-11-23 00:16:17 +04:00
Merge pull request #9 from GeminiLab/geminilab
BUGFIX: fix cd . and .. on cwd
This commit is contained in:
commit
1708c4e6d4
4
.gitignore
vendored
4
.gitignore
vendored
@ -14,4 +14,8 @@ Cargo.lock
|
||||
# for eclipse
|
||||
.project
|
||||
|
||||
# for vscode
|
||||
.vscode
|
||||
|
||||
# for vim
|
||||
*.swp
|
||||
|
@ -468,12 +468,34 @@ pub fn sys_chdir(path: *const u8) -> SysResult {
|
||||
return Err(SysError::ENOTDIR);
|
||||
}
|
||||
|
||||
if path.len() > 0 && path.as_bytes()[0] == b'/' {
|
||||
// absolute
|
||||
proc.cwd = path;
|
||||
} else {
|
||||
// relative
|
||||
proc.cwd += &path;
|
||||
// BUGFIX: '..' and '.'
|
||||
if path.len() > 0 {
|
||||
let cwd = match path.as_bytes()[0] {
|
||||
b'/' => String::from("/"),
|
||||
_ => proc.cwd.clone()
|
||||
};
|
||||
let mut cwd_vec:Vec<_> =
|
||||
cwd.split("/")
|
||||
.filter(|&x| x != "")
|
||||
.collect();
|
||||
let path_split = path.split("/").filter(|&x| x != "");
|
||||
for seg in path_split {
|
||||
if seg == ".." {
|
||||
cwd_vec.pop();
|
||||
} else if seg == "." {
|
||||
// nothing to do here.
|
||||
} else {
|
||||
cwd_vec.push(seg);
|
||||
}
|
||||
}
|
||||
proc.cwd = String::from("");
|
||||
for seg in cwd_vec {
|
||||
proc.cwd.push_str("/");
|
||||
proc.cwd.push_str(seg);
|
||||
}
|
||||
if proc.cwd == "" {
|
||||
proc.cwd = String::from("/");
|
||||
}
|
||||
}
|
||||
Ok(0)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user