Updating version number to 4.2-dev after release of 4.2.0beta2a
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_exec.php
index dfb56d5..5116b2c 100755 (executable)
@@ -2,7 +2,7 @@
 /***************************************************************
 *  Copyright notice
 *
-*  (c) 2002-2004 René Fritz (r.fritz@colorcube.de)
+*  (c) 2002-2006 René Fritz (r.fritz@colorcube.de)
 *  All rights reserved
 *
 *  This script is part of the Typo3 project. The Typo3 project is
@@ -22,7 +22,7 @@
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/
 /**
- * t3lib_exec find executables (programs) on unix and windows without knowing where they are
+ * t3lib_exec finds executables (programs) on Unix and Windows without knowing where they are
  *
  * $Id$
  *
  *
  *
  *
- *   81: class t3lib_exec
- *   91:     function checkCommand($cmd, $handler='')
- *  162:     function getCommand($cmd, $handler='', $handlerOpt='')
- *  191:     function addPaths($paths)
- *  201:     function _getPaths()
- *  269:     function _init()
- *  285:     function _initPaths($paths='')
- *  340:     function _getOS()
- *  351:     function _fixPath($path)
+ *   85: class t3lib_exec
+ *   95:     function checkCommand($cmd, $handler='')
+ *  166:     function getCommand($cmd, $handler='', $handlerOpt='')
+ *  199:     function addPaths($paths)
+ *  211:     function getPaths($addInvalid=false)
+ *  237:     function _init()
+ *  259:     function _initPaths($paths='')
+ *  312:     function _getConfiguredApps()
+ *  339:     function _getPaths()
+ *  400:     function _fixPath($path)
  *
- * TOTAL FUNCTIONS: 8
+ * TOTAL FUNCTIONS: 9
  * (This index is automatically created/updated by the extension "extdeveval")
  *
  */
@@ -74,6 +75,9 @@
  * $GLOBALS['_SERVER']['PATH']
  * '/usr/bin/,/usr/local/bin/' on Unix
  *
+ * binaries can be preconfigured with
+ * $TYPO3_CONF_VARS['SYS']['binSetup']
+ *
  * @author     René Fritz <r.fritz@colorcube.de>
  * @package TYPO3
  * @subpackage t3lib
