diff options
Diffstat (limited to 'drivers/unix/dir_access_unix.cpp')
| -rw-r--r-- | drivers/unix/dir_access_unix.cpp | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index a183a3744..ddc3b2ed3 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -3,7 +3,7 @@ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ -/* http://www.godotengine.org */ +/* https://godotengine.org */ /*************************************************************************/ /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */ /* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md) */ @@ -194,21 +194,9 @@ Error DirAccessUnix::make_dir(String p_dir) { p_dir = fix_path(p_dir); -#if 1 - - bool success = (mkdir(p_dir.utf8().get_data(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == 0); - int err = errno; - -#else - char real_current_dir_name[2048]; - getcwd(real_current_dir_name, 2048); - chdir(current_dir.utf8().get_data()); //ascii since this may be unicode or wathever the host os wants - bool success = (mkdir(p_dir.utf8().get_data(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == 0); int err = errno; - chdir(real_current_dir_name); -#endif if (success) { return OK; }; @@ -223,37 +211,36 @@ Error DirAccessUnix::make_dir(String p_dir) { Error DirAccessUnix::change_dir(String p_dir) { 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]; - getcwd(real_current_dir_name, 2048); - current_dir.parse_utf8(real_current_dir_name); - } - - if (p_dir == ".") { - return OK; - } + char real_current_dir_name[2048]; + getcwd(real_current_dir_name, 2048); + String prev_dir; + if (prev_dir.parse_utf8(real_current_dir_name)) + prev_dir = real_current_dir_name; //no utf8, maybe latin? - p_dir = fix_path(p_dir); + 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 prev_dir = current_dir; + String base = _get_root_path(); + if (base != "") { - 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; + 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; } - 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; + if (worked) { + + 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? } - return OK; + chdir(prev_dir.utf8().get_data()); + return worked ? OK : ERR_INVALID_PARAMETER; } String DirAccessUnix::get_current_dir() { |
