<?php
-/////////////////////////////////////////////////
-// $Id: dump.inc.php,v 1.33 2004/12/25 00:36:21 henoheno Exp $
+// $Id: dump.inc.php,v 1.41 2007/11/03 15:17:52 henoheno Exp $
+// Copyright (C)
+// 2004-2007 PukiWiki Developers Team
+// 2004 teanan / Interfair Laboratory
+// License: GPL v2 or (at your option) any later version
+//
+// Remote dump / restore plugin
// Originated as 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¥Ð¥¤¥È¤òĶ¤¨¤¿¥Õ¥¡¥¤¥ë̾)¤ËÂбþ
-// ¡¦¥ê¥¹¥È¥¢»þ¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï¤ò¸µ¤ËÌ᤹¤è¤¦¤Ë½¤Àµ
-
/////////////////////////////////////////////////
// User defines
// Allow using resture function
define('PLUGIN_DUMP_ALLOW_RESTORE', FALSE); // FALSE, TRUE
-// ¥Ú¡¼¥¸Ì¾¤ò¥Ç¥£¥ì¥¯¥È¥ê¹½Â¤¤ËÊÑ´¹¤¹¤ëºÝ¤Îʸ»ú¥³¡¼¥É (for mbstring)
+// ページ名をディレクトリ構造に変換する際の文字コード (for mbstring)
define('PLUGIN_DUMP_FILENAME_ENCORDING', 'SJIS');
-// ºÇÂ祢¥Ã¥×¥í¡¼¥É¥µ¥¤¥º
+// æ\9c\80大ã\82¢ã\83\83ã\83\97ã\83ã\83¼ã\83\89ã\82µã\82¤ã\82º
define('PLUGIN_DUMP_MAX_FILESIZE', 1024); // Kbyte
/////////////////////////////////////////////////
/////////////////////////////////////////////////
-// ¥×¥é¥°¥¤¥óËÜÂÎ
+// プラグイン本体
function plugin_dump_action()
{
global $vars;
+ if (PKWK_READONLY) die_message('PKWK_READONLY prohibits this');
+
$pass = isset($_POST['pass']) ? $_POST['pass'] : NULL;
$act = isset($vars['act']) ? $vars['act'] : NULL;
if ($pass !== NULL) {
if (! pkwk_login($pass)) {
- $body = "<p><strong>¥Ñ¥¹¥ï¡¼¥É¤¬°ã¤¤¤Þ¤¹¡£</strong></p>\n";
+ $body = "<p><strong>パスワードが違います。</strong></p>\n";
} else {
switch($act){
case PLUGIN_DUMP_DUMP:
case PLUGIN_DUMP_RESTORE:
$retcode = plugin_dump_upload();
if ($retcode['code'] == TRUE) {
- $msg = '¥¢¥Ã¥×¥í¡¼¥É¤¬´°Î»¤·¤Þ¤·¤¿';
+ $msg = 'アップロードが完了しました';
} else {
- $msg = '¥¢¥Ã¥×¥í¡¼¥É¤Ë¼ºÇÔ¤·¤Þ¤·¤¿';
+ $msg = 'アップロードに失敗しました';
}
$body .= $retcode['msg'];
return array('msg' => $msg, 'body' => $body);
}
}
- // ÆþÎÏ¥Õ¥©¡¼¥à¤òɽ¼¨
+ // 入力フォームを表示
$body .= plugin_dump_disp_form();
$msg = '';
}
/////////////////////////////////////////////////
-// ¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É
+// ファイルのダウンロード
function plugin_dump_download()
{
global $vars, $_STORAGE;
- // ¥¢¡¼¥«¥¤¥Ö¤Î¼ïÎà
+ // アーカイブの種類
$arc_kind = ($vars['pcmd'] == 'tar') ? 'tar' : 'tgz';
- // ¥Ú¡¼¥¸Ì¾¤ËÊÑ´¹¤¹¤ë
+ // ページ名に変換する
$namedecode = isset($vars['namedecode']) ? TRUE : FALSE;
- // ¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¥£¥ì¥¯¥È¥ê
+ // バックアップディレクトリ
$bk_wiki = isset($vars['bk_wiki']) ? TRUE : FALSE;
$bk_attach = isset($vars['bk_attach']) ? TRUE : FALSE;
$bk_backup = isset($vars['bk_backup']) ? TRUE : FALSE;
$filecount = 0;
$tar = new tarlib();
$tar->create(CACHE_DIR, $arc_kind) or
- die_message('¥Æ¥ó¥Ý¥é¥ê¥Õ¥¡¥¤¥ë¤ÎÀ¸À®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿¡£');
+ die_message('テンポラリファイルの生成に失敗しました。');
if ($bk_wiki) $filecount += $tar->add_dir(DATA_DIR, $_STORAGE['DATA_DIR']['add_filter'], $namedecode);
if ($bk_attach) $filecount += $tar->add_dir(UPLOAD_DIR, $_STORAGE['UPLOAD_DIR']['add_filter'], $namedecode);
if ($filecount === 0) {
@unlink($tar->filename);
- return '<p><strong>¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</strong></p>';
+ return '<p><strong>ファイルがみつかりませんでした。</strong></p>';
} else {
- // ¥À¥¦¥ó¥í¡¼¥É
+ // ダウンロード
download_tarfile($tar->filename, $arc_kind);
@unlink($tar->filename);
- exit; // Àµ¾ï½ªÎ»
+ exit; // 正常終了
}
}
/////////////////////////////////////////////////
-// ¥Õ¥¡¥¤¥ë¤Î¥¢¥Ã¥×¥í¡¼¥É
+// ファイルのアップロード
function plugin_dump_upload()
{
global $vars, $_STORAGE;
die_message('Max file size exceeded: ' . PLUGIN_DUMP_MAX_FILESIZE . 'KB');
// Create a temporary tar file
- $uploadfile = tempnam(CACHE_DIR, 'tarlib_uploaded_');
+ $uploadfile = tempnam(realpath(CACHE_DIR), 'tarlib_uploaded_');
$tar = new tarlib();
if(! move_uploaded_file($_FILES['upload_file']['tmp_name'], $uploadfile) ||
! $tar->open($uploadfile, $arc_kind)) {
@unlink($uploadfile);
- die_message('¥Õ¥¡¥¤¥ë¤¬¤ß¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£');
+ die_message('ファイルがみつかりませんでした。');
}
$pattern = "(({$_STORAGE['DATA_DIR']['extract_filter']})|" .
$files = $tar->extract($pattern);
if (empty($files)) {
@unlink($uploadfile);
- return array('code' => FALSE, 'msg' => '<p>Ÿ³«¤Ç¤¤ë¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£</p>');
+ return array('code' => FALSE, 'msg' => '<p>展開できるファイルがありませんでした。</p>');
}
- $msg = '<p><strong>Ÿ³«¤·¤¿¥Õ¥¡¥¤¥ë°ìÍ÷</strong><ul>';
+ $msg = '<p><strong>展開したファイル一覧</strong><ul>';
foreach($files as $name) {
$msg .= "<li>$name</li>\n";
}
}
/////////////////////////////////////////////////
-// tar¥Õ¥¡¥¤¥ë¤Î¥À¥¦¥ó¥í¡¼¥É
+// tarファイルのダウンロード
function download_tarfile($tempnam, $arc_kind)
{
$size = filesize($tempnam);
}
/////////////////////////////////////////////////
-// ÆþÎÏ¥Õ¥©¡¼¥à¤òɽ¼¨
+// 入力フォームを表示
function plugin_dump_disp_form()
{
global $script, $defaultpage;
$data = <<<EOD
<span class="small">
</span>
-<h3>¥Ç¡¼¥¿¤Î¥À¥¦¥ó¥í¡¼¥É</h3>
+<h3>データのダウンロード</h3>
<form action="$script" method="post">
<div>
<input type="hidden" name="cmd" value="dump" />
<input type="hidden" name="page" value="$defaultpage" />
<input type="hidden" name="act" value="$act_down" />
-<p><strong>¥¢¡¼¥«¥¤¥Ö¤Î·Á¼°</strong>
+<p><strong>アーカイブの形式</strong>
<br />
- <input type="radio" name="pcmd" value="tgz" checked="checked" /> ¡Á.tar.gz ·Á¼°<br />
- <input type="radio" name="pcmd" value="tar" /> ¡Á.tar ·Á¼°
+ <input type="radio" name="pcmd" id="_p_dump_tgz" value="tgz" checked="checked" />
+ <label for="_p_dump_tgz"> ~.tar.gz 形式</label><br />
+ <input type="radio" name="pcmd" id="_p_dump_tar" value="tar" />
+ <label for="_p_dump_tar">~.tar 形式</label>
</p>
-<p><strong>¥Ð¥Ã¥¯¥¢¥Ã¥×¥Ç¥£¥ì¥¯¥È¥ê</strong>
+<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
+ <input type="checkbox" name="bk_wiki" id="_p_dump_d_wiki" checked="checked" />
+ <label for="_p_dump_d_wiki">wiki</label><br />
+ <input type="checkbox" name="bk_attach" id="_p_dump_d_attach" />
+ <label for="_p_dump_d_attach">attach</label><br />
+ <input type="checkbox" name="bk_backup" id="_p_dump_d_backup" />
+ <label for="_p_dump_d_backup">backup</label><br />
</p>
-<p><strong>¥ª¥×¥·¥ç¥ó</strong>
+<p><strong>オプション</strong>
<br />
- <input type="checkbox" name="namedecode" /> ¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ¤¤¤ë¥Ú¡¼¥¸Ì¾¤ò¥Ç¥£¥ì¥¯¥È¥ê³¬ÁؤĤ¤Î¥Õ¥¡¥¤¥ë¤Ë¥Ç¥³¡¼¥É (¢¨¥ê¥¹¥È¥¢¤Ë»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£¤Þ¤¿¡¢°ìÉô¤Îʸ»ú¤Ï '_' ¤ËÃÖ´¹¤µ¤ì¤Þ¤¹)<br />
+ <input type="checkbox" name="namedecode" id="_p_dump_namedecode" />
+ <label for="_p_dump_namedecode">エンコードされているページ名をディレクトリ階層つきのファイルにデコード
+ (※リストアに使うことはできなくなります。また、一部の文字は '_' に置換されます)</label><br />
</p>
-<p><strong>´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É</strong>
- <input type="password" name="pass" size="12" />
+<p><label for="_p_dump_adminpass_dump"><strong>管理者パスワード</strong></label>
+ <input type="password" name="pass" id="_p_dump_adminpass_dump" size="12" />
<input type="submit" name="ok" value="OK" />
</p>
</div>
if(PLUGIN_DUMP_ALLOW_RESTORE) {
$data .= <<<EOD
-<h3>¥Ç¡¼¥¿¤Î¥ê¥¹¥È¥¢ (*.tar, *.tar.gz)</h3>
+<h3>ã\83\87ã\83¼ã\82¿ã\81®ã\83ªã\82¹ã\83\88ã\82¢ (*.tar, *.tar.gz)</h3>
<form enctype="multipart/form-data" action="$script" method="post">
<div>
<input type="hidden" name="cmd" value="dump" />
<input type="hidden" name="page" value="$defaultpage" />
<input type="hidden" name="act" value="$act_up" />
-<p><strong>[½ÅÍ×] Ʊ¤¸Ì¾Á°¤Î¥Ç¡¼¥¿¥Õ¥¡¥¤¥ë¤Ï¾å½ñ¤¤µ¤ì¤Þ¤¹¤Î¤Ç¡¢½½Ê¬¤´Ãí°Õ¤¯¤À¤µ¤¤¡£</strong></p>
+<p><strong>[重要] 同じ名前のデータファイルは上書きされますので、十分ご注意ください。</strong></p>
<p><span class="small">
-¥¢¥Ã¥×¥í¡¼¥É²Äǽ¤ÊºÇÂç¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤Ï¡¢$maxsize KByte ¤Þ¤Ç¤Ç¤¹¡£<br />
+アップロード可能な最大ファイルサイズは、$maxsize KByte までです。<br />
</span>
- ¥Õ¥¡¥¤¥ë: <input type="file" name="upload_file" size="40" />
+ <label for="_p_dump_upload_file">ファイル:</label>
+ <input type="file" name="upload_file" id="_p_dump_upload_file" size="40" />
</p>
-<p><strong>´ÉÍý¼Ô¥Ñ¥¹¥ï¡¼¥É</strong>
- <input type="password" name="pass" size="12" />
+<p><label for="_p_dump_adminpass_restore"><strong>管理者パスワード</strong></label>
+ <input type="password" name="pass" id="_p_dump_adminpass_restore" size="12" />
<input type="submit" name="ok" value="OK" />
</p>
</div>
// tarlib: a class 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); // ¥Õ¥¡¥¤¥ë¥¿¥¤¥×¤Ø¤Î¥ª¥Õ¥»¥Ã¥È
+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_STATUS_INIT', 0); // 初期状態
+define('TARLIB_STATUS_OPEN', 10); // 読み取り
+define('TARLIB_STATUS_CREATE', 20); // 書き込み
-define('TARLIB_DATA_MODE', '100666 '); // ¥Õ¥¡¥¤¥ë¥Ñ¡¼¥ß¥Ã¥·¥ç¥ó
+define('TARLIB_DATA_MODE', '100666 '); // ファイルパーミッション
define('TARLIB_DATA_UGID', '000000 '); // uid / gid
define('TARLIB_DATA_CHKBLANKS', ' ');
-// GNU³ÈÄ¥»ÅÍÍ(¥í¥ó¥°¥Õ¥¡¥¤¥ë̾Âбþ)
+// GNU拡張仕様(ロングファイル名対応)
define('TARLIB_DATA_LONGLINK', '././@LongLink');
// Type flag
var $arc_kind;
var $dummydata;
- // ¥³¥ó¥¹¥È¥é¥¯¥¿
+ // ã\82³ã\83³ã\82¹ã\83\88ã\83©ã\82¯ã\82¿
function tarlib() {
$this->filename = '';
$this->fp = FALSE;
}
////////////////////////////////////////////////////////////
- // ´Ø¿ô : tar¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë
- // °ú¿ô : tar¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¥Ñ¥¹
- // ÊÖ¤êÃÍ: TRUE .. À®¸ù , FALSE .. ¼ºÇÔ
+ // 関数 : tarファイルを作成する
+ // å¼\95æ\95° : tarã\83\95ã\82¡ã\82¤ã\83«ã\82\92ä½\9cæ\88\90ã\81\99ã\82\8bã\83\91ã\82¹
+ // 返り値: TRUE .. 成功 , FALSE .. 失敗
////////////////////////////////////////////////////////////
function create($tempdir, $kind = 'tgz')
{
- $tempnam = tempnam($tempdir, 'tarlib_create_');
+ $tempnam = tempnam(realpath($tempdir), 'tarlib_create_');
if ($tempnam === FALSE) return FALSE;
if ($kind == 'tgz') {
}
////////////////////////////////////////////////////////////
- // ´Ø¿ô : tar¥Õ¥¡¥¤¥ë¤Ë¥Ç¥£¥ì¥¯¥È¥ê¤òÄɲ乤ë
- // °ú¿ô : $dir .. ¥Ç¥£¥ì¥¯¥È¥ê̾
- // $mask .. Äɲ乤ë¥Õ¥¡¥¤¥ë(Àµµ¬É½¸½)
- // $decode .. ¥Ú¡¼¥¸Ì¾¤ÎÊÑ´¹¤ò¤¹¤ë¤«
- // ÊÖ¤êÃÍ: ºîÀ®¤·¤¿¥Õ¥¡¥¤¥ë¿ô
+ // 関数 : tarファイルにディレクトリを追加する
+ // 引数 : $dir .. ディレクトリ名
+ // $mask .. 追加するファイル(正規表現)
+ // $decode .. ページ名の変換をするか
+ // 返り値: 作成したファイル数
////////////////////////////////////////////////////////////
function add_dir($dir, $mask, $decode = FALSE)
{
unset($files);
- // »ØÄꤵ¤ì¤¿¥Ñ¥¹¤Î¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È¤ò¼èÆÀ¤¹¤ë
+ // 指定されたパスのファイルのリストを取得する
$dp = @opendir($dir);
if($dp === FALSE) {
@unlink($this->filename);
die_message($dir . ' is not found or not readable.');
}
-
- while ($filename = readdir($dp)) {
- if (preg_match("/$mask/", $filename))
+ while (($filename = readdir($dp)) !== FALSE) {
+ if (preg_match('/' . $mask . '/', $filename)) {
$files[] = $dir . $filename;
+ }
}
closedir($dp);
- sort($files);
+ sort($files, SORT_STRING);
$matches = array();
foreach($files as $name)
{
- // Tar¤Ë³ÊǼ¤¹¤ë¥Õ¥¡¥¤¥ë̾¤òdecode
+ // Tarに格納するファイル名をdecode
if ($decode === FALSE) {
$filename = $name;
} else {
$dirname = dirname(trim($name)) . '/';
$filename = basename(trim($name));
if (preg_match("/^((?:[0-9A-F]{2})+)_((?:[0-9A-F]{2})+)/", $filename, $matches)) {
- // attach¥Õ¥¡¥¤¥ë̾
+ // 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_DUMP_FILENAME_ENCORDING);
}
- // ºÇ½ª¹¹¿·»þ¹ï
+ // 最終更新時刻
$mtime = filemtime($name);
- // ¥Õ¥¡¥¤¥ë̾Ĺ¤Î¥Á¥§¥Ã¥¯
+ // ã\83\95ã\82¡ã\82¤ã\83«å\90\8dé\95·ã\81®ã\83\81ã\82§ã\83\83ã\82¯
if (strlen($filename) > TARLIB_HDR_NAME_LEN) {
- // LongLinkÂбþ
+ // LongLink対応
$size = strlen($filename);
- // LonkLink¥Ø¥Ã¥ÀÀ¸À®
+ // LonkLinkヘッダ生成
$tar_data = $this->_make_header(TARLIB_DATA_LONGLINK, $size, $mtime, TARLIB_HDR_LINK);
- // ¥Õ¥¡¥¤¥ë½ÐÎÏ
+ // ファイル出力
$this->_write_data(join('', $tar_data), $filename, $size);
}
- // ¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤ò¼èÆÀ
+ // ファイルサイズを取得
$size = filesize($name);
- if ($size == FALSE) {
+ if ($size === FALSE) {
@unlink($this->filename);
die_message($name . ' is not found or not readable.');
}
- // ¥Ø¥Ã¥ÀÀ¸À®
+ // ヘッダ生成
$tar_data = $this->_make_header($filename, $size, $mtime, TARLIB_HDR_FILE);
- // ¥Õ¥¡¥¤¥ë¥Ç¡¼¥¿¤Î¼èÆÀ
+ // ファイルデータの取得
$fpr = @fopen($name , 'rb');
flock($fpr, LOCK_SH);
$data = fread($fpr, $size);
flock($fpr, LOCK_UN);
fclose( $fpr );
- // ¥Õ¥¡¥¤¥ë½ÐÎÏ
+ // ファイル出力
$this->_write_data(join('', $tar_data), $data, $size);
++$retvalue;
}
}
////////////////////////////////////////////////////////////
- // ´Ø¿ô : tar¤Î¥Ø¥Ã¥À¾ðÊó¤òÀ¸À®¤¹¤ë (add)
- // °ú¿ô : $filename .. ¥Õ¥¡¥¤¥ë̾
- // $size .. ¥Ç¡¼¥¿¥µ¥¤¥º
- // $mtime .. ºÇ½ª¹¹¿·Æü
+ // 関数 : tarのヘッダ情報を生成する (add)
+ // 引数 : $filename .. ファイル名
+ // $size .. ã\83\87ã\83¼ã\82¿ã\82µã\82¤ã\82º
+ // $mtime .. 最終更新日
// $typeflag .. TypeFlag (file/link)
- // Ìá¤êÃÍ: tar¥Ø¥Ã¥À¾ðÊó
+ // 戻り値: tarヘッダ情報
////////////////////////////////////////////////////////////
function _make_header($filename, $size, $mtime, $typeflag)
{
$tar_data = array_fill(0, TARLIB_HDR_LEN, "\0");
- // ¥Õ¥¡¥¤¥ë̾¤òÊݸ
+ // ファイル名を保存
for($i = 0; $i < strlen($filename); $i++ ) {
if ($i < TARLIB_HDR_NAME_LEN) {
$tar_data[$i + TARLIB_HDR_NAME_OFFSET] = $filename{$i};
} else {
- break; // ¥Õ¥¡¥¤¥ë̾¤¬Ä¹¤¹¤®
+ break; // ファイル名が長すぎ
}
}
$tar_data[$i + TARLIB_HDR_GID_OFFSET] = $ugid{$i};
}
- // ¥µ¥¤¥º
+ // ã\82µã\82¤ã\82º
$strsize = sprintf('%11o', $size);
for($i = 0; $i < strlen($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 + TARLIB_HDR_MTIME_OFFSET] = $strmtime{$i};
}
- // ¥Á¥§¥Ã¥¯¥µ¥à·×»»ÍѤΥ֥é¥ó¥¯¤òÀßÄê
+ // チェックサム計算用のブランクを設定
$chkblanks = TARLIB_DATA_CHKBLANKS;
for($i = 0; $i < strlen($chkblanks); $i++ ) {
$tar_data[$i + TARLIB_HDR_CHKSUM_OFFSET] = $chkblanks{$i};
}
- // ¥¿¥¤¥×¥Õ¥é¥°
+ // ã\82¿ã\82¤ã\83\97ã\83\95ã\83©ã\82°
$tar_data[TARLIB_HDR_TYPE_OFFSET] = $typeflag;
- // ¥Á¥§¥Ã¥¯¥µ¥à¤Î·×»»
+ // チェックサムの計算
$sum = 0;
for($i = 0; $i < TARLIB_BLK_LEN; $i++ ) {
$sum += 0xff & ord($tar_data[$i]);
}
////////////////////////////////////////////////////////////
- // ´Ø¿ô : tar¥Ç¡¼¥¿¤Î¥Õ¥¡¥¤¥ë½ÐÎÏ (add)
- // °ú¿ô : $header .. tar¥Ø¥Ã¥À¾ðÊó
- // $body .. tar¥Ç¡¼¥¿
- // $size .. ¥Ç¡¼¥¿¥µ¥¤¥º
- // Ìá¤êÃÍ: ¤Ê¤·
+ // 関数 : tarデータのファイル出力 (add)
+ // 引数 : $header .. tarヘッダ情報
+ // $body .. tarã\83\87ã\83¼ã\82¿
+ // $size .. ã\83\87ã\83¼ã\82¿ã\82µã\82¤ã\82º
+ // 戻り値: なし
////////////////////////////////////////////////////////////
function _write_data($header, $body, $size)
{
}
////////////////////////////////////////////////////////////
- // ´Ø¿ô : tar¥Õ¥¡¥¤¥ë¤ò³«¤¯
- // °ú¿ô : tar¥Õ¥¡¥¤¥ë̾
- // ÊÖ¤êÃÍ: TRUE .. À®¸ù , FALSE .. ¼ºÇÔ
+ // 関数 : tarファイルを開く
+ // 引数 : tarファイル名
+ // 返り値: TRUE .. 成功 , FALSE .. 失敗
////////////////////////////////////////////////////////////
function open($name = '', $kind = 'tgz')
{
}
////////////////////////////////////////////////////////////
- // ´Ø¿ô : »ØÄꤷ¤¿¥Ç¥£¥ì¥¯¥È¥ê¤Ëtar¥Õ¥¡¥¤¥ë¤òŸ³«¤¹¤ë
- // °ú¿ô : Ÿ³«¤¹¤ë¥Õ¥¡¥¤¥ë¥Ñ¥¿¡¼¥ó(Àµµ¬É½¸½)
- // ÊÖ¤êÃÍ: Ÿ³«¤·¤¿¥Õ¥¡¥¤¥ë̾¤Î°ìÍ÷
- // Êä : ARAI¤µ¤ó¤Îattach¥×¥é¥°¥¤¥ó¥Ñ¥Ã¥Á¤ò»²¹Í¤Ë¤·¤Þ¤·¤¿
+ // 関数 : 指定したディレクトリにtarファイルを展開する
+ // 引数 : 展開するファイルパターン(正規表現)
+ // 返り値: 展開したファイル名の一覧
+ // 補足 : ARAIさんのattachプラグインパッチを参考にしました
////////////////////////////////////////////////////////////
function extract($pattern)
{
$buff = fread($this->fp, TARLIB_HDR_LEN);
if (strlen($buff) != TARLIB_HDR_LEN) break;
- // ¥Õ¥¡¥¤¥ë̾
+ // ファイル名
$name = '';
if ($longname != '') {
- $name = $longname; // LongLinkÂбþ
+ $name = $longname; // LongLink対応
$longname = '';
} else {
for ($i = 0; $i < TARLIB_HDR_NAME_LEN; $i++ ) {
}
$name = trim($name);
- if ($name == '') break; // Ÿ³«½ªÎ»
+ if ($name == '') break; // 展開終了
- // ¥Á¥§¥Ã¥¯¥µ¥à¤ò¼èÆÀ¤·¤Ä¤Ä¡¢¥Ö¥é¥ó¥¯¤ËÃÖ´¹¤·¤Æ¤¤¤¯
+ // チェックサムを取得しつつ、ブランクに置換していく
$checksum = '';
$chkblanks = TARLIB_DATA_CHKBLANKS;
for ($i = 0; $i < TARLIB_HDR_CHKSUM_LEN; $i++ ) {
list($size) = sscanf('0' . trim($size), '%i');
// ceil
- // ¥Ç¡¼¥¿¥Ö¥í¥Ã¥¯¤Ï512byte¤Ç¥Ñ¥Ç¥£¥ó¥°¤µ¤ì¤Æ¤¤¤ë
+ // データブロックは512byteでパディングされている
$pdsz = ceil($size / TARLIB_BLK_LEN) * TARLIB_BLK_LEN;
- // ºÇ½ª¹¹¿·»þ¹ï
+ // 最終更新時刻
$strmtime = '';
for ($i = 0; $i < TARLIB_HDR_MTIME_LEN; $i++ ) {
$strmtime .= $buff{$i + TARLIB_HDR_MTIME_OFFSET};
}
list($mtime) = sscanf('0' . trim($strmtime), '%i');
- // ¥¿¥¤¥×¥Õ¥é¥°
+ // ã\82¿ã\82¤ã\83\97ã\83\95ã\83©ã\82°
// $type = $buff{TARLIB_HDR_TYPE_OFFSET};
if ($name == TARLIB_DATA_LONGLINK) {
// } else if ($type == 0 && preg_match("/$pattern/", $name) ) {
$buff = fread($this->fp, $pdsz);
- // ´û¤ËƱ¤¸¥Õ¥¡¥¤¥ë¤¬¤¢¤ë¾ì¹ç¤Ï¾å½ñ¤¤µ¤ì¤ë
+ // 既に同じファイルがある場合は上書きされる
$fpw = @fopen($name, 'wb');
if ($fpw !== FALSE) {
flock($fpw, LOCK_EX);
$files[] = $name;
}
} else {
- // ¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿¤ò¿Ê¤á¤ë
+ // ファイルポインタを進める
@fseek($this->fp, $pdsz, SEEK_CUR);
}
}
}
////////////////////////////////////////////////////////////
- // ´Ø¿ô : tar¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
- // °ú¿ô : ¤Ê¤·
- // ÊÖ¤êÃÍ: ¤Ê¤·
+ // 関数 : tarファイルを閉じる
+ // 引数 : なし
+ // 返り値: なし
////////////////////////////////////////////////////////////
function close()
{
if ($this->status == TARLIB_STATUS_CREATE) {
- // ¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë
+ // ファイルを閉じる
if ($this->arc_kind == TARLIB_KIND_TGZ) {
- // ¥Ð¥¤¥Ê¥ê¡¼¥¼¥í¤ò1024¥Ð¥¤¥È½ÐÎÏ
+ // バイナリーゼロを1024バイト出力
gzwrite($this->fp, $this->dummydata, TARLIB_HDR_LEN);
gzwrite($this->fp, $this->dummydata, TARLIB_HDR_LEN);
gzclose($this->fp);
} else {
- // ¥Ð¥¤¥Ê¥ê¡¼¥¼¥í¤ò1024¥Ð¥¤¥È½ÐÎÏ
+ // バイナリーゼロを1024バイト出力
fwrite($this->fp, $this->dummydata, TARLIB_HDR_LEN);
fwrite($this->fp, $this->dummydata, TARLIB_HDR_LEN);
fclose($this->fp);