@@ -81,7 +85,7 @@
 class t3lib_exec {
 
        /**
-        * checks if a command is valid or not
+        * Checks if a command is valid or not
         * updates global vars
         *
         * @param       string          the command that should be executed. eg: "convert"
@@ -89,47 +93,46 @@ class t3lib_exec {
         * @return      boolean         false if cmd is not found, or -1 if the handler is not found
         */
        function checkCommand($cmd, $handler='')        {
+               global $T3_VAR;
 
-               t3lib_exec::_init();
-               $osType = t3lib_exec::_getOS();
-
+               if (!t3lib_exec::_init()) {
+                       return false;
+               }
 
-#debug($GLOBALS['t3lib_exec'], 't3lib_exec', __LINE__, __FILE__);
 
                if ($handler && !t3lib_exec::checkCommand($handler)) {
                        return -1;
                }
                        // already checked and valid
-               if ($GLOBALS['t3lib_exec']['apps'][$cmd]['valid']) {
+               if ($T3_VAR['t3lib_exec']['apps'][$cmd]['valid']) {
                        return true;
                }
                        // is set but was (above) not true
-               if (isset($GLOBALS['t3lib_exec']['apps'][$cmd]['valid'])) {
+               if (isset($T3_VAR['t3lib_exec']['apps'][$cmd]['valid'])) {
                        return false;
                }
 
-               reset($GLOBALS['t3lib_exec']['paths']);
-               foreach($GLOBALS['t3lib_exec']['paths'] as $path => $validPath) {
+               foreach($T3_VAR['t3lib_exec']['paths'] as $path => $validPath) {
                                // ignore invalid (false) paths
                        if ($validPath) {
-                               if ($osType=='WIN') {
+                               if (TYPO3_OS=='WIN') {
                                        if (@is_file($path.$cmd)) {
-                                               $GLOBALS['t3lib_exec']['apps'][$cmd]['app'] = $cmd;
-                                               $GLOBALS['t3lib_exec']['apps'][$cmd]['path'] = $path;
-                                               $GLOBALS['t3lib_exec']['apps'][$cmd]['valid'] = true;
+                                               $T3_VAR['t3lib_exec']['apps'][$cmd]['app'] = $cmd;
+                                               $T3_VAR['t3lib_exec']['apps'][$cmd]['path'] = $path;
+                                               $T3_VAR['t3lib_exec']['apps'][$cmd]['valid'] = true;
                                                return true;
                                        }
                                        if (@is_file($path.$cmd.'.exe')) {
-                                               $GLOBALS['t3lib_exec']['apps'][$cmd]['app'] = $cmd.'.exe';
-                                               $GLOBALS['t3lib_exec']['apps'][$cmd]['path'] = $path;
-                                               $GLOBALS['t3lib_exec']['apps'][$cmd]['valid'] = true;
+                                               $T3_VAR['t3lib_exec']['apps'][$cmd]['app'] = $cmd.'.exe';
+                                               $T3_VAR['t3lib_exec']['apps'][$cmd]['path'] = $path;
+                                               $T3_VAR['t3lib_exec']['apps'][$cmd]['valid'] = true;
                                                return true;
                                        }
                                } else { // UNIX
                                        if (@is_executable($path.$cmd)) {
-                                               $GLOBALS['t3lib_exec']['apps'][$cmd]['app'] = $cmd;
-                                               $GLOBALS['t3lib_exec']['apps'][$cmd]['path'] = $path;
-                                               $GLOBALS['t3lib_exec']['apps'][$cmd]['valid'] = true;
+                                               $T3_VAR['t3lib_exec']['apps'][$cmd]['app'] = $cmd;
+                                               $T3_VAR['t3lib_exec']['apps'][$cmd]['path'] = $path;
+                                               $T3_VAR['t3lib_exec']['apps'][$cmd]['valid'] = true;
                                                return true;
                                        }
                                }
@@ -137,13 +140,13 @@ class t3lib_exec {
                }
 
                        // try to get the executable with the command 'which'. It do the same like already done, but maybe on other paths??
-               if ($osType=='UNIX') {
-                       $cmd = @exec ('which '.$val['cmd']);
+               if (TYPO3_OS!='WIN') {
+                       $cmd = @exec ('which '.$cmd);
 
                        if (@is_executable($cmd)) {
-                               $GLOBALS['t3lib_exec']['apps'][$cmd]['app'] = $cmd;
-                               $GLOBALS['t3lib_exec']['apps'][$cmd]['path'] = dirname($cmd).'/';
-                               $GLOBALS['t3lib_exec']['apps'][$cmd]['valid'] = true;
+                               $T3_VAR['t3lib_exec']['apps'][$cmd]['app'] = $cmd;
+                               $T3_VAR['t3lib_exec']['apps'][$cmd]['path'] = dirname($cmd).'/';
+                               $T3_VAR['t3lib_exec']['apps'][$cmd]['valid'] = true;
                                return true;
                        }
                }
@@ -151,8 +154,9 @@ class t3lib_exec {
                return false;
        }
 
+
        /**
-        * returns a command string for exec(), system()
+        * Returns a command string for exec(), system()
         *
         * @param       string          the command that should be executed. eg: "convert"
         * @param       string          handler (executor) for the command. eg: "perl"
@@ -160,8 +164,11 @@ class t3lib_exec {
         * @return      mixed           returns command string, or false if cmd is not found, or -1 if the handler is not found
         */
        function getCommand($cmd, $handler='', $handlerOpt='')  {
+               global $T3_VAR;
 
-               t3lib_exec::_init();
+               if (!t3lib_exec::_init()) {
+                       return false;
+               }
 
                        // handler
                if ($handler) {
@@ -177,136 +184,104 @@ class t3lib_exec {
                if (!t3lib_exec::checkCommand($cmd)) {
                        return false;
                }
-               $cmd = $GLOBALS['t3lib_exec']['apps'][$cmd]['path'].$GLOBALS['t3lib_exec']['apps'][$cmd]['app'].' ';
+               $cmd = $T3_VAR['t3lib_exec']['apps'][$cmd]['path'].$T3_VAR['t3lib_exec']['apps'][$cmd]['app'].' ';
 
-               return $handler.$cmd;
+               return trim($handler.$cmd);
        }
 
+
        /**
-        * Extend the preset paths. This way an extension can install an axecutable and provide the path to t3lib_exec.
+        * Extend the preset paths. This way an extension can install an executable and provide the path to t3lib_exec.
         *
         * @param       string          comma seperated list of extra paths where a command should be searched. Relative paths (without leading "/") are prepend with site root path (PATH_site).
-        * @return      [type]          ...
+        * @return      void
         */
        function addPaths($paths)       {
                t3lib_exec::_initPaths($paths);
        }
 
+
+
        /**
-        * set the search paths from different sources
+        * Returns an array of search paths
         *
-        * @return      [type]          ...
-        * @internal
+        * @param       boolean         If set the array contains invalid path too. Then the key is the path and the value is empty
+        * @return      array           Array of search paths (empty if exec is disabled)
         */
-       function _getPaths()    {
-               global $TYPO3_CONF_VARS;
-
-               $pathsArr = array();
-               $sysPathArr = array();
-               $osType = t3lib_exec::_getOS();
+       function getPaths($addInvalid=false)    {
+               global $T3_VAR;
 
-                       // image magick paths first
-                       // im_path_lzw take precedence over im_path
-               if ($imPath = ($TYPO3_CONF_VARS['GFX']['im_path_lzw'] ? $TYPO3_CONF_VARS['GFX']['im_path_lzw'] : $TYPO3_CONF_VARS['GFX']['im_path'])) {
-                       $imPath = t3lib_exec::_fixPath($imPath);
-                       $pathsArr[$imPath] = $imPath;
+               if (!t3lib_exec::_init()) {
+                       return array();
                }
 
-                       // add configured paths
-               if ($TYPO3_CONF_VARS['SYS']['binPath']) {
-                       $sysPath = t3lib_div::trimExplode(',',$TYPO3_CONF_VARS['SYS']['binPath'],1);
-                       reset($sysPath);
-                       while(list(,$val)=each($sysPath)) {
-                               $val = t3lib_exec::_fixPath($val);
-                               $sysPathArr[$val]=$val;
-                       }
-               }
-
-
-
+               $paths = $T3_VAR['t3lib_exec']['paths'];
+               if(!$addInvalid) {
 
-# ???? t3lib_div::getIndpEnv('REQUEST_URI');
-
-
-                       // add path from environment
-#TODO: how does this work for WIN
-               if ($GLOBALS['_SERVER']['PATH']) {
-                       $sep = ($osType=='WIN') ? ';' : ':';
-                       $envPath = t3lib_div::trimExplode($sep,$GLOBALS['_SERVER']['PATH'],1);
-                       reset($envPath);
-                       while(list(,$val)=each($envPath)) {
-                               $val = t3lib_exec::_fixPath($val);
-                               $sysPathArr[$val]=$val;
+                       foreach($paths as $path => $validPath) {
+                               if(!$validPath) {
+                                       unset($paths);
+                               }
                        }
                }
-
-               if ($osType=='WIN') {
-#TODO: add the most common paths for WIN
-                       $sysPathArr = array_merge($sysPathArr, array (
-                               '/usr/bin/' => '/usr/bin/',
-                               '/perl/bin/' => '/perl/bin/',
-                       ));
-               } else { // UNIX
-                       $sysPathArr = array_merge($sysPathArr, array (
-                               '/usr/bin/' => '/usr/bin/',
-                               '/usr/local/bin/' => '/usr/local/bin/',
-                       ));
-               }
-
-#debug($pathsArr, '$pathsArr', __LINE__, __FILE__);
-#debug($GLOBALS['_SERVER']['PATH'], 'PATH', __LINE__, __FILE__);
-
-               $pathsArr = array_merge($pathsArr, $sysPathArr);
-               return $pathsArr;
+               return $paths;
        }
 
+
        /**
-        * init
+        * Initialization, internal
         *
-        * @return      [type]          ...
+        * @return      void
         * @internal
         */
        function _init()        {
-               if (!$GLOBALS['t3lib_exec']['init']) {
+               global $T3_VAR, $TYPO3_CONF_VARS;
 
+               if ($TYPO3_CONF_VARS['BE']['disable_exec_function']) {
+                       return false;
+               }
+               if (!$T3_VAR['t3lib_exec']['init']) {
                        t3lib_exec::_initPaths();
-                       $GLOBALS['t3lib_exec']['apps'] = array();
-                       $GLOBALS['t3lib_exec']['init'] = true;
+                       $T3_VAR['t3lib_exec']['apps'] = t3lib_exec::_getConfiguredApps();;
+                       $T3_VAR['t3lib_exec']['init'] = true;
                }
+               return true;
        }
 
+
        /**
-        * init and extend the preset paths with own
+        * Init and extend the preset paths with own
         *
-        * @param       string          comma seperated list of extra paths where a command should be searched. Relative paths (without leading "/") are prepend with site root path (PATH_site).
-        * @return      [type]          ...
+        * @param       string          Comma seperated list of extra paths where a command should be searched. Relative paths (without leading "/") are prepend with site root path (PATH_site).
+        * @return      void
         * @internal
         */
        function _initPaths($paths='')  {
+               global $T3_VAR;
+
                $doCeck=false;
 
                        // init global paths array if not already done
-               if (!is_array($GLOBALS['t3lib_exec']['paths'])) {
-                       $GLOBALS['t3lib_exec']['paths'] = t3lib_exec::_getPaths();
+               if (!is_array($T3_VAR['t3lib_exec']['paths'])) {
+                       $T3_VAR['t3lib_exec']['paths'] = t3lib_exec::_getPaths();
                        $doCeck=true;
                }
                        // merge the submitted paths array to the global
                if ($paths) {
                        $paths = t3lib_div::trimExplode(',',$paths,1);
                        if (is_array($paths)) {
-                               reset($paths);
-                               while(list(,$path)=each($paths)) {
+                               foreach($paths as $path) {
                                                // make absolute path of relative
                                        if (!preg_match('#^/#',$path)) {
                                                $path = PATH_site.$path;
                                        }
-                                       if (!isset($GLOBALS['t3lib_exec']['paths'][$path])) {
+                                       if (!isset($T3_VAR['t3lib_exec']['paths'][$path])) {
                                                if (@is_dir($path)) {
-                                                       $GLOBALS['t3lib_exec']['paths'][$path] = $path;
-                                                       $GLOBALS['t3lib_exec']['allPaths'].=','.$path;
+                                                       $T3_VAR['t3lib_exec']['paths'][$path] = $path;
+                                                       $T3_VAR['t3lib_exec']['allPaths'].=','.$path;
                                                        // $doCeck=true; just done
                                                } else {
-                                                       $GLOBALS['t3lib_exec']['paths'][$path] = false;
+                                                       $T3_VAR['t3lib_exec']['paths'][$path] = false;
                                                }
                                        }
                                }
@@ -314,42 +289,116 @@ class t3lib_exec {
                }
                        // check if new paths are invalid
                if ($doCeck) {
-                       $GLOBALS['t3lib_exec']['allPaths']='';
-                       reset($GLOBALS['t3lib_exec']['paths']);
-                       while(list($path,$valid)=each($GLOBALS['t3lib_exec']['paths'])) {
+                       $T3_VAR['t3lib_exec']['allPaths']='';
+                       foreach($T3_VAR['t3lib_exec']['paths'] as $path => $valid) {
                                        // ignore invalid (false) paths
-#TODO: what's the idea not to remove invalid paths?
-                               if ($valid) {
-                                       if (!@is_dir($path)) {
-                                               $GLOBALS['t3lib_exec']['paths'][$path] = false;
-                                       }
+                               if ($valid AND !@is_dir($path)) {
+                                       $T3_VAR['t3lib_exec']['paths'][$path] = false;
                                }
-                               if ($path = $GLOBALS['t3lib_exec']['paths'][$path]) {
-                                       $GLOBALS['t3lib_exec']['allPaths'].=','.$path;
+                               if ($path = $T3_VAR['t3lib_exec']['paths'][$path]) {
+                                       $T3_VAR['t3lib_exec']['allPaths'].=','.$path;
                                }
                        }
                }
        }
 
+
+       /**
+        * Processes and returns the paths from $TYPO3_CONF_VARS['SYS']['binSetup']
+        *
+        * @return      array           Array of commands and path
+        * @internal
+        */
+       function _getConfiguredApps()   {
+               global $TYPO3_CONF_VARS;
+
+               $cmdArr = array();
+
+               if ($TYPO3_CONF_VARS['SYS']['binSetup']) {
+                       $pathSetup = implode("\n", t3lib_div::trimExplode(',',$TYPO3_CONF_VARS['SYS']['binSetup'],1));
+                       $pathSetup = t3lib_div::trimExplode("\n",$pathSetup,1);
+                       foreach($pathSetup as $val) {
+                               list($cmd, $cmdPath) = t3lib_div::trimExplode('=',$val,1);
+
+                               $cmdArr[$cmd]['app'] = basename($cmdPath);
+                               $cmdArr[$cmd]['path'] = dirname($cmdPath).'/';
+                               $cmdArr[$cmd]['valid'] = true;
+                       }
+               }
+
+               return $cmdArr;
+       }
+
+
        /**
-        * returns on which OS we're runing
+        * Set the search paths from different sources, internal
         *
-        * @return      string          the OS type: "UNIX" or "WIN"
+        * @return      array           Array of absolute paths (keys and values are equal)
         * @internal
         */
-       function _getOS()       {
-               return stristr(PHP_OS,'win')&&!stristr(PHP_OS,'darwin')?'WIN':'UNIX';
+       function _getPaths()    {
+               global $T3_VAR, $TYPO3_CONF_VARS;
+
+               $pathsArr = array();
+               $sysPathArr = array();
+
+                       // image magick paths first
+                       // im_path_lzw take precedence over im_path
+               if ($imPath = ($TYPO3_CONF_VARS['GFX']['im_path_lzw'] ? $TYPO3_CONF_VARS['GFX']['im_path_lzw'] : $TYPO3_CONF_VARS['GFX']['im_path'])) {
+                       $imPath = t3lib_exec::_fixPath($imPath);
+                       $pathsArr[$imPath] = $imPath;
+               }
+
+                       // add configured paths
+               if ($TYPO3_CONF_VARS['SYS']['binPath']) {
+                       $sysPath = t3lib_div::trimExplode(',',$TYPO3_CONF_VARS['SYS']['binPath'],1);
+                       foreach($sysPath as $val) {
+                               $val = t3lib_exec::_fixPath($val);
+                               $sysPathArr[$val]=$val;
+                       }
+               }
+
+
+                       // add path from environment
+// TODO: how does this work for WIN
+               if ($GLOBALS['_SERVER']['PATH']) {
+                       $sep = (TYPO3_OS=='WIN') ? ';' : ':';
+                       $envPath = t3lib_div::trimExplode($sep,$GLOBALS['_SERVER']['PATH'],1);
+                       foreach($envPath as $val) {
+                               $val = t3lib_exec::_fixPath($val);
+                               $sysPathArr[$val]=$val;
+                       }
+               }
+
+               if (TYPO3_OS=='WIN') {
+// TODO: add the most common paths for WIN
+                       $sysPathArr = array_merge($sysPathArr, array (
+                               '/usr/bin/' => '/usr/bin/',
+                               '/perl/bin/' => '/perl/bin/',
+                       ));
+               } else { // UNIX
+                       $sysPathArr = array_merge($sysPathArr, array (
+                               '/usr/bin/' => '/usr/bin/',
+                               '/usr/local/bin/' => '/usr/local/bin/',
+                       ));
+               }
+
+
+               $pathsArr = array_merge($pathsArr, $sysPathArr);
+
+               return $pathsArr;
        }
 
+
        /**
-        * set a path to the right format
+        * Set a path to the right format
         *
-        * @param       string          path
-        * @return      string          path
+        * @param       string          Input path
+        * @return      string          Output path
         * @internal
         */
        function _fixPath($path)        {
-               return str_replace ('//',"/",$path.'/');
+               return str_replace ('//','/',$path.'/');
        }
 }