]> source.dussan.org Git - nextcloud-server.git/commitdiff
bug fix in mimetype detect code
authorRobin <robin@Amaya.(none)>
Sun, 25 Apr 2010 16:27:02 +0000 (18:27 +0200)
committerRobin <robin@Amaya.(none)>
Sun, 25 Apr 2010 16:27:02 +0000 (18:27 +0200)
inc/lib_files.php

index 6188723c028df626045b26c882f83cb3eacce0c4..2e77067b4a770903b8e1839eeb69928238f81395 100755 (executable)
@@ -205,7 +205,7 @@ class OC_FILES {
                } else if (function_exists("mime_content_type")) {
                        // use mime magic extension if available
                        $mime_type = mime_content_type($fspath);
-               } else if ($this->_can_execute("file")) {
+               } else if (OC_FILES::canExecute("file")) {
                        // it looks like we have a 'file' command, 
                        // lets see it it does have mime support
                        $fp = popen("file -i '$fspath' 2>/dev/null", "r");
@@ -255,6 +255,49 @@ class OC_FILES {
                
                return $mime_type;
        }
+       
+       /**
+       * detect if a given program is found in the search PATH
+       *
+       * helper function used by _mimetype() to detect if the 
+       * external 'file' utility is available
+       *
+       * @param  string  program name
+       * @param  string  optional search path, defaults to $PATH
+       * @return bool    true if executable program found in path
+       */
+       function canExecute($name, $path = false) 
+       {
+               // path defaults to PATH from environment if not set
+               if ($path === false) {
+                       $path = getenv("PATH");
+               }
+               
+               // check method depends on operating system
+               if (!strncmp(PHP_OS, "WIN", 3)) {
+                       // on Windows an appropriate COM or EXE file needs to exist
+                       $exts = array(".exe", ".com");
+                       $check_fn = "file_exists";
+               } else { 
+                       // anywhere else we look for an executable file of that name
+                       $exts = array("");
+                       $check_fn = "is_executable";
+               }
+               
+               // now check the directories in the path for the program
+               foreach (explode(PATH_SEPARATOR, $path) as $dir) {
+                       // skip invalid path entries
+                       if (!file_exists($dir)) continue;
+                       if (!is_dir($dir)) continue;
+
+                       // and now look for the file
+                       foreach ($exts as $ext) {
+                               if ($check_fn("$dir/$name".$ext)) return true;
+                       }
+               }
+
+               return false;
+       }
 
 }