1
0
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:
Wang Runji 2019-04-15 13:50:17 +08:00 committed by GitHub
commit 1708c4e6d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 6 deletions

4
.gitignore vendored
View File

@ -14,4 +14,8 @@ Cargo.lock
# for eclipse
.project
# for vscode
.vscode
# for vim
*.swp

View File

@ -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)
}