mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-06 10:11:38 +09:00
Move remaining non-composer classes to common/libraries
This commit is contained in:
parent
97d385648b
commit
971a3bd115
9 changed files with 2 additions and 13 deletions
569
common/libraries/ftp.php
Normal file
569
common/libraries/ftp.php
Normal file
|
|
@ -0,0 +1,569 @@
|
|||
<?php
|
||||
/*********************************************************************
|
||||
*
|
||||
* PHP FTP Client Class By TOMO ( groove@spencernetwork.org )
|
||||
* Modified By NAVER ( developers@xpressengine.com )
|
||||
*
|
||||
* - Version 0.13 (2010/09/29)
|
||||
*
|
||||
* - This script is free but without any warranty.
|
||||
* - You can freely copy, use, modify or redistribute this script
|
||||
* for any purpose.
|
||||
* - But please do not erase this information!!.
|
||||
*
|
||||
* Change log
|
||||
* - Version 0.13 (2010/09/29)
|
||||
* . use preg functions instead of ereg functions
|
||||
* - Version 0.12 (2002/01/11)
|
||||
*
|
||||
********************************************************************/
|
||||
|
||||
/*********************************************************************
|
||||
* List of available functions
|
||||
* ftp_connect($server, $port = 21)
|
||||
* ftp_login($user, $pass)
|
||||
* ftp_pwd()
|
||||
* ftp_size($pathname)
|
||||
* ftp_mdtm($pathname)
|
||||
* ftp_systype()
|
||||
* ftp_cdup()
|
||||
* ftp_chdir($pathname)
|
||||
* ftp_delete($pathname)
|
||||
* ftp_rmdir($pathname)
|
||||
* ftp_mkdir($pathname)
|
||||
* ftp_file_exists($pathname)
|
||||
* ftp_rename($from, $to)
|
||||
* ftp_nlist($arg = "", $pathname = "")
|
||||
* ftp_rawlist($pathname = "")
|
||||
* ftp_get($localfile, $remotefile, $mode = 1)
|
||||
* ftp_put($remotefile, $localfile, $mode = 1)
|
||||
* ftp_site($command)
|
||||
* ftp_quit()
|
||||
*********************************************************************/
|
||||
|
||||
class ftp
|
||||
{
|
||||
/* Public variables */
|
||||
var $debug;
|
||||
var $umask;
|
||||
var $timeout;
|
||||
|
||||
/* Private variables */
|
||||
var $ftp_sock;
|
||||
var $ftp_resp;
|
||||
|
||||
/* Constractor */
|
||||
function __construct()
|
||||
{
|
||||
$this->debug = false;
|
||||
$this->umask = 0022;
|
||||
$this->timeout = 30;
|
||||
|
||||
if (!defined("FTP_BINARY")) {
|
||||
define("FTP_BINARY", 1);
|
||||
}
|
||||
if (!defined("FTP_ASCII")) {
|
||||
define("FTP_ASCII", 0);
|
||||
}
|
||||
|
||||
$this->ftp_resp = "";
|
||||
}
|
||||
|
||||
/* Public functions */
|
||||
function ftp_connect($server, $port = 21)
|
||||
{
|
||||
$this->ftp_debug("Trying to ".$server.":".$port." ...\n");
|
||||
$this->ftp_sock = @fsockopen($server, $port, $errno, $errstr, $this->timeout);
|
||||
|
||||
if (!$this->ftp_sock || !$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : Cannot connect to remote host \"".$server.":".$port."\"\n");
|
||||
$this->ftp_debug("Error : fsockopen() ".$errstr." (".$errno.")\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if(substr($this->ftp_resp, 0, 3) !== '220')
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->ftp_debug("Connected to remote host \"".$server.":".$port."\"\n");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
function ftp_login($user, $pass)
|
||||
{
|
||||
$this->ftp_putcmd("USER", $user);
|
||||
if (!$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : USER command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->ftp_putcmd("PASS", $pass);
|
||||
if (!$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : PASS command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
$this->ftp_debug("Authentication succeeded\n");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
function ftp_pwd()
|
||||
{
|
||||
$this->ftp_putcmd("PWD");
|
||||
if (!$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : PWD command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return preg_replace("@^[0-9]{3} \"(.+)\" .+\r\n@", "\\1", $this->ftp_resp);
|
||||
}
|
||||
|
||||
function ftp_size($pathname)
|
||||
{
|
||||
$this->ftp_putcmd("SIZE", $pathname);
|
||||
if (!$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : SIZE command failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return preg_replace("@^[0-9]{3} ([0-9]+)\r\n@", "\\1", $this->ftp_resp);
|
||||
}
|
||||
|
||||
function ftp_mdtm($pathname)
|
||||
{
|
||||
$this->ftp_putcmd("MDTM", $pathname);
|
||||
if (!$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : MDTM command failed\n");
|
||||
return -1;
|
||||
}
|
||||
$mdtm = preg_replace("@^[0-9]{3} ([0-9]+)\r\n@", "\\1", $this->ftp_resp);
|
||||
$date = sscanf($mdtm, "%4d%2d%2d%2d%2d%2d");
|
||||
$timestamp = mktime($date[3], $date[4], $date[5], $date[1], $date[2], $date[0]);
|
||||
|
||||
return $timestamp;
|
||||
}
|
||||
|
||||
function ftp_systype()
|
||||
{
|
||||
$this->ftp_putcmd("SYST");
|
||||
if (!$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : SYST command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
$DATA = explode(" ", $this->ftp_resp);
|
||||
|
||||
return $DATA[1];
|
||||
}
|
||||
|
||||
function ftp_cdup()
|
||||
{
|
||||
$this->ftp_putcmd("CDUP");
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : CDUP command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_chdir($pathname)
|
||||
{
|
||||
$this->ftp_putcmd("CWD", $pathname);
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : CWD command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_delete($pathname)
|
||||
{
|
||||
$this->ftp_putcmd("DELE", $pathname);
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : DELE command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_rmdir($pathname)
|
||||
{
|
||||
$this->ftp_putcmd("RMD", $pathname);
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : RMD command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_mkdir($pathname)
|
||||
{
|
||||
$this->ftp_putcmd("MKD", $pathname);
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : MKD command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_file_exists($pathname)
|
||||
{
|
||||
if (!($remote_list = $this->ftp_nlist("-a"))) {
|
||||
$this->ftp_debug("Error : Cannot get remote file list\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
reset($remote_list);
|
||||
while (list(,$value) = each($remote_list)) {
|
||||
if ($value == $pathname) {
|
||||
$this->ftp_debug("Remote file ".$pathname." exists\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
$this->ftp_debug("Remote file ".$pathname." does not exist\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
function ftp_rename($from, $to)
|
||||
{
|
||||
$this->ftp_putcmd("RNFR", $from);
|
||||
if (!$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : RNFR command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
$this->ftp_putcmd("RNTO", $to);
|
||||
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : RNTO command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_nlist($arg = "", $pathname = "")
|
||||
{
|
||||
if (!($string = $this->ftp_pasv())) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if ($arg == "") {
|
||||
$nlst = "NLST";
|
||||
} else {
|
||||
$nlst = "NLST ".$arg;
|
||||
}
|
||||
$this->ftp_putcmd($nlst, $pathname);
|
||||
|
||||
$sock_data = $this->ftp_open_data_connection($string);
|
||||
if (!$sock_data || !$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : Cannot connect to remote host\n");
|
||||
$this->ftp_debug("Error : NLST command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
$this->ftp_debug("Connected to remote host\n");
|
||||
|
||||
$list = array();
|
||||
while (!feof($sock_data)) {
|
||||
$list[] = preg_replace("@[\r\n]@", "", fgets($sock_data, 512));
|
||||
}
|
||||
$this->ftp_close_data_connection($sock_data);
|
||||
$this->ftp_debug(implode("\n", $list));
|
||||
|
||||
if (!$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : NLST command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
function ftp_rawlist($pathname = "")
|
||||
{
|
||||
if (!($string = $this->ftp_pasv())) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->ftp_putcmd("LIST", $pathname);
|
||||
|
||||
$sock_data = $this->ftp_open_data_connection($string);
|
||||
if (!$sock_data || !$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : Cannot connect to remote host\n");
|
||||
$this->ftp_debug("Error : LIST command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->ftp_debug("Connected to remote host\n");
|
||||
|
||||
while (!feof($sock_data)) {
|
||||
$list[] = preg_replace("@[\r\n]@", "", fgets($sock_data, 512));
|
||||
}
|
||||
$this->ftp_debug(implode("\n", $list));
|
||||
$this->ftp_close_data_connection($sock_data);
|
||||
|
||||
if (!$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : LIST command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
function ftp_get($localfile, $remotefile, $mode = 1)
|
||||
{
|
||||
umask($this->umask);
|
||||
|
||||
if (@file_exists($localfile)) {
|
||||
$this->ftp_debug("Warning : local file will be overwritten\n");
|
||||
}
|
||||
|
||||
$fp = @fopen($localfile, "w");
|
||||
if (!$fp) {
|
||||
$this->ftp_debug("Error : Cannot create \"".$localfile."\"");
|
||||
$this->ftp_debug("Error : GET command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!$this->ftp_type($mode)) {
|
||||
$this->ftp_debug("Error : GET command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!($string = $this->ftp_pasv())) {
|
||||
$this->ftp_debug("Error : GET command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->ftp_putcmd("RETR", $remotefile);
|
||||
|
||||
$sock_data = $this->ftp_open_data_connection($string);
|
||||
if (!$sock_data || !$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : Cannot connect to remote host\n");
|
||||
$this->ftp_debug("Error : GET command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
$this->ftp_debug("Connected to remote host\n");
|
||||
$this->ftp_debug("Retrieving remote file \"".$remotefile."\" to local file \"".$localfile."\"\n");
|
||||
while (!feof($sock_data)) {
|
||||
fputs($fp, fread($sock_data, 4096));
|
||||
}
|
||||
fclose($fp);
|
||||
|
||||
$this->ftp_close_data_connection($sock_data);
|
||||
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : GET command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_put($remotefile, $localfile, $mode = 1)
|
||||
{
|
||||
|
||||
if (!@file_exists($localfile)) {
|
||||
$this->ftp_debug("Error : No such file or directory \"".$localfile."\"\n");
|
||||
$this->ftp_debug("Error : PUT command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$fp = @fopen($localfile, "r");
|
||||
if (!$fp) {
|
||||
$this->ftp_debug("Error : Cannot read file \"".$localfile."\"\n");
|
||||
$this->ftp_debug("Error : PUT command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!$this->ftp_type($mode)) {
|
||||
$this->ftp_debug("Error : PUT command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!($string = $this->ftp_pasv())) {
|
||||
$this->ftp_debug("Error : PUT command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->ftp_putcmd("STOR", $remotefile);
|
||||
|
||||
$sock_data = $this->ftp_open_data_connection($string);
|
||||
if (!$sock_data || !$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : Cannot connect to remote host\n");
|
||||
$this->ftp_debug("Error : PUT command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
$this->ftp_debug("Connected to remote host\n");
|
||||
$this->ftp_debug("Storing local file \"".$localfile."\" to remote file \"".$remotefile."\"\n");
|
||||
while (!feof($fp)) {
|
||||
fputs($sock_data, fread($fp, 4096));
|
||||
}
|
||||
fclose($fp);
|
||||
|
||||
$this->ftp_close_data_connection($sock_data);
|
||||
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : PUT command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_site($command)
|
||||
{
|
||||
$this->ftp_putcmd("SITE", $command);
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : SITE command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_quit()
|
||||
{
|
||||
$this->ftp_putcmd("QUIT");
|
||||
if (!$this->ftp_ok() || !fclose($this->ftp_sock)) {
|
||||
$this->ftp_debug("Error : QUIT command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
$this->ftp_debug("Disconnected from remote host\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Private Functions */
|
||||
|
||||
function ftp_type($mode)
|
||||
{
|
||||
if ($mode) {
|
||||
$type = "I"; //Binary mode
|
||||
} else {
|
||||
$type = "A"; //ASCII mode
|
||||
}
|
||||
$this->ftp_putcmd("TYPE", $type);
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : TYPE command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_port($ip_port)
|
||||
{
|
||||
$this->ftp_putcmd("PORT", $ip_port);
|
||||
$response = $this->ftp_ok();
|
||||
if (!$response) {
|
||||
$this->ftp_debug("Error : PORT command failed\n");
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function ftp_pasv()
|
||||
{
|
||||
$this->ftp_putcmd("PASV");
|
||||
if (!$this->ftp_ok()) {
|
||||
$this->ftp_debug("Error : PASV command failed\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$ip_port = preg_replace("@^.+ \\(?([0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+)\\)?.*\r\n$@", "\\1", $this->ftp_resp);
|
||||
return $ip_port;
|
||||
}
|
||||
|
||||
function ftp_putcmd($cmd, $arg = "")
|
||||
{
|
||||
if ($arg != "") {
|
||||
$cmd = $cmd." ".$arg;
|
||||
}
|
||||
|
||||
fputs($this->ftp_sock, $cmd."\r\n");
|
||||
$this->ftp_debug("> ".$cmd."\n");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
function ftp_ok()
|
||||
{
|
||||
$this->ftp_resp = "";
|
||||
|
||||
// 한줄을 읽는다.
|
||||
$line = '';
|
||||
while(($char = fgetc($this->ftp_sock)) !== FALSE)
|
||||
{
|
||||
$line .= $char;
|
||||
if($char === "\n") break;
|
||||
}
|
||||
|
||||
// 세자리 응답 코드가 나와야 한다.
|
||||
if(!preg_match('@^[0-9]{3}@', $line))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$this->ftp_resp = $line;
|
||||
|
||||
// 4번째 문자가 -이면 여러줄인 응답이다.
|
||||
if($line[3] === '-')
|
||||
{
|
||||
$code = substr($line, 0, 3);
|
||||
|
||||
// 한줄 단위로 읽어 나간다.
|
||||
do
|
||||
{
|
||||
$line = '';
|
||||
while(($char = fgetc($this->ftp_sock)) !== FALSE)
|
||||
{
|
||||
$line .= $char;
|
||||
if($char === "\n") break;
|
||||
}
|
||||
$this->ftp_resp .= $line;
|
||||
|
||||
// 응답 코드와 같은 코드가 나오고 공백이 있으면 끝
|
||||
if($code . ' ' === substr($line, 0, 4)) break;
|
||||
}while($line);
|
||||
}
|
||||
|
||||
$this->ftp_debug(str_replace("\r\n", "\n", $this->ftp_resp));
|
||||
|
||||
if (!preg_match("@^[123]@", $this->ftp_resp)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
function ftp_close_data_connection($sock)
|
||||
{
|
||||
$this->ftp_debug("Disconnected from remote host\n");
|
||||
return fclose($sock);
|
||||
}
|
||||
|
||||
function ftp_open_data_connection($ip_port)
|
||||
{
|
||||
if (!preg_match("@[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]+,[0-9]+@", $ip_port)) {
|
||||
$this->ftp_debug("Error : Illegal ip-port format(".$ip_port.")\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$DATA = explode(",", $ip_port);
|
||||
$ipaddr = $DATA[0].".".$DATA[1].".".$DATA[2].".".$DATA[3];
|
||||
$port = $DATA[4]*256 + $DATA[5];
|
||||
$this->ftp_debug("Trying to ".$ipaddr.":".$port." ...\n");
|
||||
$data_connection = @fsockopen($ipaddr, $port, $errno, $errstr);
|
||||
if (!$data_connection) {
|
||||
$this->ftp_debug("Error : Cannot open data connection to ".$ipaddr.":".$port."\n");
|
||||
$this->ftp_debug("Error : ".$errstr." (".$errno.")\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return $data_connection;
|
||||
}
|
||||
|
||||
function ftp_debug($message = "")
|
||||
{
|
||||
if ($this->debug) {
|
||||
echo $message;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
?>
|
||||
590
common/libraries/tar.php
Normal file
590
common/libraries/tar.php
Normal file
|
|
@ -0,0 +1,590 @@
|
|||
<?php
|
||||
/*
|
||||
=======================================================================
|
||||
Name:
|
||||
tar Class
|
||||
|
||||
Author:
|
||||
Josh Barger <joshb@npt.com>
|
||||
|
||||
Description:
|
||||
This class reads and writes Tape-Archive (TAR) Files and Gzip
|
||||
compressed TAR files, which are mainly used on UNIX systems.
|
||||
This class works on both windows AND unix systems, and does
|
||||
NOT rely on external applications!! Woohoo!
|
||||
|
||||
Usage:
|
||||
Copyright (C) 2002 Josh Barger
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details at:
|
||||
http://www.gnu.org/copyleft/lesser.html
|
||||
|
||||
If you use this script in your application/website, please
|
||||
send me an e-mail letting me know about it :)
|
||||
|
||||
Bugs:
|
||||
Please report any bugs you might find to my e-mail address
|
||||
at joshb@npt.com. If you have already created a fix/patch
|
||||
for the bug, please do send it to me so I can incorporate it into my release.
|
||||
|
||||
Version History:
|
||||
1.0 04/10/2002 - InitialRelease
|
||||
|
||||
2.0 04/11/2002 - Merged both tarReader and tarWriter
|
||||
classes into one
|
||||
- Added support for gzipped tar files
|
||||
Remember to name for .tar.gz or .tgz
|
||||
if you use gzip compression!
|
||||
:: THIS REQUIRES ZLIB EXTENSION ::
|
||||
- Added additional comments to
|
||||
functions to help users
|
||||
- Added ability to remove files and
|
||||
directories from archive
|
||||
2.1 04/12/2002 - Fixed serious bug in generating tar
|
||||
- Created another example file
|
||||
- Added check to make sure ZLIB is
|
||||
installed before running GZIP
|
||||
compression on TAR
|
||||
2.2 05/07/2002 - Added automatic detection of Gzipped
|
||||
tar files (Thanks go to J?gen Falch
|
||||
for the idea)
|
||||
- Changed "private" functions to have
|
||||
special function names beginning with
|
||||
two underscores
|
||||
=======================================================================
|
||||
*/
|
||||
|
||||
class tar {
|
||||
// Unprocessed Archive Information
|
||||
var $filename;
|
||||
var $isGzipped;
|
||||
var $tar_file;
|
||||
|
||||
// Processed Archive Information
|
||||
var $files;
|
||||
var $directories;
|
||||
var $numFiles;
|
||||
var $numDirectories;
|
||||
|
||||
|
||||
// Class Constructor -- Does nothing...
|
||||
function __construct() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Computes the unsigned Checksum of a file's header
|
||||
// to try to ensure valid file
|
||||
// PRIVATE ACCESS FUNCTION
|
||||
function __computeUnsignedChecksum($bytestring) {
|
||||
for($i=0; $i<512; $i++)
|
||||
$unsigned_chksum += ord($bytestring[$i]);
|
||||
for($i=0; $i<8; $i++)
|
||||
$unsigned_chksum -= ord($bytestring[148 + $i]);
|
||||
$unsigned_chksum += ord(" ") * 8;
|
||||
|
||||
return $unsigned_chksum;
|
||||
}
|
||||
|
||||
|
||||
// Converts a NULL padded string to a non-NULL padded string
|
||||
// PRIVATE ACCESS FUNCTION
|
||||
function __parseNullPaddedString($string) {
|
||||
$position = strpos($string,chr(0));
|
||||
if(!$position)
|
||||
{
|
||||
$position = strlen($string);
|
||||
}
|
||||
return substr($string,0,$position);
|
||||
}
|
||||
|
||||
|
||||
// This function parses the current TAR file
|
||||
// PRIVATE ACCESS FUNCTION
|
||||
function __parseTar() {
|
||||
// Read Files from archive
|
||||
$tar_length = strlen($this->tar_file);
|
||||
$main_offset = 0;
|
||||
$flag_longlink = false;
|
||||
while($main_offset < $tar_length) {
|
||||
// If we read a block of 512 nulls, we are at the end of the archive
|
||||
if(substr($this->tar_file,$main_offset,512) == str_repeat(chr(0),512))
|
||||
break;
|
||||
|
||||
// Parse file name
|
||||
$file_name = $this->__parseNullPaddedString(substr($this->tar_file,$main_offset,100));
|
||||
|
||||
// Parse the file mode
|
||||
$file_mode = substr($this->tar_file,$main_offset + 100,8);
|
||||
|
||||
// Parse the file user ID
|
||||
$file_uid = octdec(substr($this->tar_file,$main_offset + 108,8));
|
||||
|
||||
// Parse the file group ID
|
||||
$file_gid = octdec(substr($this->tar_file,$main_offset + 116,8));
|
||||
|
||||
// Parse the file size
|
||||
$file_size = octdec(substr($this->tar_file,$main_offset + 124,12));
|
||||
|
||||
// Parse the file update time - unix timestamp format
|
||||
$file_time = octdec(substr($this->tar_file,$main_offset + 136,12));
|
||||
|
||||
// Parse Checksum
|
||||
$file_chksum = octdec(substr($this->tar_file,$main_offset + 148,6));
|
||||
|
||||
// Parse user name
|
||||
$file_uname = $this->__parseNullPaddedString(substr($this->tar_file,$main_offset + 265,32));
|
||||
|
||||
// Parse Group name
|
||||
$file_gname = $this->__parseNullPaddedString(substr($this->tar_file,$main_offset + 297,32));
|
||||
|
||||
$file_type = substr($this->tar_file,$main_offset + 156,1);
|
||||
|
||||
// Make sure our file is valid
|
||||
if($this->__computeUnsignedChecksum(substr($this->tar_file,$main_offset,512)) != $file_chksum)
|
||||
return false;
|
||||
|
||||
// Parse File Contents
|
||||
$file_contents = substr($this->tar_file,$main_offset + 512,$file_size);
|
||||
|
||||
/* ### Unused Header Information ###
|
||||
$activeFile["typeflag"] = substr($this->tar_file,$main_offset + 156,1);
|
||||
$activeFile["linkname"] = substr($this->tar_file,$main_offset + 157,100);
|
||||
$activeFile["magic"] = substr($this->tar_file,$main_offset + 257,6);
|
||||
$activeFile["version"] = substr($this->tar_file,$main_offset + 263,2);
|
||||
$activeFile["devmajor"] = substr($this->tar_file,$main_offset + 329,8);
|
||||
$activeFile["devminor"] = substr($this->tar_file,$main_offset + 337,8);
|
||||
$activeFile["prefix"] = substr($this->tar_file,$main_offset + 345,155);
|
||||
$activeFile["endheader"] = substr($this->tar_file,$main_offset + 500,12);
|
||||
*/
|
||||
|
||||
if(strtolower($file_type) == 'l' || $file_name == '././@LongLink')
|
||||
{
|
||||
$flag_longlink = true;
|
||||
$longlink_name = $this->__parseNullPaddedString($file_contents);
|
||||
}
|
||||
elseif($file_type == '0') {
|
||||
// Increment number of files
|
||||
$this->numFiles++;
|
||||
|
||||
// Create us a new file in our array
|
||||
$activeFile = &$this->files[];
|
||||
|
||||
// Asign Values
|
||||
if($flag_longlink)
|
||||
{
|
||||
$activeFile["name"] = $longlink_name;
|
||||
}
|
||||
else
|
||||
{
|
||||
$activeFile["name"] = $file_name;
|
||||
}
|
||||
$activeFile["type"] = $file_type;
|
||||
$activeFile["mode"] = $file_mode;
|
||||
$activeFile["size"] = $file_size;
|
||||
$activeFile["time"] = $file_time;
|
||||
$activeFile["user_id"] = $file_uid;
|
||||
$activeFile["group_id"] = $file_gid;
|
||||
$activeFile["user_name"] = $file_uname;
|
||||
$activeFile["group_name"] = $file_gname;
|
||||
$activeFile["checksum"] = $file_chksum;
|
||||
$activeFile["file"] = $file_contents;
|
||||
|
||||
$flag_longlink = false;
|
||||
|
||||
} elseif($file_type == '5') {
|
||||
// Increment number of directories
|
||||
$this->numDirectories++;
|
||||
|
||||
// Create a new directory in our array
|
||||
$activeDir = &$this->directories[];
|
||||
|
||||
// Assign values
|
||||
if($flag_longlink)
|
||||
{
|
||||
$activeDir["name"] = $longlink_name;
|
||||
}
|
||||
else
|
||||
{
|
||||
$activeDir["name"] = $file_name;
|
||||
}
|
||||
$activeDir["type"] = $file_type;
|
||||
$activeDir["mode"] = $file_mode;
|
||||
$activeDir["time"] = $file_time;
|
||||
$activeDir["user_id"] = $file_uid;
|
||||
$activeDir["group_id"] = $file_gid;
|
||||
$activeDir["user_name"] = $file_uname;
|
||||
$activeDir["group_name"] = $file_gname;
|
||||
$activeDir["checksum"] = $file_chksum;
|
||||
|
||||
$flag_longlink = false;
|
||||
}
|
||||
|
||||
// Move our offset the number of blocks we have processed
|
||||
$main_offset += 512 + (ceil($file_size / 512) * 512);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Read a non gzipped tar file in for processing
|
||||
// PRIVATE ACCESS FUNCTION
|
||||
function __readTar($filename='') {
|
||||
// Set the filename to load
|
||||
if(!$filename)
|
||||
$filename = $this->filename;
|
||||
|
||||
// Read in the TAR file
|
||||
$fp = fopen($filename,"rb");
|
||||
$this->tar_file = fread($fp,filesize($filename));
|
||||
fclose($fp);
|
||||
|
||||
if($this->tar_file[0] == chr(31) && $this->tar_file[1] == chr(139) && $this->tar_file[2] == chr(8)) {
|
||||
if(!function_exists("gzinflate"))
|
||||
return false;
|
||||
|
||||
$this->isGzipped = TRUE;
|
||||
|
||||
$this->tar_file = gzinflate(substr($this->tar_file,10,-4));
|
||||
}
|
||||
|
||||
// Parse the TAR file
|
||||
$this->__parseTar();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Generates a TAR file from the processed data
|
||||
// PRIVATE ACCESS FUNCTION
|
||||
function __generateTAR() {
|
||||
// Clear any data currently in $this->tar_file
|
||||
unset($this->tar_file);
|
||||
|
||||
// Generate Records for each directory, if we have directories
|
||||
if($this->numDirectories > 0) {
|
||||
foreach($this->directories as $key => $information) {
|
||||
unset($header);
|
||||
|
||||
// Generate tar header for this directory
|
||||
// Filename, Permissions, UID, GID, size, Time, checksum, typeflag, linkname, magic, version, user name, group name, devmajor, devminor, prefix, end
|
||||
$header .= str_pad($information["name"],100,chr(0));
|
||||
$header .= str_pad(decoct($information["mode"]),7,"0",STR_PAD_LEFT) . chr(0);
|
||||
$header .= str_pad(decoct($information["user_id"]),7,"0",STR_PAD_LEFT) . chr(0);
|
||||
$header .= str_pad(decoct($information["group_id"]),7,"0",STR_PAD_LEFT) . chr(0);
|
||||
$header .= str_pad(decoct(0),11,"0",STR_PAD_LEFT) . chr(0);
|
||||
$header .= str_pad(decoct($information["time"]),11,"0",STR_PAD_LEFT) . chr(0);
|
||||
$header .= str_repeat(" ",8);
|
||||
$header .= "5";
|
||||
$header .= str_repeat(chr(0),100);
|
||||
$header .= str_pad("ustar",6,chr(32));
|
||||
$header .= chr(32) . chr(0);
|
||||
$header .= str_pad("",32,chr(0));
|
||||
$header .= str_pad("",32,chr(0));
|
||||
$header .= str_repeat(chr(0),8);
|
||||
$header .= str_repeat(chr(0),8);
|
||||
$header .= str_repeat(chr(0),155);
|
||||
$header .= str_repeat(chr(0),12);
|
||||
|
||||
// Compute header checksum
|
||||
$checksum = str_pad(decoct($this->__computeUnsignedChecksum($header)),6,"0",STR_PAD_LEFT);
|
||||
for($i=0; $i<6; $i++) {
|
||||
$header[(148 + $i)] = substr($checksum,$i,1);
|
||||
}
|
||||
$header[154] = chr(0);
|
||||
$header[155] = chr(32);
|
||||
|
||||
// Add new tar formatted data to tar file contents
|
||||
$this->tar_file .= $header;
|
||||
}
|
||||
}
|
||||
|
||||
// Generate Records for each file, if we have files (We should...)
|
||||
if($this->numFiles > 0) {
|
||||
foreach($this->files as $key => $information) {
|
||||
unset($header);
|
||||
|
||||
// Generate the TAR header for this file
|
||||
// Filename, Permissions, UID, GID, size, Time, checksum, typeflag, linkname, magic, version, user name, group name, devmajor, devminor, prefix, end
|
||||
$header .= str_pad($information["name"],100,chr(0));
|
||||
$header .= str_pad(decoct($information["mode"]),7,"0",STR_PAD_LEFT) . chr(0);
|
||||
$header .= str_pad(decoct($information["user_id"]),7,"0",STR_PAD_LEFT) . chr(0);
|
||||
$header .= str_pad(decoct($information["group_id"]),7,"0",STR_PAD_LEFT) . chr(0);
|
||||
$header .= str_pad(decoct($information["size"]),11,"0",STR_PAD_LEFT) . chr(0);
|
||||
$header .= str_pad(decoct($information["time"]),11,"0",STR_PAD_LEFT) . chr(0);
|
||||
$header .= str_repeat(" ",8);
|
||||
$header .= "0";
|
||||
$header .= str_repeat(chr(0),100);
|
||||
$header .= str_pad("ustar",6,chr(32));
|
||||
$header .= chr(32) . chr(0);
|
||||
$header .= str_pad($information["user_name"],32,chr(0)); // How do I get a file's user name from PHP?
|
||||
$header .= str_pad($information["group_name"],32,chr(0)); // How do I get a file's group name from PHP?
|
||||
$header .= str_repeat(chr(0),8);
|
||||
$header .= str_repeat(chr(0),8);
|
||||
$header .= str_repeat(chr(0),155);
|
||||
$header .= str_repeat(chr(0),12);
|
||||
|
||||
// Compute header checksum
|
||||
$checksum = str_pad(decoct($this->__computeUnsignedChecksum($header)),6,"0",STR_PAD_LEFT);
|
||||
for($i=0; $i<6; $i++) {
|
||||
$header[(148 + $i)] = substr($checksum,$i,1);
|
||||
}
|
||||
$header[154] = chr(0);
|
||||
$header[155] = chr(32);
|
||||
|
||||
// Pad file contents to byte count divisible by 512
|
||||
$file_contents = str_pad($information["file"],(ceil($information["size"] / 512) * 512),chr(0));
|
||||
|
||||
// Add new tar formatted data to tar file contents
|
||||
$this->tar_file .= $header . $file_contents;
|
||||
}
|
||||
}
|
||||
|
||||
// Add 512 bytes of NULLs to designate EOF
|
||||
$this->tar_file .= str_repeat(chr(0),512);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Open a TAR file
|
||||
function openTAR($filename) {
|
||||
// Clear any values from previous tar archives
|
||||
unset($this->filename);
|
||||
unset($this->isGzipped);
|
||||
unset($this->tar_file);
|
||||
unset($this->files);
|
||||
unset($this->directories);
|
||||
unset($this->numFiles);
|
||||
unset($this->numDirectories);
|
||||
|
||||
// If the tar file doesn't exist...
|
||||
if(!file_exists($filename))
|
||||
return false;
|
||||
|
||||
$this->filename = $filename;
|
||||
|
||||
// Parse this file
|
||||
$this->__readTar();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Appends a tar file to the end of the currently opened tar file
|
||||
function appendTar($filename) {
|
||||
// If the tar file doesn't exist...
|
||||
if(!file_exists($filename))
|
||||
return false;
|
||||
|
||||
$this->__readTar($filename);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Retrieves information about a file in the current tar archive
|
||||
function getFile($filename) {
|
||||
if($this->numFiles > 0) {
|
||||
foreach($this->files as $key => $information) {
|
||||
if($information["name"] == $filename)
|
||||
return $information;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Retrieves information about a directory in the current tar archive
|
||||
function getDirectory($dirname) {
|
||||
if($this->numDirectories > 0) {
|
||||
foreach($this->directories as $key => $information) {
|
||||
if($information["name"] == $dirname)
|
||||
return $information;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Check if this tar archive contains a specific file
|
||||
function containsFile($filename) {
|
||||
if($this->numFiles > 0) {
|
||||
foreach($this->files as $key => $information) {
|
||||
if($information["name"] == $filename)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Check if this tar archive contains a specific directory
|
||||
function containsDirectory($dirname) {
|
||||
if($this->numDirectories > 0) {
|
||||
foreach($this->directories as $key => $information) {
|
||||
if($information["name"] == $dirname)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Add a directory to this tar archive
|
||||
function addDirectory($dirname) {
|
||||
if(!file_exists($dirname))
|
||||
return false;
|
||||
|
||||
// Get directory information
|
||||
$file_information = stat($dirname);
|
||||
|
||||
// Add directory to processed data
|
||||
$this->numDirectories++;
|
||||
$activeDir = &$this->directories[];
|
||||
$activeDir["name"] = $dirname;
|
||||
$activeDir["mode"] = $file_information["mode"];
|
||||
$activeDir["time"] = $file_information["time"];
|
||||
$activeDir["user_id"] = $file_information["uid"];
|
||||
$activeDir["group_id"] = $file_information["gid"];
|
||||
$activeDir["checksum"] = $checksum;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Add a file to the tar archive
|
||||
function addFile($filename,$from=null,$to=null) {
|
||||
// Make sure the file we are adding exists!
|
||||
if(!file_exists($filename))
|
||||
return false;
|
||||
|
||||
if(filesize($filename)==0)
|
||||
return false;
|
||||
|
||||
// Make sure there are no other files in the archive that have this same filename
|
||||
if($this->containsFile($filename))
|
||||
return false;
|
||||
|
||||
// Get file information
|
||||
$file_information = stat($filename);
|
||||
|
||||
// Read in the file's contents
|
||||
$fp = fopen($filename,"rb");
|
||||
$file_contents = fread($fp,filesize($filename));
|
||||
fclose($fp);
|
||||
|
||||
if($from && $to){
|
||||
$file_contents = str_replace($from,$to,$file_contents);
|
||||
$file_information["size"] = strlen($file_contents);
|
||||
}
|
||||
|
||||
// Add file to processed data
|
||||
$this->numFiles++;
|
||||
$activeFile = &$this->files[];
|
||||
$activeFile["name"] = $filename;
|
||||
$activeFile["mode"] = $file_information["mode"];
|
||||
$activeFile["user_id"] = $file_information["uid"];
|
||||
$activeFile["group_id"] = $file_information["gid"];
|
||||
$activeFile["size"] = $file_information["size"];
|
||||
$activeFile["time"] = $file_information["mtime"];
|
||||
$activeFile["checksum"] = $checksum;
|
||||
$activeFile["user_name"] = "";
|
||||
$activeFile["group_name"] = "";
|
||||
$activeFile["file"] = $file_contents;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Remove a file from the tar archive
|
||||
function removeFile($filename) {
|
||||
if($this->numFiles > 0) {
|
||||
foreach($this->files as $key => $information) {
|
||||
if($information["name"] == $filename) {
|
||||
$this->numFiles--;
|
||||
unset($this->files[$key]);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Remove a directory from the tar archive
|
||||
function removeDirectory($dirname) {
|
||||
if($this->numDirectories > 0) {
|
||||
foreach($this->directories as $key => $information) {
|
||||
if($information["name"] == $dirname) {
|
||||
$this->numDirectories--;
|
||||
unset($this->directories[$key]);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Write the currently loaded tar archive to disk
|
||||
function saveTar() {
|
||||
if(!$this->filename)
|
||||
return false;
|
||||
|
||||
// Write tar to current file using specified gzip compression
|
||||
$this->toTar($this->filename,$this->isGzipped);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// Saves tar archive to a different file than the current file
|
||||
function toTar($filename,$useGzip) {
|
||||
if(!$filename)
|
||||
return false;
|
||||
|
||||
// Encode processed files into TAR file format
|
||||
$this->__generateTar();
|
||||
|
||||
// GZ Compress the data if we need to
|
||||
if($useGzip) {
|
||||
// Make sure we have gzip support
|
||||
if(!function_exists("gzencode"))
|
||||
return false;
|
||||
|
||||
$file = gzencode($this->tar_file);
|
||||
} else {
|
||||
$file = $this->tar_file;
|
||||
}
|
||||
|
||||
// Write the TAR file
|
||||
$fp = fopen($filename,"wb");
|
||||
fwrite($fp,$file);
|
||||
fclose($fp);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
function toTarStream() {
|
||||
$this->__generateTar();
|
||||
return $this->tar_file;
|
||||
}
|
||||
}
|
||||
?>
|
||||
Loading…
Add table
Add a link
Reference in a new issue