From 7ea589b1873ca9315221e97f0f355099a58a53bf Mon Sep 17 00:00:00 2001 From: henoheno Date: Sat, 25 Sep 2004 21:34:39 +0900 Subject: [PATCH] Cleanup. tarlib: library for tar file creation and expansion --- plugin/dump.inc.php | 163 ++++++++++++++++++++++++++-------------------------- 1 file changed, 81 insertions(+), 82 deletions(-) diff --git a/plugin/dump.inc.php b/plugin/dump.inc.php index c3141ad..294dcb7 100644 --- a/plugin/dump.inc.php +++ b/plugin/dump.inc.php @@ -1,6 +1,6 @@ create(CACHE_DIR, $arc_kind)) @@ -177,7 +147,7 @@ function plugin_dump_upload() if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $uploadfile)) { // tar¥Õ¥¡¥¤¥ë¤òŸ³«¤¹¤ë - $tar = new compact_tarlib(); + $tar = new tarlib(); if ($tar->open($uploadfile, $arc_kind)) { // DATA_DIR (wiki/*.txt) @@ -317,9 +287,38 @@ EOD; } ///////////////////////////////////////////////// -// tar¥Ç¡¼¥¿¤ÎºîÀ®/Ÿ³«¥é¥¤¥Ö¥é¥ê +// tarlib: library for tar file creation and expansion + +// Tar related definition +define('TARLIB_HDR_LEN', 512); // ¥Ø¥Ã¥À¤ÎÂ礭¤µ +define('TARLIB_BLK_LEN', 512); // ñ°Ì¥Ö¥í¥Ã¥¯Ä¹¤µ +define('TARLIB_HDR_NAME_OFFSET', 0); // ¥Õ¥¡¥¤¥ë̾¤Î¥ª¥Õ¥»¥Ã¥È +define('TARLIB_HDR_NAME_LEN', 100); // ¥Õ¥¡¥¤¥ë̾¤ÎºÇÂ獵 +define('TARLIB_HDR_MODE_OFFSET', 100); // mode¤Ø¤Î¥ª¥Õ¥»¥Ã¥È +define('TARLIB_HDR_UID_OFFSET', 108); // uid¤Ø¤Î¥ª¥Õ¥»¥Ã¥È +define('TARLIB_HDR_GID_OFFSET', 116); // gid¤Ø¤Î¥ª¥Õ¥»¥Ã¥È +define('TARLIB_HDR_SIZE_OFFSET', 124); // ¥µ¥¤¥º¤Ø¤Î¥ª¥Õ¥»¥Ã¥È +define('TARLIB_HDR_SIZE_LEN', 12); // ¥µ¥¤¥º¤ÎŤµ +define('TARLIB_HDR_MTIME_OFFSET', 136); // ºÇ½ª¹¹¿·»þ¹ï¤Î¥ª¥Õ¥»¥Ã¥È +define('TARLIB_HDR_MTIME_LEN', 12); // ºÇ½ª¹¹¿·»þ¹ï¤ÎŤµ +define('TARLIB_HDR_CHKSUM_OFFSET', 148); // ¥Á¥§¥Ã¥¯¥µ¥à¤Î¥ª¥Õ¥»¥Ã¥È +define('TARLIB_HDR_CHKSUM_LEN', 8); // ¥Á¥§¥Ã¥¯¥µ¥à¤ÎŤµ +define('TARLIB_HDR_TYPE_OFFSET', 156); // ¥Õ¥¡¥¤¥ë¥¿¥¤¥×¤Ø¤Î¥ª¥Õ¥»¥Ã¥È + +// Status +define('TARLIB_STATUS_INIT', 0); // ½é´ü¾õÂÖ +define('TARLIB_STATUS_OPEN', 10); // Æɤ߼è¤ê +define('TARLIB_STATUS_CREATE', 20); // ½ñ¤­¹þ¤ß + +define('TARLIB_DATA_MODE', '100666 '); // ¥Õ¥¡¥¤¥ë¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó +define('TARLIB_DATA_UGID', '000000 '); // uid / gid + +// GNU³ÈÄ¥»ÅÍÍ(¥í¥ó¥°¥Õ¥¡¥¤¥ë̾Âбþ) +define('TARLIB_DATA_LONGLINK', '././@LongLink'); +define('TARLIB_HDR_FILE', '0'); +define('TARLIB_HDR_LINK', 'L'); -class compact_tarlib +class tarlib { var $filename; var $fp; @@ -328,10 +327,10 @@ class compact_tarlib var $dummydata; // ¥³¥ó¥¹¥È¥é¥¯¥¿ - function compact_tarlib( $name = '' ) { + function tarlib( $name = '' ) { $this->filename = $name; $this->fp = FALSE; - $this->status = TAR_STATS_INIT; + $this->status = TARLIB_STATUS_INIT; $arc_kind = ARCFILE_GZIP; } @@ -357,7 +356,7 @@ class compact_tarlib if ($this->fp === FALSE) { return FALSE; // No such file } else { - $this->status = TAR_STATS_OPEN; + $this->status = TARLIB_STATUS_OPEN; rewind($this->fp); return TRUE; } @@ -385,10 +384,10 @@ class compact_tarlib // ºîÀ®¤ËÀ®¸ù¤·¤¿¤é¥Õ¥¡¥¤¥ë̾¤òµ­²±¤·¤Æ¤ª¤¯ $this->filename = $tname; - $this->status = TAR_STATS_CREATE; + $this->status = TARLIB_STATUS_CREATE; // ¥À¥ß¡¼¥Ç¡¼¥¿ - $this->dummydata = join('', array_fill(0, TAR_BLK_LEN, "\0")); + $this->dummydata = join('', array_fill(0, TARLIB_BLK_LEN, "\0")); rewind($this->fp); return TRUE; @@ -403,12 +402,12 @@ class compact_tarlib //////////////////////////////////////////////////////////// function close() { - if ($this->status = TAR_STATS_CREATE) + if ($this->status = TARLIB_STATUS_CREATE) { // ¥Ð¥¤¥Ê¥ê¡¼¥¼¥í¤ò1024¥Ð¥¤¥È½ÐÎÏ flock($this->fp, LOCK_EX); - fwrite($this->fp, $this->dummydata, TAR_HDR_LEN); - fwrite($this->fp, $this->dummydata, TAR_HDR_LEN); + fwrite($this->fp, $this->dummydata, TARLIB_HDR_LEN); + fwrite($this->fp, $this->dummydata, TARLIB_HDR_LEN); flock($this->fp, LOCK_UN); // ¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë @@ -418,7 +417,7 @@ class compact_tarlib fclose($this->fp); } } - else if ($this->status = TAR_STATS_OPEN) + else if ($this->status = TARLIB_STATUS_OPEN) { if ($this->arc_kind == ARCFILE_GZIP) { gzclose($this->fp); @@ -427,7 +426,7 @@ class compact_tarlib } } - $this->status = TAR_STATS_INIT; + $this->status = TARLIB_STATUS_INIT; } //////////////////////////////////////////////////////////// @@ -440,14 +439,14 @@ class compact_tarlib //////////////////////////////////////////////////////////// function extract($pattern ) { - if ($this->status != TAR_STATS_OPEN) return ''; // Not opened + if ($this->status != TARLIB_STATUS_OPEN) return ''; // Not opened $files = array(); $longname = ''; while(1) { - $buff = fread($this->fp, TAR_HDR_LEN); - if (strlen($buff) != TAR_HDR_LEN) break; + $buff = fread($this->fp, TARLIB_HDR_LEN); + if (strlen($buff) != TARLIB_HDR_LEN) break; // ¥Õ¥¡¥¤¥ë̾ if ($longname != '') { @@ -455,9 +454,9 @@ class compact_tarlib $longname = ''; } else { $name = ''; - for ($i = 0; $i < TAR_HDR_NAME_LEN; $i++ ) { - if ($buff{$i + TAR_HDR_NAME_OFFSET} != "\0") { - $name .= $buff{$i + TAR_HDR_NAME_OFFSET}; + for ($i = 0; $i < TARLIB_HDR_NAME_LEN; $i++ ) { + if ($buff{$i + TARLIB_HDR_NAME_OFFSET} != "\0") { + $name .= $buff{$i + TARLIB_HDR_NAME_OFFSET}; } else { break; } @@ -470,41 +469,41 @@ class compact_tarlib // ¥Á¥§¥Ã¥¯¥µ¥à¤ò¼èÆÀ¤·¤Ä¤Ä¡¢¥Ö¥é¥ó¥¯¤ËÃÖ´¹¤·¤Æ¤¤¤¯ $checksum = ''; $chkblanks = TAR_DATA_CHKBLANKS; - for ($i = 0; $i < TAR_HDR_CHKSUM_LEN; $i++ ) { - $checksum .= $buff{$i + TAR_HDR_CHKSUM_OFFSET}; - $buff{$i + TAR_HDR_CHKSUM_OFFSET} = $chkblanks{$i}; + for ($i = 0; $i < TARLIB_HDR_CHKSUM_LEN; $i++ ) { + $checksum .= $buff{$i + TARLIB_HDR_CHKSUM_OFFSET}; + $buff{$i + TARLIB_HDR_CHKSUM_OFFSET} = $chkblanks{$i}; } list($checksum) = sscanf('0' . trim($checksum), '%i'); // Compute checksum $sum = 0; - for($i = 0; $i < TAR_BLK_LEN; $i++ ) { + for($i = 0; $i < TARLIB_BLK_LEN; $i++ ) { $sum += 0xff & ord($buff{$i}); } if ($sum != $checksum) break; // Error // Size $size = ''; - for ($i = 0; $i < TAR_HDR_SIZE_LEN; $i++ ) { - $size .= $buff{$i + TAR_HDR_SIZE_OFFSET}; + for ($i = 0; $i < TARLIB_HDR_SIZE_LEN; $i++ ) { + $size .= $buff{$i + TARLIB_HDR_SIZE_OFFSET}; } list($size) = sscanf('0' . trim($size), '%i'); // ceil // ¥Ç¡¼¥¿¥Ö¥í¥Ã¥¯¤Ï512byte¤Ç¥Ñ¥Ç¥£¥ó¥°¤µ¤ì¤Æ¤¤¤ë - $pdsz = ceil($size / TAR_BLK_LEN) * TAR_BLK_LEN; + $pdsz = ceil($size / TARLIB_BLK_LEN) * TARLIB_BLK_LEN; // ºÇ½ª¹¹¿·»þ¹ï $strmtime = ''; - for ($i = 0; $i < TAR_HDR_MTIME_LEN; $i++ ) { - $strmtime .= $buff{$i + TAR_HDR_MTIME_OFFSET}; + for ($i = 0; $i < TARLIB_HDR_MTIME_LEN; $i++ ) { + $strmtime .= $buff{$i + TARLIB_HDR_MTIME_OFFSET}; } list($mtime) = sscanf('0' . trim($strmtime), '%i'); // ¥¿¥¤¥×¥Õ¥é¥° - $type = $buff{TAR_HDR_TYPE_OFFSET}; + $type = $buff{TARLIB_HDR_TYPE_OFFSET}; - if ($name == TAR_DATA_LONGLINK) + if ($name == TARLIB_DATA_LONGLINK) { // LongLink $buff = fread( $this->fp, $pdsz ); @@ -546,7 +545,7 @@ class compact_tarlib { $retvalue = 0; - if ($this->status != TAR_STATS_CREATE) + if ($this->status != TARLIB_STATUS_CREATE) return ''; // ¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Æ¤¤¤Ê¤¤ unset($files); @@ -601,11 +600,11 @@ class compact_tarlib $mtime = filemtime($name); // ¥Õ¥¡¥¤¥ë̾Ĺ¤Î¥Á¥§¥Ã¥¯ - if (strlen($filename) > TAR_HDR_NAME_LEN) { + if (strlen($filename) > TARLIB_HDR_NAME_LEN) { // LongLinkÂбþ $size = strlen($filename); // LonkLink¥Ø¥Ã¥ÀÀ¸À® - $tar_data = $this->make_header(TAR_DATA_LONGLINK, $size, $mtime, TAR_HDR_LINK); + $tar_data = $this->make_header(TARLIB_DATA_LONGLINK, $size, $mtime, TARLIB_HDR_LINK); // ¥Õ¥¡¥¤¥ë½ÐÎÏ $this->write_data(join('', $tar_data), $filename, $size); } @@ -618,7 +617,7 @@ class compact_tarlib } // ¥Ø¥Ã¥ÀÀ¸À® - $tar_data = $this->make_header($filename, $size, $mtime, TAR_HDR_FILE); + $tar_data = $this->make_header($filename, $size, $mtime, TARLIB_HDR_FILE); // ¥Õ¥¡¥¤¥ë¥Ç¡¼¥¿¤Î¼èÆÀ $fpr = @fopen($name , 'rb'); @@ -644,60 +643,60 @@ class compact_tarlib //////////////////////////////////////////////////////////// function make_header($filename, $size, $mtime, $typeflag) { - $tar_data = array_fill(0, TAR_HDR_LEN, "\0"); + $tar_data = array_fill(0, TARLIB_HDR_LEN, "\0"); // ¥Õ¥¡¥¤¥ë̾¤òÊݸ for($i = 0; $i < strlen($filename); $i++ ) { - if ($i < TAR_HDR_NAME_LEN) { - $tar_data[$i + TAR_HDR_NAME_OFFSET] = $filename{$i}; + if ($i < TARLIB_HDR_NAME_LEN) { + $tar_data[$i + TARLIB_HDR_NAME_OFFSET] = $filename{$i}; } else { break; // ¥Õ¥¡¥¤¥ë̾¤¬Ä¹¤¹¤® } } // mode - $modeid = TAR_DATA_MODE; + $modeid = TARLIB_DATA_MODE; for($i = 0; $i < strlen($modeid); $i++ ) { - $tar_data[$i + TAR_HDR_MODE_OFFSET] = $modeid{$i}; + $tar_data[$i + TARLIB_HDR_MODE_OFFSET] = $modeid{$i}; } // uid / gid - $ugid = TAR_DATA_UGID; + $ugid = TARLIB_DATA_UGID; for($i = 0; $i < strlen($ugid); $i++ ) { - $tar_data[$i + TAR_HDR_UID_OFFSET] = $ugid{$i}; - $tar_data[$i + TAR_HDR_GID_OFFSET] = $ugid{$i}; + $tar_data[$i + TARLIB_HDR_UID_OFFSET] = $ugid{$i}; + $tar_data[$i + TARLIB_HDR_GID_OFFSET] = $ugid{$i}; } // ¥µ¥¤¥º $strsize = sprintf('%11o', $size); for($i = 0; $i < strlen($strsize); $i++ ) { - $tar_data[$i + TAR_HDR_SIZE_OFFSET] = $strsize{$i}; + $tar_data[$i + TARLIB_HDR_SIZE_OFFSET] = $strsize{$i}; } // ºÇ½ª¹¹¿·»þ¹ï $strmtime = sprintf('%o', $mtime); for($i = 0; $i < strlen($strmtime); $i++ ) { - $tar_data[$i + TAR_HDR_MTIME_OFFSET] = $strmtime{$i}; + $tar_data[$i + TARLIB_HDR_MTIME_OFFSET] = $strmtime{$i}; } // ¥Á¥§¥Ã¥¯¥µ¥à·×»»ÍѤΥ֥é¥ó¥¯¤òÀßÄê $chkblanks = TAR_DATA_CHKBLANKS; for($i = 0; $i < strlen($chkblanks); $i++ ) { - $tar_data[$i + TAR_HDR_CHKSUM_OFFSET] = $chkblanks{$i}; + $tar_data[$i + TARLIB_HDR_CHKSUM_OFFSET] = $chkblanks{$i}; } // ¥¿¥¤¥×¥Õ¥é¥° - $tar_data[TAR_HDR_TYPE_OFFSET] = $typeflag; + $tar_data[TARLIB_HDR_TYPE_OFFSET] = $typeflag; // ¥Á¥§¥Ã¥¯¥µ¥à¤Î·×»» $sum = 0; - for($i = 0; $i < TAR_BLK_LEN; $i++ ) { + for($i = 0; $i < TARLIB_BLK_LEN; $i++ ) { $sum += 0xff & ord($tar_data[$i]); } $strchksum = sprintf('%7o',$sum); for($i = 0; $i < strlen($strchksum); $i++ ) { - $tar_data[$i + TAR_HDR_CHKSUM_OFFSET] = $strchksum{$i}; + $tar_data[$i + TARLIB_HDR_CHKSUM_OFFSET] = $strchksum{$i}; } return $tar_data; } @@ -713,10 +712,10 @@ class compact_tarlib //////////////////////////////////////////////////////////// function write_data($header, $body, $size) { - $fixsize = ceil($size / TAR_BLK_LEN) * TAR_BLK_LEN - $size; + $fixsize = ceil($size / TARLIB_BLK_LEN) * TARLIB_BLK_LEN - $size; flock($this->fp, LOCK_EX); - fwrite($this->fp, $header, TAR_HDR_LEN); // Header + fwrite($this->fp, $header, TARLIB_HDR_LEN); // Header fwrite($this->fp, $body, $size); // Body fwrite($this->fp, $this->dummydata, $fixsize); // Padding flock($this->fp, LOCK_UN); -- 2.11.0