Parcourir la source

Merge pull request #11011 from supagu/symlink4

Further symlink fixes
Juan Linietsky il y a 8 ans
Parent
commit
316ba650b2
1 fichiers modifiés avec 26 ajouts et 16 suppressions
  1. 26 16
      drivers/unix/dir_access_unix.cpp

+ 26 - 16
drivers/unix/dir_access_unix.cpp

@@ -212,36 +212,46 @@ Error DirAccessUnix::change_dir(String p_dir) {
 
 	GLOBAL_LOCK_FUNCTION
 
-	// 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;
-	}
-
 	p_dir = fix_path(p_dir);
 
-	String prev_dir = current_dir;
+	// prev_dir is the directory we are changing out of
+	String prev_dir;
+	char real_current_dir_name[2048];
+	getcwd(real_current_dir_name, 2048);
+	if (prev_dir.parse_utf8(real_current_dir_name))
+		prev_dir = real_current_dir_name; //no utf8, maybe latin?
 
+	//print_line("directory we are changing out of (prev_dir): " + prev_dir);
+
+	// try_dir is the directory we are trying to change into
+	String try_dir = "";
 	if (p_dir.is_rel_path()) {
 		String next_dir = current_dir + "/" + p_dir;
+		//print_line("p_dir is relative: " + p_dir + " about to simplfy: " + next_dir);
 		next_dir = next_dir.simplify_path();
-		current_dir = next_dir;
+		try_dir = next_dir;
 	} else {
-		current_dir = p_dir;
+		try_dir = p_dir;
+		//print_line("p_dir is absolute: " + p_dir);
+	}
+
+	// if try_dir is nothing, it is not changing directory so change it to a "." otherwise chdir will fail
+	if (try_dir == "") {
+		try_dir = ".";
 	}
 
-	bool worked = (chdir(current_dir.utf8().get_data()) == 0); // we can only give this utf8
+	//print_line("directory we are changing in to (try_dir): " + try_dir);
+
+	bool worked = (chdir(try_dir.utf8().get_data()) == 0); // we can only give this utf8
 	if (!worked) {
-		current_dir = prev_dir;
+		//print_line("directory does not exist");
 		return ERR_INVALID_PARAMETER;
 	}
 
+	// the directory exists, so set current_dir to try_dir
+	current_dir = try_dir;
 	chdir(prev_dir.utf8().get_data());
+	//print_line("directory exists, setting current_dir to: " + current_dir);
 	return OK;
 }