Index: wp-admin/includes/class-wp-filesystem-base.php
===================================================================
--- wp-admin/includes/class-wp-filesystem-base.php	(revision 0)
+++ wp-admin/includes/class-wp-filesystem-base.php	(revision 0)
@@ -0,0 +1,158 @@
+<?php
+class WP_Filesystem_Base{
+	var $verbose = true;
+	var $cache = array();
+	
+	var $method = '';
+	
+	function abspath() {
+		if ( defined('FTP_BASE') && strpos($this->method, 'ftp') !== false ) 
+			return FTP_BASE;
+		return $this->find_folder(ABSPATH);
+	}
+	function wp_content_dir() {
+		if ( defined('FTP_CONTENT_DIR') && strpos($this->method, 'ftp') !== false ) 
+			return FTP_CONTENT_DIR;
+		return $this->find_folder(WP_CONTENT_DIR);
+	}
+	function wp_plugins_dir() {
+		if ( defined('FTP_PLUGIN_DIR') && strpos($this->method, 'ftp') !== false ) 
+			return FTP_PLUGIN_DIR;
+		return $this->find_folder(WP_PLUGIN_DIR);
+	}
+	function wp_themes_dir() {
+		return $this->wp_content_dir() . '/themes';
+	}
+	//Back compat: use abspath() or wp_*_dir
+	function find_base_dir($base = '.', $echo = false) {
+		$this->verbose = $echo;
+		return $this->abspath();
+	}
+	//Back compat: use ::abspath() or ::wp_*_dir
+	function get_base_dir($base = '.', $echo = false) {
+		$this->verbose = $echo;
+		return $this->abspath();
+	}
+	
+	function find_folder($folder) {
+		$folder = str_replace('\\', '/', $folder); //Windows Sanitiation
+		if ( isset($this->cache[ $folder ] ) )
+			return $this->cache[ $folder ];
+
+		if ( $this->exists($folder) ) { //Folder exists at that absolute path.
+			$this->cache[ $folder ] = $folder;
+			return $folder;
+		}
+		if( $return = $this->search_for_folder($folder) )
+			$this->cache[ $folder ] = $return;
+		return $return;
+	}
+	
+	// Assumes $folder is windows sanitized;
+	// Assumes that the drive letter is safe to be stripped off, Should not be a problem for windows servers.
+	function search_for_folder($folder, $base = '.', $loop = false ) {
+		if ( empty( $base ) || '.' == $base )
+			$base = trailingslashit($this->cwd());
+		
+		$folder = preg_replace('|^([a-z]{1}):|i', '', $folder); //Strip out windows driveletter if its there.
+		
+		$folder_parts = explode('/', $folder);
+		$last_path = $folder_parts[ count($folder_parts) - 1 ];
+		
+		$files = $this->dirlist( $base );
+		
+		foreach ( $folder_parts as $key ) {
+			if ( $key == $last_path )
+				continue; //We want this to be caught by the next code block.
+
+			//Working from /home/ to /user/ to /wordpress/ see if that file exists within the current folder, 
+			// If its found, change into it and follow through looking for it. 
+			// If it cant find WordPress down that route, it'll continue onto the next folder level, and see if that matches, and so on.
+			// If it reaches the end, and still cant find it, it'll return false for the entire function.
+			if( isset($files[ $key ]) ){
+				//Lets try that folder:
+				$newdir = trailingslashit(path_join($base, $key));
+				if( $this->verbose )
+					printf( __('Changing to %s') . '<br/>', $newdir );
+				if( $ret = $this->search_for_folder( $folder, $newdir, $loop) )
+					return $ret;
+			}
+		}
+		
+		//Only check this as a last resort, to prevent locating the incorrect install. All above proceeedures will fail quickly if this is the right branch to take.
+		if(isset( $files[ $last_path ] ) ) {
+			if( $this->verbose )
+				printf( __('Found %s') . '<br/>',  $base . $last_path );
+			return $base . $last_path;
+		}
+		if( $loop )
+			return false;//Prevent tihs function looping again.
+		//As an extra last resort, Change back to / if the folder wasnt found. This comes into effect when the CWD is /home/user/ but WP is at /var/www/.... mainly dedicated setups.
+		return $this->search_for_folder($folder, '/', true); 
+		
+	}
+	
+	//Common Helper functions.
+	function gethchmod($file){
+		//From the PHP.net page for ...?
+		$perms = $this->getchmod($file);
+		if (($perms & 0xC000) == 0xC000) // Socket
+			$info = 's';
+		elseif (($perms & 0xA000) == 0xA000) // Symbolic Link
+			$info = 'l';
+		elseif (($perms & 0x8000) == 0x8000) // Regular
+			$info = '-';
+		elseif (($perms & 0x6000) == 0x6000) // Block special
+			$info = 'b';
+		elseif (($perms & 0x4000) == 0x4000) // Directory
+			$info = 'd';
+		elseif (($perms & 0x2000) == 0x2000) // Character special
+			$info = 'c';
+		elseif (($perms & 0x1000) == 0x1000)// FIFO pipe
+			$info = 'p';
+		else // Unknown
+			$info = 'u';
+
+		// Owner
+		$info .= (($perms & 0x0100) ? 'r' : '-');
+		$info .= (($perms & 0x0080) ? 'w' : '-');
+		$info .= (($perms & 0x0040) ?
+					(($perms & 0x0800) ? 's' : 'x' ) :
+					(($perms & 0x0800) ? 'S' : '-'));
+
+		// Group
+		$info .= (($perms & 0x0020) ? 'r' : '-');
+		$info .= (($perms & 0x0010) ? 'w' : '-');
+		$info .= (($perms & 0x0008) ?
+					(($perms & 0x0400) ? 's' : 'x' ) :
+					(($perms & 0x0400) ? 'S' : '-'));
+
+		// World
+		$info .= (($perms & 0x0004) ? 'r' : '-');
+		$info .= (($perms & 0x0002) ? 'w' : '-');
+		$info .= (($perms & 0x0001) ?
+					(($perms & 0x0200) ? 't' : 'x' ) :
+					(($perms & 0x0200) ? 'T' : '-'));
+		return $info;
+	}
+	function getnumchmodfromh($mode) {
+		$realmode = "";
+		$legal =  array("", "w", "r", "x", "-");
+		$attarray = preg_split("//", $mode);
+
+		for($i=0; $i < count($attarray); $i++)
+		   if($key = array_search($attarray[$i], $legal))
+			   $realmode .= $legal[$key];
+			   
+		$mode = str_pad($realmode, 9, '-');
+		$trans = array('-'=>'0', 'r'=>'4', 'w'=>'2', 'x'=>'1');
+		$mode = strtr($mode,$trans);
+		
+		$newmode = '';
+		$newmode .= $mode[0] + $mode[1] + $mode[2];
+		$newmode .= $mode[3] + $mode[4] + $mode[5];
+		$newmode .= $mode[6] + $mode[7] + $mode[8];
+		return $newmode;
+	}
+}
+?>
\ No newline at end of file
Index: wp-admin/includes/class-wp-filesystem-direct.php
===================================================================
--- wp-admin/includes/class-wp-filesystem-direct.php	(revision 8015)
+++ wp-admin/includes/class-wp-filesystem-direct.php	(working copy)
@@ -4,6 +4,7 @@
 	var $permission = null;
 	var $errors = array();
 	function WP_Filesystem_Direct($arg) {
+		$this->method = 'direct';
 		$this->errors = new WP_Error();
 		$this->permission = umask();
 	}
