+++ /dev/null
-<?php
-/////////////////////////////////////////////////
-// tarfile.inc.php
-// by teanan / Interfair Laboratory 2004.
-
-// [¹¹¿·ÍúÎò]
-// 2004-09-21 version 0.0 [»ÃÄêÈÇ]
-// ¡¦¤È¤ê¤¢¤¨¤º wiki ¥Ç¥£¥ì¥¯¥È¥ê¤¬tar.gz¤Ç¼è¤ê½Ð¤»¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£
-// 2004-09-22 version 0.1 [»ÃÄêÈÇ]
-// ¡¦¡Átar.gz/¡Á.tar¤ÎÁªÂò¤ËÂбþ
-// ¡¦attach,backup¥Ç¥£¥ì¥¯¥È¥ê¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¤ËÂбþ
-// ¡¦¥Õ¥¡¥¤¥ë̾¤ò¥Ú¡¼¥¸Ì¾¤ËÊÑ´¹¤¹¤ëµ¡Ç½¤òÄɲÃ(wiki/attach/backup)
-// ¡¦¥Õ¥¡¥¤¥ë°ìÍ÷¤Î¼èÆÀÊýË¡¤òÊѹ¹(glob¢ªopendir)
-// 2004-09-22 version 0.2
-// ¡¦¥Õ¥¡¥¤¥ë¤Î¥¢¥Ã¥×¥í¡¼¥É(¥ê¥¹¥È¥¢)¤ËÂбþ(tar/tar.gz)
-// (ÂÐ¾Ý¤Ï wiki,attach¥Ç¥£¥ì¥¯¥È¥ê¤Î¤ß)
-// 2004-09-22 version 1.0
-// ¡¦LongLink(100¥Ð¥¤¥È¤òĶ¤¨¤¿¥Õ¥¡¥¤¥ë̾)¤ËÂбþ
-// ¡¦¥ê¥¹¥È¥¢»þ¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï¤ò¸µ¤ËÌ᤹¤è¤¦¤Ë½¤Àµ
-
-/////////////////////////////////////////////////
-// ¥Õ¥¡¥¤¥ë̾¤ò¥Ú¡¼¥¸Ì¾¤Ë¤¹¤ëºÝ¤ÎÆüËܸì¤Îʸ»ú¥³¡¼¥É
-define('PLUGIN_TARFILE_FILENAME_ENCORDING','SJIS');
-
-// ºÇÂ祢¥Ã¥×¥í¡¼¥É¥µ¥¤¥º
-define('PLUGIN_TARFILE_MAX_FILESIZE',1024); // Kbyte
-
-/////////////////////////////////////////////////
-// ³ÈÄ¥»Ò
-define('PLUGIN_TARFILE_SFX_TAR' , '.tar');
-define('PLUGIN_TARFILE_SFX_GZIP', '.tar.gz');
-
-// TAR¥Õ¥¡¥¤¥ëÍÑÄêµÁ
-define('TAR_HDR_LEN', 512); // ¥Ø¥Ã¥À¤ÎÂ礤µ
-define('TAR_BLK_LEN', 512); // ñ°Ì¥Ö¥í¥Ã¥¯Ä¹¤µ
-define('TAR_HDR_NAME_OFFSET', 0); // ¥Õ¥¡¥¤¥ë̾¤Î¥ª¥Õ¥»¥Ã¥È
-define('TAR_HDR_NAME_LEN', 100); // ¥Õ¥¡¥¤¥ë̾¤ÎºÇÂ獵
-define('TAR_HDR_MODE_OFFSET', 100); // mode¤Ø¤Î¥ª¥Õ¥»¥Ã¥È
-define('TAR_HDR_UID_OFFSET', 108); // uid¤Ø¤Î¥ª¥Õ¥»¥Ã¥È
-define('TAR_HDR_GID_OFFSET', 116); // gid¤Ø¤Î¥ª¥Õ¥»¥Ã¥È
-define('TAR_HDR_SIZE_OFFSET', 124); // ¥µ¥¤¥º¤Ø¤Î¥ª¥Õ¥»¥Ã¥È
-define('TAR_HDR_SIZE_LEN', 12); // ¥µ¥¤¥º¤ÎŤµ
-define('TAR_HDR_MTIME_OFFSET', 136); // ºÇ½ª¹¹¿·»þ¹ï¤Î¥ª¥Õ¥»¥Ã¥È
-define('TAR_HDR_MTIME_LEN', 12); // ºÇ½ª¹¹¿·»þ¹ï¤ÎŤµ
-define('TAR_HDR_CHKSUM_OFFSET', 148); // ¥Á¥§¥Ã¥¯¥µ¥à¤Î¥ª¥Õ¥»¥Ã¥È
-define('TAR_HDR_CHKSUM_LEN', 8); // ¥Á¥§¥Ã¥¯¥µ¥à¤ÎŤµ
-define('TAR_HDR_TYPE_OFFSET', 156); // ¥Õ¥¡¥¤¥ë¥¿¥¤¥×¤Ø¤Î¥ª¥Õ¥»¥Ã¥È
-
-// ¾õÂÖÄêµÁ
-define('TAR_STATS_INIT', 0); // ½é´ü¾õÂÖ
-define('TAR_STATS_OPEN', 10); // Æɤ߼è¤ê
-define('TAR_STATS_CREATE', 20); // ½ñ¤¹þ¤ß
-
-define('TAR_DATA_MODE', '100666 '); // ¥Õ¥¡¥¤¥ë¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó
-define('TAR_DATA_UGID', '000000 '); // uid / gid
-define('TAR_DATA_CHKBLANKS', ' ');
-
-// GNU³ÈÄ¥»ÅÍÍ(¥í¥ó¥°¥Õ¥¡¥¤¥ë̾Âбþ)
-define('TAR_DATA_LONGLINK', '././@LongLink');
-define('TAR_HDR_FILE', '0');
-define('TAR_HDR_LINK', 'L');
-
-// ¥¢¡¼¥«¥¤¥Ö¤Î¼ïÎà
-define('ARCFILE_GZIP', 0);
-define('ARCFILE_TAR', 1);
-
-// actionÄêµÁ
-define('PLUGIN_TARFILE_CREATE', 'act_download'); // Create & download
-define('PLUGIN_TARFILE_RESTORE', 'act_upload'); // Upload & restore
-
-
-/////////////////////////////////////////////////
-// ¥×¥é¥°¥¤¥óËÜÂÎ
-function plugin_tarfile_action()
-{
- global $adminpass;
- global $vars, $post;
-
- $pass = isset($post['pass']) ? $post['pass'] : NULL;
- $act = isset($post['act']) ? $post['act'] : NULL;
-
- $body = '';
-
-// if (pkwk_login($pass)) // for pukiwiki-1.4.4
- if ($pass !== NULL) {
- if((md5($pass) == $adminpass) && ($act !== NULL) ) {
- switch($act){
- case PLUGIN_TARFILE_CREATE:
- $body = plugin_tarfile_download();
- break;
- case PLUGIN_TARFILE_RESTORE:
- $retcode = plugin_tarfile_upload();
- $body .= $retcode['msg'];
- if($retcode['code'] == true) {
- // Àµ¾ï½ªÎ»
- $msg = '¥¢¥Ã¥×¥í¡¼¥É¤¬´°Î»¤·¤Þ¤·¤¿';
- return array('msg' => $msg, 'body' => $body);
- }
- break;
- }
- } else {
- $body = ($pass === NULL) ? '' : "<p><strong>¥Ñ¥¹¥ï¡¼¥É¤¬°ã¤¤¤Þ¤¹¡£</strong></p>\n";
- }
- }
-
- // ÆþÎÏ¥Õ¥©¡¼¥à¤òɽ¼¨
- $body .= plugin_tarfile_disp_form();
-
- return array('msg' => 'tarfile', 'body' => $body);
-}
-
-/////////////////////////////////////////////////
-// ¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É
-function plugin_tarfile_download()
-{
- global $post;
-
- // ¥¢¡¼¥«¥¤¥Ö¤Î¼ïÎà
- $arc_kind = ($post['pcmd'] == 'tar') ? ARCFILE_TAR : ARCFILE_GZIP;
-
- // ¥Ú¡¼¥¸Ì¾¤ËÊÑ´¹¤¹¤ë
- $namedecode = isset($post['namedecode']) ? true : false;
-
- // ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¥£¥ì¥¯¥È¥ê
- $bk_wiki = isset($post['bk_wiki']) ? true : false;
- $bk_attach = isset($post['bk_attach']) ? true : false;
- $bk_backup = isset($post['bk_backup']) ? true : false;
-
- $tar = new compact_tarlib();
-
- // ¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë
- if($tar->create(CACHE_DIR, $arc_kind))
- {
- $filecount = 0; // ¥Õ¥¡¥¤¥ë¿ô
- if ($bk_wiki) $filecount .= $tar->add(DATA_DIR, '^[0-9A-F]+\.txt', $namedecode);
- if ($bk_attach) $filecount .= $tar->add(UPLOAD_DIR, '^[0-9A-F_]+', $namedecode);
- if ($bk_backup) $filecount .= $tar->add(BACKUP_DIR, '^[0-9A-F]+\.gz', $namedecode);
- $tar->close();
-
- if($filecount > 0) {
- // ¥À¥¦¥ó¥í¡¼¥É
- download_tarfile($tar->filename, $arc_kind);
- @unlink($tar->filename);
- exit; // Àµ¾ï½ªÎ»
- } else {
- @unlink($tar->filename);
- return '<p><strong>¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</strong></p>';
- }
- }
- else
- {
- die_message('¥Æ¥ó¥Ý¥é¥ê¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£');
- }
-}
-
-/////////////////////////////////////////////////
-// ¥Õ¥¡¥¤¥ë¤Î¥¢¥Ã¥×¥í¡¼¥É
-function plugin_tarfile_upload()
-{
- global $post;
-
- $code = false;
- $msg = '';
-
- // ¥¢¡¼¥«¥¤¥Ö¤Î¼ïÎà
- $arc_kind = ($post['pcmd'] == 'tar') ? ARCFILE_TAR : ARCFILE_GZIP;
-
- $filename = $_FILES['upload_file']['name'];
-
-
- // ¥¢¥Ã¥×¥í¡¼¥É¥Õ¥¡¥¤¥ë
- $uploadfile = tempnam(CACHE_DIR, 'upload' );
- if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $uploadfile))
- {
- // tar¥Õ¥¡¥¤¥ë¤òŸ³«¤¹¤ë
- $tar = new compact_tarlib();
- if($tar->open($uploadfile, $arc_kind))
- {
- // DATA_DIR (wiki/*.txt)
- $quote_wiki = preg_quote(DATA_DIR, '/');
- $quote_wiki .= '((?:[0-9A-F])+)(\.txt){0,1}';
-
- // UPLOAD_DIR (attach/*)
- $quote_attach = preg_quote(UPLOAD_DIR,'/');
- $quote_attach .= '((?:[0-9A-F]{2})+)_((?:[0-9A-F])+)';
-
- $pattern = "((^$quote_wiki)|(^$quote_attach))";
-
- $files = $tar->extract($pattern);
- if(! empty($files)) {
- $msg = '<p><strong>Ÿ³«¤·¤¿¥Õ¥¡¥¤¥ë°ìÍ÷</strong><ul>';
- foreach($files as $name) {
- $msg .= "<li>$name</li>\n";
- }
- $msg .= '</ul></p>';
- $code = true;
- } else {
- $msg = '<p>Ÿ³«¤Ç¤¤ë¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</p>';
- $code = false;
- }
- $tar->close();
- }
- else
- {
- $msg = '<p>¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</p>';
- $code = false;
- }
- // ½èÍý¤¬½ªÎ»¤·¤¿¤é¥¢¥Ã¥×¥í¡¼¥É¤·¤¿¥Õ¥¡¥¤¥ë¤Ïºï½ü¤¹¤ë
- @unlink($uploadfile);
- }
- else
- {
- die_message('¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£');
- }
-
- return array('code' => $code , 'msg' => $msg);
-}
-
-/////////////////////////////////////////////////
-// tar¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É
-function download_tarfile($name, $arc_kind)
-{
- // ¥Õ¥¡¥¤¥ë̾
- $filename = strftime("tar%Y%m%d", time()) . $file_ext;
-
- if($arc_kind == ARCFILE_GZIP) {
- $filename .= PLUGIN_TARFILE_SFX_GZIP;
- } else {
- $filename .= PLUGIN_TARFILE_SFX_TAR;
- }
-
- $size = filesize($name);
-
- header('Content-Disposition: attachment; filename="' . $filename . '"');
- header('Content-Length: ' . $size);
- header('Content-Type: application/octet-stream');
- header('Pragma: no-cache');
- @readfile($name);
-}
-
-/////////////////////////////////////////////////
-// ÆþÎÏ¥Õ¥©¡¼¥à¤òɽ¼¨
-function plugin_tarfile_disp_form()
-{
- global $script, $defaultpage;
-
- $act_down = PLUGIN_TARFILE_CREATE;
- $act_up = PLUGIN_TARFILE_RESTORE;
- $maxsize = PLUGIN_TARFILE_MAX_FILESIZE * 1024;
- $maxsizekb = PLUGIN_TARFILE_MAX_FILESIZE;
-
- $data = <<<EOD
-<span class="small">
-TAR¥Õ¥¡¥¤¥ë¥Ð¥Ã¥¯¥¢¥Ã¥× / ¥ê¥¹¥È¥¢¥×¥é¥°¥¤¥ó
-</span>
-<br /><br />
-<h3>Tar¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É</h3>
-<form action="$script" method="post">
- <div>
- <input type="hidden" name="cmd" value="tarfile" />
- <input type="hidden" name="page" value="$defaultpage" />
- <input type="hidden" name="act" value="$act_down" />
-
-<p><strong>¥¢¡¼¥«¥¤¥Ö¤Î·Á¼°</strong>
-<br />
- <input type="radio" name="pcmd" value="tgz" checked="checked" /> ¡Á.tar.gz ·Á¼°<br />
- <input type="radio" name="pcmd" value="tar" /> ¡Á.tar ·Á¼°
-</p>
-<p><strong>¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¥£¥ì¥¯¥È¥ê</strong>
-<br />
- <input type="checkbox" name="bk_wiki" checked="checked" /> wiki<br />
- <input type="checkbox" name="bk_attach" /> attach<br />
- <input type="checkbox" name="bk_backup" /> backup
-</p>
-<p><strong>¥ª¥×¥·¥ç¥ó</strong>
-<br />
- <input type="checkbox" name="namedecode" /> ¥Õ¥¡¥¤¥ë̾¤ò¥Ú¡¼¥¸Ì¾¤ËÊÑ´¹ (¢¨¥ê¥¹¥È¥¢¤Ë»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¯¤Ê¤ê¤Þ¤¹)<br />
-</p>
-<p><strong>´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É</strong>
- <input type="password" name="pass" size="12" />
- <input type="submit" name="ok" value="OK" />
-</p>
- </div>
-</form>
-
-<h3>¥Ç¡¼¥¿¤Î¥ê¥¹¥È¥¢</h3>
-<form enctype="multipart/form-data" action="$script" method="post">
- <div>
- <input type="hidden" name="cmd" value="tarfile" />
- <input type="hidden" name="page" value="$defaultpage" />
- <input type="hidden" name="act" value="$act_up" />
- <input type="hidden" name="max_file_size" value="$maxsize" />
-<p><strong>[½ÅÍ×] Ʊ¤¸Ì¾Á°¤Î¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤Ï¾å½ñ¤¤µ¤ì¤Þ¤¹¤Î¤Ç¡¢½½Ê¬¤´Ãí°Õ¤¯¤À¤µ¤¤¡£</strong></p>
-<p><span class="small">
-¥¢¥Ã¥×¥í¡¼¥É²Äǽ¤ÊºÇÂç¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤Ï¡¢$maxsizekb KByte ¤Þ¤Ç¤Ç¤¹¡£<br />
-</span>
- ¥Õ¥¡¥¤¥ë: <input type="file" name="upload_file" size="40" />
-</p>
-<p><strong>¥¢¡¼¥«¥¤¥Ö¤Î·Á¼°</strong>
-<br />
- <input type="radio" name="pcmd" value="tgz" checked="checked" /> ¡Á.tar.gz ·Á¼°<br />
- <input type="radio" name="pcmd" value="tar" /> ¡Á.tar ·Á¼°
-</p>
-<p><strong>´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É</strong>
- <input type="password" name="pass" size="12" />
- <input type="submit" name="ok" value="OK" />
-</p>
- </div>
-</form>
-EOD;
-
- return $data;
-}
-
-/////////////////////////////////////////////////
-// tar¥Ç¡¼¥¿¤ÎºîÀ®/Ÿ³«¥é¥¤¥Ö¥é¥ê
-
-class compact_tarlib
-{
- var $filename;
- var $fp;
- var $status;
- var $dummydata;
- var $arc_kind;
-
- // ¥³¥ó¥¹¥È¥é¥¯¥¿
- function compact_tarlib( $name = '' ) {
- $this->fp = false;
- $this->filename = $name;
- $this->status = TAR_STATS_INIT;
- $arc_kind = ARCFILE_GZIP;
- }
-
- ////////////////////////////////////////////////////////////
- //
- // ´Ø¿ô : tar¥Õ¥¡¥¤¥ë¤ò³«¤¯
- // °ú¿ô : tar¥Õ¥¡¥¤¥ë̾
- // ÊÖ¤êÃÍ: ture .. À®¸ù , false .. ¼ºÇÔ
- //
- ////////////////////////////////////////////////////////////
- function open( $name = '', $kind = ARCFILE_GZIP )
- {
- if( $name != '' ) $this->filename = $name;
-
- if($kind == ARCFILE_GZIP) {
- $this->arc_kind = ARCFILE_GZIP;
- $this->fp = gzopen( $this->filename, 'rb');
- } else {
- $this->arc_kind = ARCFILE_TAR;
- $this->fp = fopen( $this->filename, 'rb');
- }
-
- if( $this->fp == false ) return false; // »ØÄê¥Õ¥¡¥¤¥ë¤Ê¤·
-
- $this->status = TAR_STATS_OPEN;
- rewind($this->fp);
-
- return true;
- }
-
- ////////////////////////////////////////////////////////////
- //
- // ´Ø¿ô : tar¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë
- // °ú¿ô : tar¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¥Ñ¥¹
- // ÊÖ¤êÃÍ: ture .. À®¸ù , false .. ¼ºÇÔ
- //
- ////////////////////////////////////////////////////////////
- function create( $odir, $kind = ARCFILE_GZIP )
- {
- $tname = tempnam( $odir, 'tar' );
-
- if($kind == ARCFILE_GZIP) {
- $this->arc_kind = ARCFILE_GZIP;
- $this->fp = gzopen($tname, 'wb');
- } else {
- $this->arc_kind = ARCFILE_TAR;
- $this->fp = @fopen($tname, 'wb');
- }
- if( $this->fp==false ) return false; // ºîÀ®¼ºÇÔ
-
- // ºîÀ®¤ËÀ®¸ù¤·¤¿¤é¥Õ¥¡¥¤¥ë̾¤òµ²±¤·¤Æ¤ª¤¯
- $this->filename = $tname;
- $this->status = TAR_STATS_CREATE;
-
- // ¥À¥ß¡¼¥Ç¡¼¥¿
- $this->dummydata = join('', array_fill(0, TAR_BLK_LEN, "\0"));
- rewind($this->fp);
-
- return true;
- }
-
- ////////////////////////////////////////////////////////////
- //
- // ´Ø¿ô : tar¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
- // °ú¿ô : ¤Ê¤·
- // ÊÖ¤êÃÍ: ¤Ê¤·
- //
- ////////////////////////////////////////////////////////////
- function close()
- {
- if($this->status = TAR_STATS_CREATE)
- {
- // ¥Ð¥¤¥Ê¥ê¡¼¥¼¥í¤ò1024¥Ð¥¤¥È½ÐÎÏ
- flock($this->fp, LOCK_EX);
- fwrite($this->fp, $this->dummydata, TAR_HDR_LEN);
- fwrite($this->fp, $this->dummydata, TAR_HDR_LEN);
- flock($this->fp, LOCK_UN);
-
- // ¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
- if($this->arc_kind == ARCFILE_GZIP) {
- gzclose($this->fp);
- } else {
- fclose($this->fp);
- }
- }
- else if($this->status = TAR_STATS_OPEN)
- {
- if($this->arc_kind == ARCFILE_GZIP) {
- gzclose($this->fp);
- } else {
- fclose($this->fp);
- }
- }
-
- $this->status = TAR_STATS_INIT;
- }
-
- ////////////////////////////////////////////////////////////
- //
- // ´Ø¿ô : »ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ëtar¥Õ¥¡¥¤¥ë¤òŸ³«¤¹¤ë
- // °ú¿ô : Ÿ³«¤¹¤ë¥Õ¥¡¥¤¥ë¥Ñ¥¿¡¼¥ó(Àµµ¬É½¸½)
- // ÊÖ¤êÃÍ: Ÿ³«¤·¤¿¥Õ¥¡¥¤¥ë̾¤Î°ìÍ÷
- // Êä : ARAI¤µ¤ó¤Îattach¥×¥é¥°¥¤¥ó¥Ñ¥Ã¥Á¤ò»²¹Í¤Ë¤·¤Þ¤·¤¿
- //
- ////////////////////////////////////////////////////////////
- function extract( $pattern )
- {
- if($this->status != TAR_STATS_OPEN)
- return ''; // open¤µ¤ì¤Æ¤¤¤Ê¤¤
-
- $files = array();
- $longname = '';
-
- while(1) {
- $buff = fread($this->fp,TAR_HDR_LEN);
- if(strlen($buff) != TAR_HDR_LEN ) break;
-
- // ¥Õ¥¡¥¤¥ë̾
- if($longname != '') {
- $name = $longname; // LongLinkÂбþ
- $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};
- } else {
- break;
- }
- }
- }
-
- $name = trim($name);
- if($name == '') break; // Ÿ³«½ªÎ»
-
- // ¥Á¥§¥Ã¥¯¥µ¥à¤ò¼èÆÀ¤·¤Ä¤Ä¡¢¥Ö¥é¥ó¥¯¤ËÃÖ´¹¤·¤Æ¤¤¤¯
- $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};
- }
- list($checksum) = sscanf('0' . trim($checksum), "%i");
-
- // ¥Á¥§¥Ã¥¯¥µ¥à¤Î·×»»
- $sum = 0;
- for($i = 0; $i < TAR_BLK_LEN; $i++ ) {
- $sum += 0xff & ord($buff{$i});
- }
-
- if($sum != $checksum) break; // ¥Á¥§¥Ã¥¯¥µ¥à¥¨¥é¡¼
-
- // ¥µ¥¤¥º
- $size = '';
- for ($i = 0; $i < TAR_HDR_SIZE_LEN; $i++ ) {
- $size .= $buff{$i + TAR_HDR_SIZE_OFFSET};
- }
-
- list($size) = sscanf('0' . trim($size), "%i");
-
- // ceil
- // ¥Ç¡¼¥¿¥Ö¥í¥Ã¥¯¤Ï512byte¤Ç¥Ñ¥Ç¥£¥ó¥°¤µ¤ì¤Æ¤¤¤ë
- $pdsz = ceil($size / TAR_BLK_LEN) * TAR_BLK_LEN;
-
- // ºÇ½ª¹¹¿·»þ¹ï
- $strmtime = '';
- for ($i = 0; $i < TAR_HDR_MTIME_LEN; $i++ ) {
- $strmtime .= $buff{$i + TAR_HDR_MTIME_OFFSET};
- }
- list($mtime) = sscanf('0' . trim($strmtime), "%i");
-
- // ¥¿¥¤¥×¥Õ¥é¥°
- $type = $buff{TAR_HDR_TYPE_OFFSET};
-
- if($name == TAR_DATA_LONGLINK)
- {
- // LongLink
- $buff = fread( $this->fp, $pdsz );
- $longname = substr($buff, 0, $size);
- }
- else if (preg_match("/$pattern/", $name) )
-// if ($type == 0 && preg_match("/$pattern/", $name) )
- {
- $buff = fread($this->fp, $pdsz);
-
- // ´û¤ËƱ¤¸¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¾ì¹ç¤Ï¾å½ñ¤¤µ¤ì¤ë
- if($fpw = @fopen($name, 'wb')) {
- fwrite($fpw, $buff, $size);
- fclose($fpw);
- chmod($name, 0666); // Ç°¤Î¤¿¤á¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó¤òÀßÄꤷ¤Æ¤ª¤¯
- touch($name, $mtime); // ºÇ½ª¹¹¿·»þ¹ï¤Î½¤Àµ
- $files[] = $name;
- }
- }
- else
- {
- // ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë
- @fseek($this->fp, $pdsz, SEEK_CUR);
- }
- }
- return $files;
- }
-
- ////////////////////////////////////////////////////////////
- //
- // ´Ø¿ô : tar¥Õ¥¡¥¤¥ë¤ËÄɲ乤ë
- // °ú¿ô : $dir .. ¥Ç¥£¥ì¥¯¥È¥ê̾
- // $mask .. Äɲ乤ë¥Õ¥¡¥¤¥ë(Àµµ¬É½¸½)
- // $decode .. ¥Ú¡¼¥¸Ì¾¤ÎÊÑ´¹¤ò¤¹¤ë¤«
- // ÊÖ¤êÃÍ: ºîÀ®¤·¤¿¥Õ¥¡¥¤¥ë¿ô
- //
- ////////////////////////////////////////////////////////////
- function add($dir, $mask, $decode = false)
- {
- $retvalue = 0;
-
- if ($this->status != TAR_STATS_CREATE)
- return ''; // ¥Õ¥¡¥¤¥ë¤¬ºîÀ®¤µ¤ì¤Æ¤¤¤Ê¤¤
-
- unset($files);
-
- // »ØÄꤵ¤ì¤¿¥Ñ¥¹¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò¼èÆÀ¤¹¤ë
- $dp = @opendir($dir) or
- die_message($dir . ' is not found or not readable.');
- while ($filename = readdir($dp)) {
- if(preg_match("/$mask/", $filename)) {
- $files[] = $dir . $filename;
- }
- }
- closedir($dp);
-
- sort($files);
-
- foreach($files as $name)
- {
- // Tar¤Ë³ÊǼ¤¹¤ë¥Õ¥¡¥¤¥ë̾
- if($decode == true )
- {
- // ¥Õ¥¡¥¤¥ë̾¤ò¥Ú¡¼¥¸Ì¾¤ËÊÑ´¹¤¹¤ë½èÍý
- $dirname = dirname(trim($name)) . '/';
- $filename = basename(trim($name));
- if(preg_match("/^((?:[0-9A-F]{2})+)_((?:[0-9A-F]{2})+)/", $filename, $matches))
- {
- // attach¥Õ¥¡¥¤¥ë̾
- $filename = decode($matches[1]).'/'.decode($matches[2]);
- }
- else
- {
- $pattern = '^((?:[0-9A-F]{2})+)((\.txt|\.gz)*)$';
- if (preg_match("/$pattern/", $filename, $matches)) {
- $filename = decode($matches[1]).$matches[2];
- // ´í¤Ê¤¤¥³¡¼¥É¤ÏÃÖ´¹¤·¤Æ¤ª¤¯
- $filename = str_replace(':','_',$filename);
- $filename = str_replace('\\','_',$filename);
- }
- }
- $filename = $dirname . $filename;
- if(function_exists('mb_convert_encoding')) {
- // ¥Õ¥¡¥¤¥ë̾¤Îʸ»ú¥³¡¼¥É¤òÊÑ´¹
- $filename = mb_convert_encoding($filename, PLUGIN_TARFILE_FILENAME_ENCORDING);
- }
- }
- else
- {
- $filename = $name;
- }
-
- // ºÇ½ª¹¹¿·»þ¹ï
- $mtime = filemtime( $name );
-
- // ¥Õ¥¡¥¤¥ë̾Ĺ¤Î¥Á¥§¥Ã¥¯
- if(strlen($filename) > TAR_HDR_NAME_LEN) {
- // LongLinkÂбþ
- $size = strlen($filename);
- // LonkLink¥Ø¥Ã¥ÀÀ¸À®
- $tar_data = $this->make_header(TAR_DATA_LONGLINK, $size, $mtime, TAR_HDR_LINK);
- // ¥Õ¥¡¥¤¥ë½ÐÎÏ
- $this->write_data(join('', $tar_data), $filename, $size);
- }
-
- // ¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤ò¼èÆÀ
- $size = filesize( $name );
- if ($size == FALSE) {
- die_message($name . ' is not found or not readable.');
- continue; // ¥Õ¥¡¥¤¥ë¤¬¤Ê¤¤
- }
-
- // ¥Ø¥Ã¥ÀÀ¸À®
- $tar_data = $this->make_header($filename, $size, $mtime, TAR_HDR_FILE);
-
- // ¥Õ¥¡¥¤¥ë¥Ç¡¼¥¿¤Î¼èÆÀ
- $fpr = @fopen($name , 'rb');
- $data = fread($fpr, $size);
- fclose( $fpr );
-
- // ¥Õ¥¡¥¤¥ë½ÐÎÏ
- $this->write_data(join('', $tar_data), $data, $size);
- ++$retvalue;
- }
- return $retvalue;
- }
-
- ////////////////////////////////////////////////////////////
- //
- // ´Ø¿ô : tar¤Î¥Ø¥Ã¥À¾ðÊó¤òÀ¸À®¤¹¤ë
- // °ú¿ô : $filename .. ¥Õ¥¡¥¤¥ë̾
- // $size .. ¥Ç¡¼¥¿¥µ¥¤¥º
- // $mtime .. ºÇ½ª¹¹¿·Æü
- // $typeflag .. TypeFlag (file/link)
- // Ìá¤êÃÍ: tar¥Ø¥Ã¥À¾ðÊó
- //
- ////////////////////////////////////////////////////////////
- function make_header($filename, $size, $mtime, $typeflag)
- {
- $tar_data = array_fill(0, TAR_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};
- } else {
- break; // ¥Õ¥¡¥¤¥ë̾¤¬Ä¹¤¹¤®
- }
- }
-
- // mode
- $modeid = TAR_DATA_MODE;
- for($i = 0; $i < strlen($modeid); $i++ ) {
- $tar_data[$i + TAR_HDR_MODE_OFFSET] = $modeid{$i};
- }
-
- // uid / gid
- $ugid = TAR_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};
- }
-
- // ¥µ¥¤¥º
- $strsize = sprintf('%11o', $size);
- for($i = 0; $i < strlen($strsize); $i++ ) {
- $tar_data[$i + TAR_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};
- }
-
- // ¥Á¥§¥Ã¥¯¥µ¥à·×»»ÍѤΥ֥é¥ó¥¯¤òÀßÄê
- $chkblanks = TAR_DATA_CHKBLANKS;
- for($i = 0; $i < strlen($chkblanks); $i++ ) {
- $tar_data[$i + TAR_HDR_CHKSUM_OFFSET] = $chkblanks{$i};
- }
-
- // ¥¿¥¤¥×¥Õ¥é¥°
- $tar_data[TAR_HDR_TYPE_OFFSET] = $typeflag;
-
- // ¥Á¥§¥Ã¥¯¥µ¥à¤Î·×»»
- $sum = 0;
- for($i = 0; $i < TAR_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};
- }
- return $tar_data;
- }
-
- ////////////////////////////////////////////////////////////
- //
- // ´Ø¿ô : tar¥Ç¡¼¥¿¤Î¥Õ¥¡¥¤¥ë½ÐÎÏ
- // °ú¿ô : $header .. tar¥Ø¥Ã¥À¾ðÊó
- // $body .. tar¥Ç¡¼¥¿
- // $size .. ¥Ç¡¼¥¿¥µ¥¤¥º
- // Ìá¤êÃÍ: ¤Ê¤·
- //
- ////////////////////////////////////////////////////////////
- function write_data($header, $body, $size)
- {
- // ¥Õ¥£¥ë¤¹¤ë¥µ¥¤¥º¤ò·×»»¤·¤Æ¤ª¤¯
- $fixsize = ceil($size / TAR_BLK_LEN) * TAR_BLK_LEN;
- $fixsize -= $size;
-
- flock($this->fp, LOCK_EX);
- fwrite($this->fp, $header, TAR_HDR_LEN); // ¥Ø¥Ã¥À½ÐÎÏ
- fwrite($this->fp, $body, $size); // ¥Ç¡¼¥¿½ÐÎÏ
-
- // ¥µ¥¤¥ºÄ´À°(¤¢¤Þ¤Ã¤¿Éôʬ¤ò0¤Ç¥Õ¥£¥ë)
- fwrite($this->fp, $this->dummydata, $fixsize); // Padding
-
- flock($this->fp, LOCK_UN);
- }
-}
-?>