Browse Source

Merge pull request #8144 from supagu/symlink

Reworked change_dir to support symlinks
Rémi Verschelde 8 years ago
parent
commit
22d21ebef0
1 changed files with 23 additions and 22 deletions
  1. 23 22
      drivers/unix/dir_access_unix.cpp

+ 23 - 22
drivers/unix/dir_access_unix.cpp

@@ -223,36 +223,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);
 
 
-	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?
+	// 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);
+	}
 
 
-	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
+	if (p_dir == ".") {
+		return OK;
+	}
 
 
-	String base = _get_root_path();
-	if (base != "") {
+	p_dir = fix_path(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;
-	}
+	String prev_dir = current_dir;
 
 
-	if (worked) {
+	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);
-		if (current_dir.parse_utf8(real_current_dir_name))
-			current_dir = real_current_dir_name; //no utf8, maybe latin?
+	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;
 	}
 	}
 
 
-	chdir(prev_dir.utf8().get_data());
-	return worked ? OK : ERR_INVALID_PARAMETER;
+	return OK;
 }
 }
 
 
 String DirAccessUnix::get_current_dir() {
 String DirAccessUnix::get_current_dir() {