From 2005b6b650f2523cb58a005961a55a6f099c70c3 Mon Sep 17 00:00:00 2001
From: Andreas Gohr <andi@splitbrain.org>
Date: Sat, 3 Nov 2012 11:45:40 +0100
Subject: [PATCH] TarLib code cleanup

---
 inc/TarLib.class.php | 369 +++++++++++++++++++++++++++----------------
 1 file changed, 236 insertions(+), 133 deletions(-)

diff --git a/inc/TarLib.class.php b/inc/TarLib.class.php
index 36ae224ed..e04c47cb8 100644
--- a/inc/TarLib.class.php
+++ b/inc/TarLib.class.php
@@ -13,7 +13,6 @@
  * @author  Christopher Smith <chris@jalakai.co.uk>
  */
 
-
 /**
  * Those constants represent the compression method to use.
  * COMPRESS_GZIP is used for the GZIP compression; COMPRESS_BZIP for
@@ -68,15 +67,15 @@ class TarLib {
     var $_result;
     var $_initerror;
 
-    const   COMPRESS_GZIP = 1;
-    const   COMPRESS_BZIP = 2;
-    const   COMPRESS_AUTO = 3;
-    const   COMPRESS_NONE = 0;
-    const   TARLIB_VERSION = '1.2';
-    const   FULL_ARCHIVE = -1;
-    const   ARCHIVE_DYNAMIC = 0;
+    const   COMPRESS_GZIP      = 1;
+    const   COMPRESS_BZIP      = 2;
+    const   COMPRESS_AUTO      = 3;
+    const   COMPRESS_NONE      = 0;
+    const   TARLIB_VERSION     = '1.2';
+    const   FULL_ARCHIVE       = -1;
+    const   ARCHIVE_DYNAMIC    = 0;
     const   ARCHIVE_RENAMECOMP = 5;
-    const   COMPRESS_DETECT = -1;
+    const   COMPRESS_DETECT    = -1;
 
     /**
      * constructor, initialize the class
@@ -108,21 +107,21 @@ class TarLib {
      * represent the GZIP or BZIP compression level.  1 produce fast compression,
      * and 9 produce smaller files. See the RFC 1952 for more infos.
      */
