1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-08 12:40:44 +00:00

Reworked change_dir to support symlinks

This commit is contained in:
Fabian Mathews
2017-03-25 19:08:45 +10:30
parent a0b0dff6fd
commit d3b7d42784

View File

@@ -222,36 +222,37 @@ Error DirAccessUnix::make_dir(String p_dir) {
Error DirAccessUnix::change_dir(String p_dir) { Error DirAccessUnix::change_dir(String p_dir) {
GLOBAL_LOCK_FUNCTION GLOBAL_LOCK_FUNCTION
p_dir = fix_path(p_dir);
// make sure current_dir is valid absolute path
if (current_dir == "." || current_dir == "") {
char real_current_dir_name[2048]; char real_current_dir_name[2048];
getcwd(real_current_dir_name, 2048); getcwd(real_current_dir_name, 2048);
String prev_dir; current_dir.parse_utf8(real_current_dir_name);
if (prev_dir.parse_utf8(real_current_dir_name))
prev_dir = real_current_dir_name; //no utf8, maybe latin?
chdir(current_dir.utf8().get_data()); //ascii since this may be unicode or wathever the host os wants
bool worked = (chdir(p_dir.utf8().get_data()) == 0); // we can only give this utf8
String base = _get_root_path();
if (base != "") {
getcwd(real_current_dir_name, 2048);
String new_dir;
new_dir.parse_utf8(real_current_dir_name);
if (!new_dir.begins_with(base))
worked = false;
} }
if (worked) { if (p_dir == ".") {
return OK;
getcwd(real_current_dir_name, 2048);
if (current_dir.parse_utf8(real_current_dir_name))
current_dir = real_current_dir_name; //no utf8, maybe latin?
} }
chdir(prev_dir.utf8().get_data()); p_dir = fix_path(p_dir);
return worked ? OK : ERR_INVALID_PARAMETER;
String prev_dir = current_dir;
if (p_dir.is_rel_path()) {
String next_dir = current_dir + "/" + p_dir;
next_dir = next_dir.simplify_path();
current_dir = next_dir;
} else {
current_dir = p_dir;
}
bool worked = (chdir(current_dir.utf8().get_data()) == 0); // we can only give this utf8
if (!worked) {
current_dir = prev_dir;
return ERR_INVALID_PARAMETER;
}
return OK;
} }
String DirAccessUnix::get_current_dir() { String DirAccessUnix::get_current_dir() {