@@ -19,10 +20,10 @@
 	function get_contents_array($file) {
 		return @file($file);
 	}
-	function put_contents($file,$contents,$mode=false,$type='') {
-		if ( ! ($fp = @fopen($file,'w' . $type)) )
+	function put_contents($file, $contents, $mode = false, $type = '') {
+		if ( ! ($fp = @fopen($file, 'w' . $type)) )
 			return false;
-		@fwrite($fp,$contents);
+		@fwrite($fp, $contents);
 		@fclose($fp);
 		$this->chmod($file,$mode);
 		return true;
@@ -33,7 +34,7 @@
 	function chdir($dir) {
 		return @chdir($dir);
 	}
-	function chgrp($file,$group,$recursive=false) {
+	function chgrp($file, $group, $recursive = false) {
 		if( ! $this->exists($file) )
 			return false;
 		if( ! $recursive )
@@ -48,7 +49,7 @@
 
 		return true;
 	}
-	function chmod($file,$mode=false,$recursive=false) {
+	function chmod($file, $mode = false, $recursive = false) {
 		if( ! $mode )
 			$mode = $this->permission;
 		if( ! $this->exists($file) )
Index: wp-admin/includes/class-wp-filesystem-ftpsockets.php
===================================================================
--- wp-admin/includes/class-wp-filesystem-ftpsockets.php	(revision 8015)
+++ wp-admin/includes/class-wp-filesystem-ftpsockets.php	(working copy)
@@ -1,5 +1,5 @@
 <?php
-class WP_Filesystem_ftpsockets{
+class WP_Filesystem_ftpsockets extends WP_Filesystem_Base {
 	var $ftp = false;
 	var $timeout = 5;
 	var $errors;
@@ -86,175 +86,109 @@
 		$this->permission = $perm;
 	}
 
-	function get_contents($file,$type='',$resumepos=0){
+	function get_contents($file, $type = '', $resumepos = 0){
 		if( ! $this->exists($file) )
 			return false;
 
 		if( empty($type) ){
-			$extension = substr(strrchr($file, "."), 1);
+			$extension = substr(strrchr($file, '.'), 1);
 			$type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_AUTOASCII;
 		}
 		$this->ftp->SetType($type);
-		$temp = tmpfile();
-		if ( ! $temp )
+		$temp = wp_tempnam( $file );
+		if ( ! $temphandle = fopen($temp, 'w+') )
 			return false;
-		if ( ! $this->ftp->fget($temp, $file) ) {
-			fclose($temp);
+		if ( ! $this->ftp->fget($temphandle, $file) ) {
+			fclose($temphandle);
+			unlink($temp);
 			return ''; //Blank document, File does exist, Its just blank.
 		}
-		fseek($temp, 0); //Skip back to the start of the file being written to
+		fseek($temphandle, 0); //Skip back to the start of the file being written to
 		$contents = '';
-		while ( !feof($temp) )
-			$contents .= fread($temp, 8192);
-		fclose($temp);
+		while ( ! feof($temphandle) )
+			$contents .= fread($temphandle, 8192);
+		fclose($temphandle);
+		unlink($temp);
 		return $contents;
 	}
 
 	function get_contents_array($file){
-		return explode("\n",$this->get_contents($file));
+		return explode("\n", $this->get_contents($file) );
 	}
 
-	function put_contents($file,$contents,$type=''){
+	function put_contents($file, $contents, $type = '' ) {
 		if( empty($type) ){
-			$extension = substr(strrchr($file, "."), 1);
-			$type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_ASCII;
+			$extension = substr(strrchr($file, '.'), 1);
+			$type = isset($this->filetypes[ $extension ]) ? $this->filetypes[ $extension ] : FTP_AUTOASCII;
 		}
 		$this->ftp->SetType($type);
 
-		$temp = tmpfile();
-		if ( ! $temp )
+		$temp = wp_tempnam( $file );
+		if ( ! $temphandle = fopen($temp, 'w+') ){
+			unlink($temp);		
 			return false;
-		fwrite($temp,$contents);
-		fseek($temp, 0); //Skip back to the start of the file being written to
-		$ret = $this->ftp->fput($file, $temp);
-		fclose($temp);
+		}
+		fwrite($temphandle, $contents);
+		fseek($temphandle, 0); //Skip back to the start of the file being written to
+		$ret = $this->ftp->fput($file, $temphandle);
+		fclose($temphandle);
+		unlink($temp);
 		return $ret;
 	}
 
-	function cwd(){
+	function cwd() {
 		$cwd = $this->ftp->pwd();
 		if( $cwd )
 			$cwd = trailingslashit($cwd);
 		return $cwd;
 	}
 
-	function chdir($file){
+	function chdir($file) {
 		return $this->ftp->chdir($file);
 	}
 	
-	function chgrp($file,$group,$recursive=false){
+	function chgrp($file, $group, $recursive = false ) {
 		return false;
 	}
 
-	function chmod($file,$mode=false,$recursive=false){
+	function chmod($file, $mode = false, $recursive = false ){
 		if( ! $mode )
 			$mode = $this->permission;
 		if( ! $mode )
 			return false;
 		//if( ! $this->exists($file) )
 		//	return false;
-		if( ! $recursive || ! $this->is_dir($file) ){
+		if( ! $recursive || ! $this->is_dir($file) ) {
 			return $this->ftp->chmod($file,$mode);
 		}
 		//Is a directory, and we want recursive
 		$filelist = $this->dirlist($file);
 		foreach($filelist as $filename){
-			$this->chmod($file.'/'.$filename,$mode,$recursive);
+			$this->chmod($file . '/' . $filename, $mode, $recursive);
 		}
 		return true;
 	}
 
-	function chown($file,$owner,$recursive=false){
+	function chown($file, $owner, $recursive = false ) {
 		return false;
 	}
 
-	function owner($file){
+	function owner($file) {
 		$dir = $this->dirlist($file);
 		return $dir[$file]['owner'];
 	}
 
-	function getchmod($file){
+	function getchmod($file) {
 		$dir = $this->dirlist($file);
 		return $dir[$file]['permsn'];
 	}
 
-	function gethchmod($file){
-		//From the PHP.net page for ...?
-		$perms = $this->getchmod($file);
-		if (($perms & 0xC000) == 0xC000) {
-			// Socket
-			$info = 's';
-		} elseif (($perms & 0xA000) == 0xA000) {
-			// Symbolic Link
-			$info = 'l';
-		} elseif (($perms & 0x8000) == 0x8000) {
-			// Regular
-			$info = '-';
-		} elseif (($perms & 0x6000) == 0x6000) {
-			// Block special
-			$info = 'b';
-		} elseif (($perms & 0x4000) == 0x4000) {
-			// Directory
-			$info = 'd';
-		} elseif (($perms & 0x2000) == 0x2000) {
-			// Character special
-			$info = 'c';
-		} elseif (($perms & 0x1000) == 0x1000) {
-			// FIFO pipe
-			$info = 'p';
-		} else {
-			// Unknown
-			$info = 'u';
-		}
-
-		// Owner
-		$info .= (($perms & 0x0100) ? 'r' : '-');
-		$info .= (($perms & 0x0080) ? 'w' : '-');
-		$info .= (($perms & 0x0040) ?
-					(($perms & 0x0800) ? 's' : 'x' ) :
-					(($perms & 0x0800) ? 'S' : '-'));
-
-		// Group
-		$info .= (($perms & 0x0020) ? 'r' : '-');
-		$info .= (($perms & 0x0010) ? 'w' : '-');
-		$info .= (($perms & 0x0008) ?
-					(($perms & 0x0400) ? 's' : 'x' ) :
-					(($perms & 0x0400) ? 'S' : '-'));
-
-		// World
-		$info .= (($perms & 0x0004) ? 'r' : '-');
-		$info .= (($perms & 0x0002) ? 'w' : '-');
-		$info .= (($perms & 0x0001) ?
-					(($perms & 0x0200) ? 't' : 'x' ) :
-					(($perms & 0x0200) ? 'T' : '-'));
-		return $info;
-	}
-
-	function getnumchmodfromh($mode) {
-		$realmode = "";
-		$legal =  array("","w","r","x","-");
-		$attarray = preg_split("//",$mode);
-		for($i=0;$i<count($attarray);$i++){
-		   if($key = array_search($attarray[$i],$legal)){
-			   $realmode .= $legal[$key];
-		   }
-		}
-		$mode = str_pad($realmode,9,'-');
-		$trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1');
-		$mode = strtr($mode,$trans);
-		$newmode = '';
-		$newmode .= $mode[0]+$mode[1]+$mode[2];
-		$newmode .= $mode[3]+$mode[4]+$mode[5];
-		$newmode .= $mode[6]+$mode[7]+$mode[8];
-		return $newmode;
-	}
-
-	function group($file){
+	function group($file) {
 		$dir = $this->dirlist($file);
 		return $dir[$file]['group'];
 	}
 
-	function copy($source,$destination,$overwrite=false){
+	function copy($source, $destination, $overwrite = false ) {
 		if( ! $overwrite && $this->exists($destination) )
 			return false;
 