-    function __construct($p_filen = TarLib::ARCHIVE_DYNAMIC , $p_comptype = TarLib::COMPRESS_AUTO, $p_complevel = 9) {
+    function __construct($p_filen = TarLib::ARCHIVE_DYNAMIC, $p_comptype = TarLib::COMPRESS_AUTO, $p_complevel = 9) {
         $this->_initerror = 0;
-        $this->_nomf = $p_filen;
-        $flag=0;
-        if($p_comptype && $p_comptype % 5 == 0){
+        $this->_nomf      = $p_filen;
+        $flag             = 0;
+        if($p_comptype && $p_comptype % 5 == 0) {
             $p_comptype /= TarLib::ARCHIVE_RENAMECOMP;
-            $flag=1;
+            $flag = 1;
         }
 
         if($p_complevel > 0 && $p_complevel <= 9) $this->_compzlevel = $p_complevel;
-        else $p_complevel = 9;
+        else $this->_compzlevel = 9;
 
         if($p_comptype == TarLib::COMPRESS_DETECT) {
-            if(strtolower(substr($p_filen,-3)) == '.gz') $p_comptype = TarLib::COMPRESS_GZIP;
-            elseif(strtolower(substr($p_filen,-4)) == '.bz2') $p_comptype = TarLib::COMPRESS_BZIP;
+            if(strtolower(substr($p_filen, -3)) == '.gz') $p_comptype = TarLib::COMPRESS_GZIP;
+            elseif(strtolower(substr($p_filen, -4)) == '.bz2') $p_comptype = TarLib::COMPRESS_BZIP;
             else $p_comptype = TarLib::COMPRESS_NONE;
         }
 
@@ -152,7 +151,7 @@ class TarLib {
 
         if($this->_initerror < 0) $this->_comptype = TarLib::COMPRESS_NONE;
 
-        if($flag) $this->_nomf.= '.'.$this->getCompression(1);
+        if($flag) $this->_nomf .= '.'.$this->getCompression(1);
         $this->_result = true;
     }
 
@@ -162,7 +161,7 @@ class TarLib {
      * This function does exactly the same as TarLib (constructor), except it
      * returns a status code.
      */
-    function setArchive($p_name='', $p_comp = TarLib::COMPRESS_AUTO, $p_level=9) {
+    function setArchive($p_name = '', $p_comp = TarLib::COMPRESS_AUTO, $p_level = 9) {
         $this->_CompTar();
         $this->__construct($p_name, $p_comp, $p_level);
         return $this->_result;
@@ -186,7 +185,7 @@ class TarLib {
      * MaxgTar Constants
      */
     function getCompression($ext = false) {
-        $exts = Array('tar','tar.gz','tar.bz2');
+        $exts = Array('tar', 'tar.gz', 'tar.bz2');
         if($ext) return $exts[$this->_comptype];
         return $this->_comptype;
     }
@@ -263,8 +262,10 @@ class TarLib {
         if(!$archive && !$this->_memdat) return -10;
         if(!$name) $name = utf8_basename($this->_nomf);
 
-        if($archive){ if(!file_exists($archive)) return -11; }
-        else $decoded = $this->getDynamicArchive();
+        if($archive) {
+            if(!file_exists($archive)) return -11;
+        }
+        $decoded = $this->getDynamicArchive();
 
         if($headers) {
             header('Content-Type: application/x-gtar');
@@ -274,10 +275,10 @@ class TarLib {
         }
 
         if($archive) {
-            $fp = @fopen($archive,'rb');
+            $fp = @fopen($archive, 'rb');
             if(!$fp) return -4;
 
-            while(!feof($fp)) echo fread($fp,2048);
+            while(!feof($fp)) echo fread($fp, 2048);
         } else {
             echo $decoded;
         }
@@ -311,10 +312,10 @@ class TarLib {
      * permission in octal mode (prefixed with a 0) that will be given on each
      * extracted file.
      */
-    function Extract($p_what = TarLib::FULL_ARCHIVE, $p_to = '.', $p_remdir='', $p_mode = 0755) {
+    function Extract($p_what = TarLib::FULL_ARCHIVE, $p_to = '.', $p_remdir = '', $p_mode = 0755) {
         if(!$this->_OpenRead()) return -4;
         //  if(!@is_dir($p_to)) if(!@mkdir($p_to, 0777)) return -8;   --CS
-        if(!@is_dir($p_to)) if(!$this->_dirApp($p_to)) return -8;   //--CS (route through correct dir fn)
+        if(!@is_dir($p_to)) if(!$this->_dirApp($p_to)) return -8; //--CS (route through correct dir fn)
 
         $ok = $this->_extractList($p_to, $p_what, $p_remdir, $p_mode);
         $this->_CompTar();
@@ -356,15 +357,15 @@ class TarLib {
      * to the file you store. Note also that the RemovePath is applied before the
      * AddPath is added, so it HAS a sense to use both parameters together.
      */
-    function Create($p_filelist,$p_add='',$p_rem='') {
+    function Create($p_filelist, $p_add = '', $p_rem = '') {
         if(!$fl = $this->_fetchFilelist($p_filelist)) return -5;
         if(!$this->_OpenWrite()) return -6;
 
-        $ok = $this->_addFileList($fl,$p_add,$p_rem);
+        $ok = $this->_addFileList($fl, $p_add, $p_rem);
 
-        if($ok){
+        if($ok) {
             $this->_writeFooter();
-        }else{
+        } else {
             $this->_CompTar();
             @unlink($this->_nomf);
         }
@@ -386,13 +387,15 @@ class TarLib {
      */
     function Add($p_filelist, $p_add = '', $p_rem = '') {
         if($this->_nomf !== TarLib::ARCHIVE_DYNAMIC &&
-           $this->_comptype !== TarLib::COMPRESS_NONE) {
+            $this->_comptype !== TarLib::COMPRESS_NONE
+        ) {
             return -12;
         }
 
-        if (($this->_nomf !== TarLib::ARCHIVE_DYNAMIC && !$this->_fp) ||
-            ($this->_nomf === TarLib::ARCHIVE_DYNAMIC && !$this->_memdat)){
-             return $this->Create($p_filelist, $p_add, $p_rem);
+        if(($this->_nomf !== TarLib::ARCHIVE_DYNAMIC && !$this->_fp) ||
+            ($this->_nomf === TarLib::ARCHIVE_DYNAMIC && !$this->_memdat)
+        ) {
+            return $this->Create($p_filelist, $p_add, $p_rem);
         }
 
         if(!$fl = $this->_fetchFilelist($p_filelist)) return -5;
@@ -424,15 +427,15 @@ class TarLib {
 
         $result = Array();
 
-        while ($dat = $this->_read(512)) {
+        while($dat = $this->_read(512)) {
             $dat = $this->_readHeader($dat);
             if(!is_array($dat)) continue;
 
-            $this->_seek(ceil($dat['size']/512)*512,1);
+            $this->_seek(ceil($dat['size'] / 512) * 512, 1);
             $result[] = $dat;
         }
 
-        return  $result;
+        return $result;
     }
 
     /**
@@ -444,36 +447,48 @@ class TarLib {
      */
     function TarErrorStr($i) {
         $ecodes = Array(
-                1 => true,
-                0 => "Undocumented error",
-                -1 => "Can't use COMPRESS_GZIP compression : ZLIB extensions are not loaded !",
-                -2 => "Can't use COMPRESS_BZIP compression : BZ2 extensions are not loaded !",
-                -3 => "You must set a archive file to read the contents !",
-                -4 => "Can't open the archive file for read !",
-                -5 => "Invalide file list !",
-                -6 => "Can't open the archive in write mode !",
-                -7 => "There is no ARCHIVE_DYNAMIC to write !",
-                -8 => "Can't create the directory to extract files !",
-                -9 => "Please pass a archive name to send if you made created an ARCHIVE_DYNAMIC !",
-                -10 => "You didn't pass an archive filename and there is no stored ARCHIVE_DYNAMIC !",
-                -11 => "Given archive doesn't exist !",
-                -12 => "Appending not supported for compressed files"
-                );
+            1   => true,
+            0   => "Undocumented error",
+            -1  => "Can't use COMPRESS_GZIP compression : ZLIB extensions are not loaded !",
+            -2  => "Can't use COMPRESS_BZIP compression : BZ2 extensions are not loaded !",
+            -3  => "You must set a archive file to read the contents !",
+            -4  => "Can't open the archive file for read !",
+            -5  => "Invalide file list !",
+            -6  => "Can't open the archive in write mode !",
+            -7  => "There is no ARCHIVE_DYNAMIC to write !",
+            -8  => "Can't create the directory to extract files !",
+            -9  => "Please pass a archive name to send if you made created an ARCHIVE_DYNAMIC !",
+            -10 => "You didn't pass an archive filename and there is no stored ARCHIVE_DYNAMIC !",
+            -11 => "Given archive doesn't exist !",
+            -12 => "Appending not supported for compressed files"
+        );
 
         return isset($ecodes[$i]) ? $ecodes[$i] : $ecodes[0];
     }
 
-    function _seek($p_flen, $tell=0) {
+    /**
+     * Seek in the data stream
+     *
+     * @todo  probably broken for bzip tars
+     * @param int  $p_flen seek to this position
+     * @param bool $tell  seek from current position?
+     */
+    function _seek($p_flen, $tell = false) {
         if($this->_nomf === TarLib::ARCHIVE_DYNAMIC)
-            $this->_memdat=substr($this->_memdat,0,($tell ? strlen($this->_memdat) : 0) + $p_flen);
+            $this->_memdat = substr($this->_memdat, 0, ($tell ? strlen($this->_memdat) : 0) + $p_flen);
         elseif($this->_comptype == TarLib::COMPRESS_GZIP)
-            @gzseek($this->_fp, ($tell ? @gztell($this->_fp) : 0)+$p_flen);
+            @gzseek($this->_fp, ($tell ? @gztell($this->_fp) : 0) + $p_flen);
         elseif($this->_comptype == TarLib::COMPRESS_BZIP)
-            @fseek($this->_fp, ($tell ? @ftell($this->_fp) : 0)+$p_flen);
+            @fseek($this->_fp, ($tell ? @ftell($this->_fp) : 0) + $p_flen);
         else
-            @fseek($this->_fp, ($tell ? @ftell($this->_fp) : 0)+$p_flen);
+            @fseek($this->_fp, ($tell ? @ftell($this->_fp) : 0) + $p_flen);
     }
 
+    /**
+     * Open the archive for reading
+     *
+     * @return bool true if succesfull
+     */
     function _OpenRead() {
         if($this->_comptype == TarLib::COMPRESS_GZIP)
             $this->_fp = @gzopen($this->_nomf, 'rb');
@@ -485,6 +500,12 @@ class TarLib {
         return ($this->_fp ? true : false);
     }
 
+    /**
+     * Open the archive for writing
+     *
+     * @param string $add filemode
+     * @return bool true on success
+     */
     function _OpenWrite($add = 'w') {
         if($this->_nomf === TarLib::ARCHIVE_DYNAMIC) return true;
 
@@ -498,6 +519,9 @@ class TarLib {
         return ($this->_fp ? true : false);
     }
 
+    /**
+     * Closes the open file pointer
+     */
     function _CompTar() {
         if($this->_nomf === TarLib::ARCHIVE_DYNAMIC || !$this->_fp) return;
 
@@ -506,27 +530,46 @@ class TarLib {
         else @fclose($this->_fp);
     }
 
+    /**
+     * Read from the open file pointer
+     *
+     * @param int $p_len bytes to read
+     * @return string
+     */
     function _read($p_len) {
         if($this->_comptype == TarLib::COMPRESS_GZIP)
-            return @gzread($this->_fp,$p_len);
+            return @gzread($this->_fp, $p_len);
         elseif($this->_comptype == TarLib::COMPRESS_BZIP)
-            return @bzread($this->_fp,$p_len);
+            return @bzread($this->_fp, $p_len);
         else
-            return @fread($this->_fp,$p_len);
+            return @fread($this->_fp, $p_len);
     }
 
+    /**
+     * Write to the open filepointer or memory
+     *
+     * @param string $p_data
+     * @return int
+     */
     function _write($p_data) {
-        if($this->_nomf === TarLib::ARCHIVE_DYNAMIC) $this->_memdat .= $p_data;
-        elseif($this->_comptype == TarLib::COMPRESS_GZIP)
-            return @gzwrite($this->_fp,$p_data);
-
-        elseif($this->_comptype == TarLib::COMPRESS_BZIP)
-            return @bzwrite($this->_fp,$p_data);
-
-        else
-            return @fwrite($this->_fp,$p_data);
+        if($this->_nomf === TarLib::ARCHIVE_DYNAMIC) {
+            $this->_memdat .= $p_data;
+            return strlen($p_data);
+        } elseif($this->_comptype == TarLib::COMPRESS_GZIP) {
+            return @gzwrite($this->_fp, $p_data);
+        } elseif($this->_comptype == TarLib::COMPRESS_BZIP) {
+            return @bzwrite($this->_fp, $p_data);
+        } else {
+            return @fwrite($this->_fp, $p_data);
+        }
     }
 
+    /**
+     * Compress given data according to the set compression method
+     *
+     * @param $p_dat
+     * @return string
+     */
     function _encode($p_dat) {
         if($this->_comptype == TarLib::COMPRESS_GZIP)
             return gzencode($p_dat, $this->_compzlevel);
@@ -535,31 +578,37 @@ class TarLib {
         else return $p_dat;
     }
 
+    /**
+     * Decode the given tar file header
+     *
+     * @param $p_dat
+     * @return array|bool
+     */
     function _readHeader($p_dat) {
-        if (!$p_dat || strlen($p_dat) != 512) return false;
+        if(!$p_dat || strlen($p_dat) != 512) return false;
 
-        for ($i=0, $chks=0; $i<148; $i++)
+        for($i = 0, $chks = 0; $i < 148; $i++)
             $chks += ord($p_dat[$i]);
 
-        for ($i=156,$chks+=256; $i<512; $i++)
+        for($i = 156, $chks += 256; $i < 512; $i++)
             $chks += ord($p_dat[$i]);
 
         $headers = @unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $p_dat);
         if(!$headers) return false;
 
         $return['checksum'] = OctDec(trim($headers['checksum']));
-        if ($return['checksum'] != $chks) return false;
+        if($return['checksum'] != $chks) return false;
 
         $return['filename'] = trim($headers['filename']);
-        $return['mode'] = OctDec(trim($headers['mode']));
-        $return['uid'] = OctDec(trim($headers['uid']));
-        $return['gid'] = OctDec(trim($headers['gid']));
-        $return['size'] = OctDec(trim($headers['size']));
-        $return['mtime'] = OctDec(trim($headers['mtime']));
+        $return['mode']     = OctDec(trim($headers['mode']));
+        $return['uid']      = OctDec(trim($headers['uid']));
+        $return['gid']      = OctDec(trim($headers['gid']));
+        $return['size']     = OctDec(trim($headers['size']));
+        $return['mtime']    = OctDec(trim($headers['mtime']));
         $return['typeflag'] = $headers['typeflag'];
-        $return['link'] = trim($headers['link']);
-        $return['uname'] = trim($headers['uname']);
-        $return['gname'] = trim($headers['gname']);
+        $return['link']     = trim($headers['link']);
+        $return['uname']    = trim($headers['uname']);
+        $return['gname']    = trim($headers['gname']);
 
         return $return;
     }
@@ -576,22 +625,30 @@ class TarLib {
         if(!$p_filelist || (is_array($p_filelist) && !@count($p_filelist))) return false;
 
         if(is_string($p_filelist)) {
-            $p_filelist = explode('|',$p_filelist);
+            $p_filelist = explode('|', $p_filelist);
             if(!is_array($p_filelist)) $p_filelist = Array($p_filelist);
         }
 
         return $p_filelist;
     }
 
+    /**
+     * Adds files given as file list
+     *
+     * @param array  $p_fl
+     * @param string $p_addir
+     * @param string $p_remdir
+     * @return bool
+     */
     function _addFileList($p_fl, $p_addir, $p_remdir) {
         foreach($p_fl as $file) {
             if(($file == $this->_nomf && $this->_nomf !== TarLib::ARCHIVE_DYNAMIC) || !$file || (!is_array($file) && !file_exists($file)))
                 continue;
 
-            if (!$this->_addFile($file, $p_addir, $p_remdir))
+            if(!$this->_addFile($file, $p_addir, $p_remdir))
                 continue;
 
-            if (@is_dir($file)) {
+            if(@is_dir($file)) {
                 $d = @opendir($file);
 
                 if(!$d) continue;
@@ -606,26 +663,36 @@ class TarLib {
                 }
 
                 closedir($d);
-                unset($tmplist,$f);
+                unset($tmplist, $f);
             }
         }
         return true;
     }
 
+    /**
+     * Adds a single file
+     *
+     * @param array|string $p_fn
+     * @param string       $p_addir
+     * @param string       $p_remdir
+     * @return bool
+     */
     function _addFile($p_fn, $p_addir = '', $p_remdir = '') {
+        $data = false;
         if(is_array($p_fn)) list($p_fn, $data) = $p_fn;
         $sname = $p_fn;
 
         if($p_remdir) {
-            if(substr($p_remdir,-1) != '/') $p_remdir .= "/";
+            if(substr($p_remdir, -1) != '/') $p_remdir .= "/";
 
             if(substr($sname, 0, strlen($p_remdir)) == $p_remdir)
                 $sname = substr($sname, strlen($p_remdir));
         }
 
-        if($p_addir) $sname = $p_addir.(substr($p_addir,-1) == '/' ? '' : "/").$sname;
+        if($p_addir) $sname = $p_addir.(substr($p_addir, -1) == '/' ? '' : "/").$sname;
 
-        if(strlen($sname) > 99) return;
+        // FIXME ustar should support up 256 chars
+        if(strlen($sname) > 99) return false;
 
         if(@is_dir($p_fn)) {
             if(!$this->_writeFileHeader($p_fn, $sname)) return false;
@@ -639,14 +706,14 @@ class TarLib {
 
             if(!$data) {
                 while(!feof($fp)) {
-                    $packed = pack("a512", fread($fp,512));
+                    $packed = pack("a512", fread($fp, 512));
                     $this->_write($packed);
                 }
                 fclose($fp);
             } else {
                 $len = strlen($data);
-                for($s = 0; $s < $len; $s += 512){
-                    $this->_write(pack("a512",substr($data,$s,512)));
+                for($s = 0; $s < $len; $s += 512) {
+                    $this->_write(pack("a512", substr($data, $s, 512)));
                 }
             }
         }
@@ -654,54 +721,70 @@ class TarLib {
         return true;
     }
 
-    function _writeFileHeader($p_file, $p_sname, $p_data=false) {
+    /**
+     * Write the header for a file in the TAR archive
+     *
+     * @param string $p_file
+     * @param string $p_sname
+     * @param bool   $p_data
+     * @return bool
+     */
+    function _writeFileHeader($p_file, $p_sname, $p_data = false) {
         if(!$p_data) {
-            if (!$p_sname) $p_sname = $p_file;
+            if(!$p_sname) $p_sname = $p_file;
             $p_sname = $this->_pathTrans($p_sname);
 
             $h_info = stat($p_file);
-            $h[0] = sprintf("%6s ", DecOct($h_info[4]));
-            $h[] = sprintf("%6s ", DecOct($h_info[5]));
-            $h[] = sprintf("%6s ", DecOct(fileperms($p_file)));
+            $h[0]   = sprintf("%6s ", DecOct($h_info[4]));
+            $h[]    = sprintf("%6s ", DecOct($h_info[5]));
+            $h[]    = sprintf("%6s ", DecOct(fileperms($p_file)));
             clearstatcache();
             $h[] = sprintf("%11s ", DecOct(filesize($p_file)));
             $h[] = sprintf("%11s", DecOct(filemtime($p_file)));
 
             $dir = @is_dir($p_file) ? '5' : '';
         } else {
-            $dir = '';
+            $dir    = '';
             $p_data = sprintf("%11s ", DecOct($p_data));
-            $time = sprintf("%11s ", DecOct(time()));
-            $h = Array("     0 ","     0 "," 40777 ",$p_data,$time);
+            $time   = sprintf("%11s ", DecOct(time()));
+            $h      = Array("     0 ", "     0 ", " 40777 ", $p_data, $time);
         }
 
         $data_first = pack("a100a8a8a8a12A12", $p_sname, $h[2], $h[0], $h[1], $h[3], $h[4]);
-        $data_last = pack("a1a100a6a2a32a32a8a8a155a12", $dir, '', '', '', '', '', '', '', '', "");
+        $data_last  = pack("a1a100a6a2a32a32a8a8a155a12", $dir, '', '', '', '', '', '', '', '', "");
 
-        for ($i=0,$chks=0; $i<148; $i++)
+        for($i = 0, $chks = 0; $i < 148; $i++)
             $chks += ord($data_first[$i]);
 
-        for ($i=156, $chks+=256, $j=0; $i<512; $i++, $j++)
+        for($i = 156, $chks += 256, $j = 0; $i < 512; $i++, $j++)
             $chks += ord($data_last[$j]);
 
         $this->_write($data_first);
 
-        $chks = pack("a8",sprintf("%6s ", DecOct($chks)));
+        $chks = pack("a8", sprintf("%6s ", DecOct($chks)));
         $this->_write($chks.$data_last);
 
         return true;
     }
 
-    function _append($p_filelist, $p_addir="", $p_remdir="") {
+    /**
+     * Append the given files to the already open archive
+     *
+     * @param array  $p_filelist
+     * @param string $p_addir
+     * @param string $p_remdir
+     * @return bool|int
+     */
+    function _append($p_filelist, $p_addir = "", $p_remdir = "") {
         if(!$this->_fp) if(!$this->_OpenWrite('a')) return -6;
 
         if($this->_nomf === TarLib::ARCHIVE_DYNAMIC) {
-            $this->_memdat = substr($this->_memdat,0,-512*2); // remove footer
+            $this->_memdat = substr($this->_memdat, 0, -512 * 2); // remove footer
         } else {
             clearstatcache();
             $s = filesize($this->_nomf);
 
-            $this->_seek($s - (512*2)); // remove footer
+            $this->_seek($s - (512 * 2)); // remove footer
         }
 
         $ok = $this->_addFileList($p_filelist, $p_addir, $p_remdir);
@@ -710,20 +793,26 @@ class TarLib {
         return $ok;
     }
 
+    /**
+     * Cleans up a path and removes relative parts
+     *
+     * @param string $p_dir
+     * @return string
+     */
     function _pathTrans($p_dir) {
-        if ($p_dir) {
+        $r = '';
+        if($p_dir) {
             $subf = explode("/", $p_dir);
-            $r='';
 
-            for ($i=count($subf)-1; $i>=0; $i--) {
-                if ($subf[$i] == ".") {
+            for($i = count($subf) - 1; $i >= 0; $i--) {
+                if($subf[$i] == ".") {
                     # do nothing
-                } elseif ($subf[$i] == "..") {
+                } elseif($subf[$i] == "..") {
                     $i--;
-                } elseif (!$subf[$i] && $i!=count($subf)-1 && $i) {
+                } elseif(!$subf[$i] && $i != count($subf) - 1 && $i) {
                     # do nothing
                 } else {
-                    $r = $subf[$i].($i!=(count($subf)-1) ? "/".$r : "");
+                    $r = $subf[$i].($i != (count($subf) - 1) ? "/".$r : "");
                 }
             }
         }
@@ -735,6 +824,7 @@ class TarLib {
      *
      * Physically, an archive consists of a series of file entries terminated by an end-of-archive entry, which
      * consists of two 512 blocks of zero bytes
+     *
      * @link http://www.gnu.org/software/tar/manual/html_chapter/tar_8.html#SEC134
      */
     function _writeFooter() {
@@ -742,24 +832,31 @@ class TarLib {
         $this->_write(pack("a512", ""));
     }
 
+    /**
+     * @param     $p_to
+     * @param     $p_files
+     * @param     $p_remdir
+     * @param int $p_mode
+     * @return array|bool|int|string
+     */
     function _extractList($p_to, $p_files, $p_remdir, $p_mode = 0755) {
-        if (!$p_to || ($p_to[0]!="/"&&substr($p_to,0,3)!="../"&&substr($p_to,1,3)!=":\\"&&substr($p_to,1,2)!=":/")) /*" // <- PHP Coder bug */
+        if(!$p_to || ($p_to[0] != "/" && substr($p_to, 0, 3) != "../" && substr($p_to, 1, 3) != ":\\" && substr($p_to, 1, 2) != ":/")) /*" // <- PHP Coder bug */
             $p_to = "./$p_to";
 
-        if ($p_remdir && substr($p_remdir,-1)!='/') $p_remdir .= '/';
+        if($p_remdir && substr($p_remdir, -1) != '/') $p_remdir .= '/';
         $p_remdirs = strlen($p_remdir);
         while($dat = $this->_read(512)) {
             $headers = $this->_readHeader($dat);
             if(!$headers['filename']) continue;
 
-            if($p_files == -1 || $p_files[0] == -1){
+            if($p_files == -1 || $p_files[0] == -1) {
                 $extract = true;
             } else {
                 $extract = false;
 
                 foreach($p_files as $f) {
-                    if(substr($f,-1) == "/") {
-                        if((strlen($headers['filename']) > strlen($f)) && (substr($headers['filename'],0,strlen($f))==$f)) {
+                    if(substr($f, -1) == "/") {
+                        if((strlen($headers['filename']) > strlen($f)) && (substr($headers['filename'], 0, strlen($f)) == $f)) {
                             $extract = true;
                             break;
                         }
@@ -770,15 +867,15 @@ class TarLib {
                 }
             }
 
-            if ($extract) {
+            if($extract) {
                 $det[] = $headers;
-                if ($p_remdir && substr($headers['filename'],0,$p_remdirs)==$p_remdir)
-                    $headers['filename'] = substr($headers['filename'],$p_remdirs);
+                if($p_remdir && substr($headers['filename'], 0, $p_remdirs) == $p_remdir)
+                    $headers['filename'] = substr($headers['filename'], $p_remdirs);
 
-                if($headers['filename'].'/' == $p_remdir && $headers['typeflag']=='5') continue;
+                if($headers['filename'].'/' == $p_remdir && $headers['typeflag'] == '5') continue;
 
-                if ($p_to != "./" && $p_to != "/") {
-                    while($p_to{-1}=="/") $p_to = substr($p_to,0,-1);
+                if($p_to != "./" && $p_to != "/") {
+                    while($p_to{-1} == "/") $p_to = substr($p_to, 0, -1);
 
                     if($headers['filename']{0} == "/")
                         $headers['filename'] = $p_to.$headers['filename'];
@@ -786,29 +883,35 @@ class TarLib {
                         $headers['filename'] = $p_to."/".$headers['filename'];
                 }
 
-                $ok = $this->_dirApp($headers['typeflag']=="5" ? $headers['filename'] : dirname($headers['filename']));
+                $ok = $this->_dirApp($headers['typeflag'] == "5" ? $headers['filename'] : dirname($headers['filename']));
                 if($ok < 0) return $ok;
 
-                if (!$headers['typeflag']) {
-                    if (!$fp = @fopen($headers['filename'], "wb")) return -6;
-                    $n = floor($headers['size']/512);
+                if(!$headers['typeflag']) {
+                    if(!$fp = @fopen($headers['filename'], "wb")) return -6;
+                    $n = floor($headers['size'] / 512);
 
-                    for ($i=0; $i<$n; $i++){
-                        fwrite($fp, $this->_read(512),512);
+                    for($i = 0; $i < $n; $i++) {
+                        fwrite($fp, $this->_read(512), 512);
                     }
-                    if (($headers['size'] % 512) != 0) fwrite($fp, $this->_read(512), $headers['size'] % 512);
+                    if(($headers['size'] % 512) != 0) fwrite($fp, $this->_read(512), $headers['size'] % 512);
 
                     fclose($fp);
                     touch($headers['filename'], $headers['mtime']);
                     chmod($headers['filename'], $p_mode);
                 } else {
-                    $this->_seek(ceil($headers['size']/512)*512,1);
+                    $this->_seek(ceil($headers['size'] / 512) * 512, 1);
                 }
-            }else $this->_seek(ceil($headers['size']/512)*512,1);
+            } else $this->_seek(ceil($headers['size'] / 512) * 512, 1);
         }
         return $det;
     }
 
+    /**
+     * Create a directory hierarchy in filesystem
+     *
+     * @param string $d
+     * @return bool
+     */
     function _dirApp($d) {
         //  map to dokuwiki function (its more robust)
         return io_mkdir_p($d);
-- 
GitLab