[Cs-content-commits] SF.net SVN: cs-content:[333] trunk/1.0
PHP Templating & Includes System
Brought to you by:
crazedsanity
|
From: <cra...@us...> - 2009-01-29 21:04:23
|
Revision: 333
http://cs-content.svn.sourceforge.net/cs-content/?rev=333&view=rev
Author: crazedsanity
Date: 2009-01-29 21:04:18 +0000 (Thu, 29 Jan 2009)
Log Message:
-----------
Rename cs_fileSystemClass.php to cs_fileSystem.class.php & change name to match.
/contentSystem.class.php:
* MAIN:::
-- fix require_once() statement to point to proper file
* __construct():
-- use new class name cs_fileSystem{}
/cs_fileSystem.class.php [RENAMED FROM cs_fileSystemClass.php]
/cs_fileSystemClass.php [RENAMED TO cs_fileSystem.class.php]
/cs_siteConfig.class.php:
* MAIN:::
-- fix require_once statement for cs_fileSystem.
-- update comments to reference appropriate class name.
* __construct():
-- update references to use new class name.
Modified Paths:
--------------
trunk/1.0/contentSystem.class.php
trunk/1.0/cs_siteConfig.class.php
Added Paths:
-----------
trunk/1.0/cs_fileSystem.class.php
Removed Paths:
-------------
trunk/1.0/cs_fileSystemClass.php
Modified: trunk/1.0/contentSystem.class.php
===================================================================
--- trunk/1.0/contentSystem.class.php 2009-01-29 20:40:16 UTC (rev 332)
+++ trunk/1.0/contentSystem.class.php 2009-01-29 21:04:18 UTC (rev 333)
@@ -71,7 +71,7 @@
}
require_once(dirname(__FILE__) ."/abstract/cs_content.abstract.class.php");
-require_once(dirname(__FILE__) ."/cs_fileSystemClass.php");
+require_once(dirname(__FILE__) ."/cs_fileSystem.class.php");
require_once(dirname(__FILE__) ."/cs_sessionClass.php");
require_once(dirname(__FILE__) ."/cs_genericPageClass.php");
require_once(dirname(__FILE__) ."/cs_tabsClass.php");
@@ -145,7 +145,7 @@
$this->templateObj->add_template_var('CURRENT_URL', $myUrl);
//create a fileSystem object.
- $this->fileSystemObj = new cs_fileSystemClass();
+ $this->fileSystemObj = new cs_fileSystem();
//create a tabs object, in case they want to load tabs on the page.
$this->tabs = new cs_tabs($this->templateObj);
Copied: trunk/1.0/cs_fileSystem.class.php (from rev 331, trunk/1.0/cs_fileSystemClass.php)
===================================================================
--- trunk/1.0/cs_fileSystem.class.php (rev 0)
+++ trunk/1.0/cs_fileSystem.class.php 2009-01-29 21:04:18 UTC (rev 333)
@@ -0,0 +1,969 @@
+<?php
+
+/*
+ * FILE INFORMATION:
+ * $HeadURL$
+ * $Id$
+ * $LastChangedDate$
+ * $LastChangedBy$
+ * $LastChangedRevision$
+ */
+
+require_once(dirname(__FILE__) ."/abstract/cs_content.abstract.class.php");
+
+class cs_fileSystem extends cs_contentAbstract {
+
+ public $root; //actual root directory.
+ public $cwd; //current directory; relative to $this->root
+ public $realcwd; //$this->root .'/'. $this->cwd
+ public $dh; //directory handle.
+ public $fh; //file handle.
+ public $filename; //filename currently being used.
+ public $lineNum = NULL;
+
+
+ //========================================================================================
+ /**
+ * The constructor.
+ */
+ public function __construct($rootDir=NULL, $cwd=NULL, $initialMode=NULL) {
+ //set the root directory that we'll be using; this is considered just like "/" in
+ // linux. Directories above it are considered non-existent.
+ if(($rootDir) AND (is_dir($rootDir))) {
+ // yup... use it.
+ $this->root = $rootDir;
+ } elseif(($GLOBALS['SITE_ROOT']) AND (is_dir($GLOBALS['SITE_ROOT']))) {
+ //not set, but SITE_ROOT is... use it.
+ $this->root = $GLOBALS['SITE_ROOT'];
+ } else {
+ //nothing useable... die.
+ exit("UNUSEABLE ROOT: $rootDir");
+ }
+
+ parent::__construct();
+
+ $this->root = $this->resolve_path_with_dots($this->root);
+
+ //set the CURRENT working directory... this should be a RELATIVE path to $this->root.
+ if(($cwd) AND (is_dir($rootDir .'/'. $cwd)) AND (!ereg($this->root, $cwd))) {
+ //looks good. Use it.
+ $this->cwd = $cwd;
+ $this->realcwd = $this->root .'/'. $cwd;
+ } else {
+ //no dice. Use the root.
+ $this->cwd = '/';
+ $this->realcwd = $this->root ;
+ }
+ chdir($this->realcwd);
+
+ //check for the initialMode...
+ $useableModes = array('r', 'r+', 'w', 'w+', 'a', 'a+', 'x', 'x+');
+ if(($initialMode) AND (in_array($initialMode, $useableModes))) {
+ //
+ $this->mode = $initialMode;
+ } else {
+ //define the DEFAULT mode.
+ $this->mode = "r+";
+ }
+
+ }//end __construct()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ public function cdup() {
+ $retval = FALSE;
+ //easy way to go "up" a directory (just like doing "cd .." in linux)
+ if(strlen($this->cwd) > 1) {
+ $myCwd = preg_replace('/\/$/', '', $this->cwd);
+ if(!preg_match('/^\//', $myCwd)) {
+ $myCwd = '/'. $myCwd;
+ }
+ $myParts = explode('/', $myCwd);
+ array_pop($myParts);
+ $myCwd = $this->gfObj->string_from_array($myParts, NULL, '/');
+ $realCwd = $this->gfObj->create_list($this->root, $myCwd, '/');
+ if(file_exists($realCwd)) {
+ $retval = TRUE;
+ $this->realcwd = $realCwd;
+ $this->cwd = '/'. $myCwd;
+ }
+ }
+
+ return($retval);
+ }//end cdup()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Think of the linux version of "cd": we're changing the current directory.
+ *
+ * @param $newDir (str) dir to change to, either absolutte or relative.
+ *
+ * @return 0 (FAIL) unable to change directory
+ * @return 1 (PASS) success.
+ */
+ public function cd($newDir) {
+
+ //check to see if it's a relative path or not...
+ //NOTE: non-relative paths should NOT include $this->root.
+ if((preg_match('/^\//', $newDir)) AND (is_dir($this->root .'/'. $newDir))) {
+ //not a relative path.
+ $this->cwd = '/'. $newDir;
+ $this->realcwd = $this->root . $newDir;
+ $retval = 1;
+ } elseif(is_dir($this->realcwd .'/'. $newDir)) {
+ //relative path...
+ $this->cwd = $this->gfObj->create_list($this->cwd, $newDir, '/');
+ $this->realcwd .= '/'. $newDir;
+ $retval = 1;
+ } else {
+ //bad.
+ $retval = 0;
+ }
+ $this->cwd = preg_replace('/\/\//', '/', $this->cwd);
+ $this->realcwd = preg_replace('/\/\//', '/', $this->realcwd);
+
+ return($retval);
+ }//end cd()
+ //========================================================================================
+
+
+ //========================================================================================
+ /**
+ * Just like the linux version of the 'ls' command.
+ */
+ public function ls($filename=NULL, $args=NULL) {
+
+ clearstatcache();
+ //open the directory for reading.
+ $this->dh = opendir($this->realcwd);
+ clearstatcache();
+ if(is_string($filename)) {
+ //check to make sure the file exists.
+ $tFile=$this->filename2absolute($filename);
+ if(file_exists($tFile)) {
+ //it's there... get info about it.
+ $info = $this->get_fileinfo($tFile);
+ if($info['type'] == 'dir') {
+ $oldCwd = $this->cwd;
+ $oldRealCwd = $this->realcwd;
+
+ $this->cd($filename);
+ $retval = $this->ls();
+
+ $this->cwd = $oldCwd;
+ $this->realcwd = $oldRealCwd;
+ }
+ else {
+ $retval[$filename] = $info;
+ }
+ } else {
+ //stupid!
+ $retval[$filename] = "FILE NOT FOUND.";
+ }
+ } else {
+ //array if file/directory names to ignore if matched exactly.
+ $ignoreArr = array("CVS", ".svn", ".", "..");
+ while (($file = readdir($this->dh)) !== false) {
+ if(!in_array($file, $ignoreArr)) {
+ $tFile = $this->realcwd .'/'. $file;
+ $tType = filetype($tFile);
+ $retval[$file] = $this->get_fileinfo($tFile);
+ if(!$tType) {
+ debug_print("FILE: $tFile || TYPE: $tType || is_file(): ". is_file($tFile) ."is_dir(): ". is_dir($tFile));
+ exit;
+ }
+ #debug_print("FILE: $file || $dir". $file);
+ unset($tType);
+ }
+ }
+ }
+ #debug_print($retval);
+ #debug_print(readdir($this->dh));
+ return($retval);
+ }//end ls()
+ //========================================================================================
+
+
+ //========================================================================================
+ /**
+ * Grabs an array of information for a given file.
+ */
+ public function get_fileinfo($tFile) {
+
+ $retval = array(
+ "size" => filesize($tFile),
+ "type" => @filetype($tFile),
+ "accessed" => fileatime($tFile),
+ "modified" => filemtime($tFile),
+ "owner" => $this->my_getuser_group(fileowner($tFile), 'uid'),
+ "uid" => fileowner($tFile),
+ "group" => $this->my_getuser_group(filegroup($tFile), 'gid'),
+ "gid" => filegroup($tFile),
+ "perms" => $this->translate_perms(fileperms($tFile)),
+ "perms_num" => substr(sprintf('%o', fileperms($tFile)), -4)
+ );
+
+ return($retval);
+ }//end get_fileinfo()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Gets the username/groupname of the given uid/gid.
+ *
+ * @param $int (int) uid/gid to check.
+ * @param $type (str) is it a uid or a gid?
+ *
+ * @return (string) groupname/username
+ */
+ private function my_getuser_group($int, $type='uid') {
+
+ if($type == 'uid') {
+ $func = 'posix_getpwuid';
+ } elseif($type == 'gid') {
+ $func = 'posix_getgrgid';
+ } else {
+ $retval = $int;
+ }
+
+ if(!function_exists($func)) {
+ throw new exception(__METHOD__ .": required function missing (". $func .")");
+ }
+ $t = $func($int);
+ return($t['name']);
+
+ }//end my_getpwuid()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Translates the permissions string (like "0700") into a *nix-style permissions
+ * string (i.e. "rwx------").
+ *
+ * @param $in_Perms (int) permission number string
+ *
+ * @return (string) permissions string.
+ *
+ * NOTE: pretty sure I copied this from php.net, though I don't know the owner. If anybody
+ * can enlighten me, I'd be glad to give them credit.
+ */
+ private function translate_perms($in_Perms) {
+ $sP = "";
+ $sP .= (($in_Perms & 0x0100) ? 'r' : '-') .
+ (($in_Perms & 0x0080) ? 'w' : '-') .
+ (($in_Perms & 0x0040) ? (($in_Perms & 0x0800) ? 's' : 'x' ) :
+ (($in_Perms & 0x0800) ? 'S' : '-'));
+ // group
+ $sP .= (($in_Perms & 0x0020) ? 'r' : '-') .
+ (($in_Perms & 0x0010) ? 'w' : '-') .
+ (($in_Perms & 0x0008) ? (($in_Perms & 0x0400) ? 's' : 'x' ) :
+ (($in_Perms & 0x0400) ? 'S' : '-'));
+
+ // world
+ $sP .= (($in_Perms & 0x0004) ? 'r' : '-') .
+ (($in_Perms & 0x0002) ? 'w' : '-') .
+ (($in_Perms & 0x0001) ? (($in_Perms & 0x0200) ? 't' : 'x' ) :
+ (($in_Perms & 0x0200) ? 'T' : '-'));
+ return($sP);
+ }//end translate_perms()
+ //========================================================================================
+
+
+ //========================================================================================
+ /**
+ * Creates an empty file... think of the linux command "touch".
+ *
+ * @param $filename (string) filename to create.
+ *
+ * @return 0 (FAIL) unable to create file.
+ * @return 1 (PASS) file created successfully.
+ */
+ public function create_file($filename, $truncateFile=FALSE) {
+
+ $retval = 0;
+ $filename = $this->filename2absolute($filename);
+ $filename = $this->resolve_path_with_dots($filename);
+ $this->filename = $filename;
+
+ //check to see if the file exists...
+ if(!file_exists($filename)) {
+ if($this->is_writable(dirname($filename))) {
+ //no file. Create it.
+ $createFileRes = touch($filename);
+ if($createFileRes) {
+ $retval = 1;
+ }
+ else {
+ throw new exception(__METHOD__ .": invalid return from touch(". $filename ."), return was (". $createFileRes .")");
+ }
+ }
+ else {
+ throw new exception(__METHOD__ .": directory (". dirname($filename) .") is not writable");
+ }
+ }
+ elseif($truncateFile === TRUE) {
+ $this->truncate_file($filename);
+ }
+ else {
+ throw new exception(__METHOD__ .": file (". $filename .") exists and truncate not set");
+ }
+ return($retval);
+ }//end create_file()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Opens a stream/resource handle to use for doing file i/o.
+ *
+ * @param $filename (string) filename to open: should be relative to the current dir.
+ * @param $mode (string) mode to use: consult PHP.net's info for fopen().
+ *
+ * @return 0 (FAIL) unable to open file.
+ * @return 1 (PASS) file opened successfully.
+ */
+ public function openFile($filename=NULL, $mode="r+") {
+ clearstatcache();
+ if(!strlen($filename) || is_null($filename)) {
+ $filename = $this->filename;
+ }
+ $filename = $this->filename2absolute($filename);
+ $this->filename = $filename;
+
+ if($this->is_readable($filename)) {
+ //make sure we've got a mode to use.
+
+ if(!is_string($mode)) {
+ $mode = "r+";
+ }
+ $this->mode = $mode;
+
+ if(in_array($this->mode, array("r+", "w", "w+", "a", "a+", "x", "x+")) && !$this->is_writable($filename)) {
+ throw new exception(__METHOD__ .": file is not writable (". $filename .") (". $this->is_writable($filename) ."), mode=(". $this->mode .")");
+ }
+
+ //attempt to open a stream to a file...
+ $this->fh = fopen($this->filename, $this->mode);
+ if(is_resource($this->fh)) {
+ //looks like we opened successfully.
+ $retval = 1;
+ $this->lineNum = 0;
+ } else {
+ //something bad happened.
+ $retval = 0;
+ }
+ }
+ else {
+ throw new exception(__METHOD__ .": file is unreadable (". $filename .")");
+ }
+
+ return($retval);
+ }//end openFile()
+ //========================================================================================
+
+
+ //========================================================================================
+ /**
+ * Write the given contents into the current file or the filename given.
+ *
+ * @param $content (str) Content to write into the file.
+ * @param $filename (str,optional) filename to use. If none given, the current one is used.
+ *
+ * @return 0 (FAIL) unable to write content to the file.
+ * @return (n) (PASS) wrote (n) bytes.
+ */
+ public function write($content, $filename=NULL) {
+
+ //open the file for writing.
+ if(!$filename) {
+ $filename= $this->filename;
+ }
+ $this->filename = $filename;
+
+ //open the file...
+ $openResult = $this->openFile($this->filename, $this->mode);
+
+ //looks like we made it...
+ $retval = fwrite($this->fh, $content, strlen($content));
+
+ //done... return the result.
+ return($retval);
+ }//end write()
+ //========================================================================================
+
+
+ //========================================================================================
+ /**
+ * Takes the given filename & returns the ABSOLUTE pathname: checks to see if the given
+ * string already has the absolute path in it.
+ */
+ private function filename2absolute($filename) {
+
+ clearstatcache();
+
+ $filename = $this->resolve_path_with_dots($filename);
+
+ //see if it starts with a "/"...
+ if(preg_match("/^\//", $filename)) {
+ $retval = $filename;
+ } else {
+ $retval=$this->realcwd .'/'. $filename;
+ $retval = $this->resolve_path_with_dots($retval);
+ #debug_print(__METHOD__ .": realcwd=(". $this->realcwd .")");
+ #$this->resolve_path_with_dots($retval);
+ }
+
+ if(!$this->check_chroot($retval, FALSE)) {
+ $this->gfObj->debug_print(func_get_args());
+ throw new exception(__METHOD__ .": file is outside of allowed directory (". $retval .")");
+ }
+
+ return($retval);
+
+ }//end filename2absolute()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Reads-in the contents of an entire file.
+ */
+ function read($filename, $returnArray=FALSE) {
+ $myFile = $this->filename2absolute($filename);
+ if(!file_exists($myFile)) {
+ throw new exception(__METHOD__ .": file doesn't exist (". $myFile .")");
+ }
+ elseif($this->is_readable($myFile)) {
+ if($returnArray) {
+ $data = file($myFile);
+ }
+ else {
+ $data = file_get_contents($myFile);
+ }
+
+ if($data === FALSE) {
+ throw new exception(__METHOD__. ": file_get_contents() returned FALSE");
+ }
+ }
+ else {
+ throw new exception(__METHOD__. ": File isn't readable (". $myFile .")");
+ }
+ return($data);
+ }//end read()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ public function rm($filename) {
+ $filename = $this->filename2absolute($filename);
+ return(unlink($filename));
+ }//end rm()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ public function rmdir($dirname) {
+ $dirname = $this->filename2absolute($dirname);
+ return(rmdir($dirname));
+ }//end rm()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Return the next line for a file.
+ *
+ * When the end of the file is found, this method returns FALSE (returning NULL might be
+ * misconstrued as a blank line).
+ */
+ public function get_next_line($maxLength=NULL, $trimLine=TRUE) {
+ if(is_resource($this->fh) && get_resource_type($this->fh) == 'stream') {
+ if(feof($this->fh)) {
+ $retval = FALSE;
+ }
+ else {
+ if(!is_numeric($maxLength)) {
+ $retval = @fgets($this->fh);
+ }
+ else {
+ $retval = fgets($this->fh, $maxLength);
+ }
+ if($trimLine) {
+ $retval = trim($retval);
+ }
+
+ if(is_null($this->lineNum) || !is_numeric($this->lineNum) || $this->lineNum < 0) {
+ throw new exception(__METHOD__ .": invalid data for lineNum (". $this->lineNum .")");
+ }
+ $this->lineNum++;
+ }
+ }
+ else {
+ throw new exception(__METHOD__ .": invalid filehandle");
+ }
+
+ return($retval);
+ }//end get_next_line()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ public function append_to_file($data, $eolChar="\n") {
+ $retval = FALSE;
+ if(is_resource($this->fh)) {
+ $result = fwrite($this->fh, $data . $eolChar);
+ if($result === FALSE) {
+ throw new exception(__METHOD__ .": failed to write data to file");
+ }
+ else {
+ $this->lineNum++;
+ $retval = $result;
+ }
+ }
+ else {
+ throw new exception(__METHOD__ .": invalid filehandle");
+ }
+
+ return($retval);
+ }//end append_to_file()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ public function closeFile() {
+ $retval = FALSE;
+ if(is_resource($this->fh)) {
+ fclose($this->fh);
+ $retval = TRUE;
+ }
+
+ //reset internal pointers.
+ $this->filename = NULL;
+ $this->lineNum = NULL;
+
+ return($retval);
+ }//end closeFile()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Compare the given filename to the open filename to see if they match (using this allows
+ * giving a filename instead of comparing the whole path).
+ */
+ public function compare_open_filename($compareToFilename) {
+ if(!strlen($compareToFilename) || is_null($compareToFilename)) {
+ throw new exception(__METHOD__ .": invalid filename to compare");
+ }
+ elseif(!strlen($this->filename)) {
+ $retval = FALSE;
+ }
+ else {
+ $internalFilename = $this->filename2absolute($this->filename);
+ $compareToFilename = $this->filename2absolute($compareToFilename);
+ if($internalFilename == $compareToFilename) {
+ $retval = TRUE;
+ }
+ else {
+ $retval = FALSE;
+ }
+ }
+
+ return($retval);
+ }//end compare_open_filename()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Give a file a new name.
+ *
+ * TODO: check to make sure both files exist within our root.
+ */
+ public function rename($currentFilename, $newFilename) {
+ if($newFilename == $currentFilename) {
+ $this->gfObj->debug_print(func_get_args());
+ throw new exception(__METHOD__ .": renaming file to same name");
+ }
+
+ if($this->compare_open_filename($currentFilename)) {
+ $this->closeFile();
+ }
+
+ if($this->compare_open_filename($newFilename)) {
+ //renaming a different file to our currently open file...
+ $this->gfObj->debug_print(func_get_args());
+ throw new exception(__METHOD__ .": renaming another file (". $currentFilename .") to the currently open filename (". $newFilename .")");
+ }
+ else {
+
+ $currentFilename = $this->filename2absolute($currentFilename);
+ $newFilename = $this->filename2absolute($newFilename);
+
+ if(!$this->is_writable(dirname($newFilename))) {
+ throw new exception(__METHOD__ .": directory isn't writable... ");
+ }
+ $retval = rename($currentFilename, $newFilename);
+ if($retval !== TRUE) {
+ throw new exception(__METHOD__ .": failed to rename file (". $retval .")");
+ }
+ }
+
+ return($retval);
+
+ }//end rename()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Check if the given filename is executable.
+ */
+ public function is_executable($filename) {
+ $filename = $this->filename2absolute($filename);
+ $retval = FALSE;
+ if(strlen($filename)) {
+ $retval = is_executable($filename);
+ }
+
+ return($retval);
+ }//end is_executable()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Check if the given filename is readable.
+ */
+ public function is_readable($filename) {
+ $filename = $this->filename2absolute($filename);
+ $retval = FALSE;
+ if(strlen($filename)) {
+ $retval = is_readable($filename);
+ }
+
+ return($retval);
+ }//end is_readable()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Check if the given filename/path is writable
+ */
+ public function is_writable($filenameOrPath) {
+ $filenameOrPath = $this->filename2absolute($filenameOrPath);
+ $retval = FALSE;
+ if(strlen($filenameOrPath)) {
+ $retval = is_writable($filenameOrPath);
+ }
+
+ return($retval);
+ }//end is_writable()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Determines how many lines are left in the current file.
+ */
+ public function count_remaining_lines() {
+ if(is_resource($this->fh) && get_resource_type($this->fh) == 'stream') {
+ $originalLineNum = $this->lineNum;
+
+ $myFilename = $this->filename;
+ $myNextLine = $this->get_next_line();
+ $retval = 0;
+ while($myNextLine !== FALSE) {
+ $retval++;
+ $myNextLine = $this->get_next_line();
+ }
+
+ $this->closeFile();
+ $this->openFile($myFilename, $this->mode);
+
+ if($originalLineNum > 0) {
+ while($originalLineNum > $this->lineNum) {
+ $this->get_next_line();
+ }
+ }
+
+ if($this->lineNum !== $originalLineNum) {
+ throw new exception(__METHOD__ .": failed to match-up old linenum (". $originalLineNum .") with the current one (". $this->lineNum .")");
+ }
+ }
+ else {
+ throw new exception(__METHOD__ .": Invalid filehandle, can't count remaining lines");
+ }
+
+ return($retval);
+ }//end count_remaining_files()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Moves the cursor to the given line number.
+ *
+ * NOTE: remember if you're trying to get line #1 (literally), then you'll
+ * want to go to line #0, then call get_next_line() to retrieve it... this
+ * is the traditional logical vs. programatic numbering issue. A.k.a. the
+ * "off-by-one problem".
+ */
+ public function go_to_line($lineNum) {
+ $retval = FALSE;
+ if(is_resource($this->fh) && get_resource_type($this->fh) == 'stream') {
+ if($this->lineNum > $lineNum) {
+ //gotta "rewind" the cursor back to the beginning.
+ rewind($this->fh);
+ $this->lineNum=0;
+ }
+
+ if($lineNum == $this->lineNum) {
+ $retval = TRUE;
+ }
+ elseif($this->lineNum < $lineNum) {
+ while($this->lineNum < $lineNum) {
+ //don't grab any data, just move the cursor...
+ $this->get_next_line();
+ }
+ if($this->lineNum == $lineNum) {
+ $retval = TRUE;
+ }
+ else {
+ throw new exception(__METHOD__ .": couldn't reach the line (". $lineNum ."), failed at (". $this->lineNum .")");
+ }
+ }
+ else {
+ throw new exception(__METHOD__ .": internal lineNum (". $this->lineNum .") couldn't be retrieved or reset to (". $lineNum .")");
+ }
+ }
+
+ return($retval);
+ }//end go_to_line()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ /**
+ * Fix a path that contains "../".
+ *
+ * EXAMPLE: changes "/home/user/blah/blah/../../test" into "/home/user/test"
+ */
+ public function resolve_path_with_dots($path) {
+
+ while(preg_match('/\/\//', $path)) {
+ $path = preg_replace('/\/\//', '/', $path);
+ }
+ $retval = $path;
+ if(strlen($path) && preg_match('/\./', $path)) {
+
+ $isAbsolute = FALSE;
+ if(preg_match('/^\//', $path)) {
+ $isAbsolute = TRUE;
+ $path = preg_replace('/^\//', '', $path);
+ }
+ $pieces = explode('/', $path);
+
+ $finalPieces = array();
+ for($i=0; $i < count($pieces); $i++) {
+ $dirName = $pieces[$i];
+ if($dirName == '.') {
+ //do nothing; don't bother appending.
+ }
+ elseif($dirName == '..') {
+ $rippedIndex = array_pop($finalPieces);
+ }
+ else {
+ $finalPieces[] = $dirName;
+ }
+ }
+
+ $retval = $this->gfObj->string_from_array($finalPieces, NULL, '/');
+ if($isAbsolute) {
+ $retval = '/'. $retval;
+ }
+ }
+
+ return($retval);
+ }//end resolve_path_with_dots()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ private function check_chroot($path, $translatePath=TRUE) {
+ if($translatePath === TRUE) {
+ $path = $this->filename2absolute($path);
+ }
+
+ //now, let's go through the root directory structure, & make sure $path is within that.
+ $rootPieces = explode('/', $this->root);
+ $pathPieces = explode('/', $path);
+
+
+ if($rootPieces[0] == '') {
+ array_shift($rootPieces);
+ }
+ if($rootPieces[(count($rootPieces) -1)] == '') {
+ array_pop($rootPieces);
+ }
+ if($pathPieces[0] == '') {
+ array_shift($pathPieces);
+ }
+
+ $retval = TRUE;
+ $tmp = '';
+ foreach($rootPieces as $index=>$dirName) {
+ $pathDir = $pathPieces[$index];
+ if($pathDir != $dirName) {
+ $retval = FALSE;
+ $this->gfObj->debug_print(__METHOD__ .": failed... tmp=(". $tmp ."), dirName=(". $dirName .")");
+ break;
+ }
+ $tmp = $this->gfObj->create_list($tmp, $dirName, '/');
+ }
+
+ return($retval);
+ }//end check_chroot()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ public function copy_file($filename, $destination) {
+ $retval = FALSE;
+ if($this->openFile($filename)) {
+ if($this->check_chroot($destination)) {
+ //okay, try to copy.
+ $retval = copy($this->fh, $destination);
+ }
+ else {
+ throw new exception(__METHOD__ .':: destination is not in the directory path');
+ }
+ }
+
+ return($retval);
+ }//end copy_file()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ public function move_file($filename, $destination) {
+ $retval = FALSE;
+ if($this->is_readable($filename)) {
+ if($this->check_chroot($destination)) {
+ //do the move.
+ $retval = rename($filename, $destination);
+ }
+ else {
+ $this->gfObj->debug_print(__METHOD__ .":: ". $this->check_chroot($destination),1);
+ throw new exception(__METHOD__ .':: destination is not in the directory path (from=['. $filename .'], to=['. $destination .']');
+ }
+ }
+
+ return($retval);
+ }//end move_file()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ public function mkdir($name, $mode=0777) {
+ if(!is_numeric($mode) || strlen($mode) != 4) {
+ $mode = 0777;
+ }
+ $retval = NULL;
+ if(!is_null($name) && strlen($name)) {
+ $name = $this->filename2absolute($name);
+ if($this->check_chroot($name)) {
+ $retval = mkdir($name, $mode);
+ chmod($name, $mode);
+ }
+ else {
+ throw new exception(__METHOD__ .': ('. $name .') isn\'t within chroot');
+ }
+ }
+ else {
+ cs_debug_backtrace(1);
+ throw new exception(__METHOD__ .': invalid data: ('. $name .')');
+ }
+
+ return($retval);
+ }//end mkdir()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ public function truncate_file($filename) {
+ if($this->is_writable($filename)) {
+ if($this->openFile($filename)) {
+ $retval = ftruncate($this->fh,0);
+ $this->closeFile();
+ }
+ else {
+ throw new exception(__METHOD__ .": unable to open specified file (". $filename .")");
+ }
+ }
+ else {
+ throw new exception(__METHOD__ .": Cannot truncate, file (". $filename .") is not writable");
+ }
+
+ return($retval);
+ }//end truncate_file()
+ //========================================================================================
+
+
+
+ //========================================================================================
+ public function go_to_last_line() {
+ if(is_resource($this->fh) && get_resource_type($this->fh) == 'stream') {
+ if(feof($this->fh)) {
+ $retval = TRUE;
+ }
+ else {
+ //NOTE::: fseek() doesn't update the file pointer in $this->fh, so we have to use fgets(), which seems faster anyway.
+ while(!feof($this->fh)) {
+ fgets($this->fh);
+ $this->lineNum++;
+ }
+ $retval = TRUE;
+ }
+ }
+ else {
+ throw new exception(__METHOD__ .": invalid filehandle");
+ }
+
+ return($retval);
+ }//end go_to_last_line()
+ //========================================================================================
+
+
+}//end cs_filesystemClass{}
+?>
Property changes on: trunk/1.0/cs_fileSystem.class.php
___________________________________________________________________
Added: svn:keywords
+ HeadURL Id LastChangedBy LastChangedDate LastChangedRevision
Added: svn:mergeinfo
+
Added: svn:eol-style
+ native
Deleted: trunk/1.0/cs_fileSystemClass.php
===================================================================
--- trunk/1.0/cs_fileSystemClass.php 2009-01-29 20:40:16 UTC (rev 332)
+++ trunk/1.0/cs_fileSystemClass.php 2009-01-29 21:04:18 UTC (rev 333)
@@ -1,969 +0,0 @@
-<?php
-
-/*
- * FILE INFORMATION:
- * $HeadURL$
- * $Id$
- * $LastChangedDate$
- * $LastChangedBy$
- * $LastChangedRevision$
- */
-
-require_once(dirname(__FILE__) ."/abstract/cs_content.abstract.class.php");
-
-class cs_fileSystemClass extends cs_contentAbstract {
-
- public $root; //actual root directory.
- public $cwd; //current directory; relative to $this->root
- public $realcwd; //$this->root .'/'. $this->cwd
- public $dh; //directory handle.
- public $fh; //file handle.
- public $filename; //filename currently being used.
- public $lineNum = NULL;
-
-
- //========================================================================================
- /**
- * The constructor.
- */
- public function __construct($rootDir=NULL, $cwd=NULL, $initialMode=NULL) {
- //set the root directory that we'll be using; this is considered just like "/" in
- // linux. Directories above it are considered non-existent.
- if(($rootDir) AND (is_dir($rootDir))) {
- // yup... use it.
- $this->root = $rootDir;
- } elseif(($GLOBALS['SITE_ROOT']) AND (is_dir($GLOBALS['SITE_ROOT']))) {
- //not set, but SITE_ROOT is... use it.
- $this->root = $GLOBALS['SITE_ROOT'];
- } else {
- //nothing useable... die.
- exit("UNUSEABLE ROOT: $rootDir");
- }
-
- parent::__construct();
-
- $this->root = $this->resolve_path_with_dots($this->root);
-
- //set the CURRENT working directory... this should be a RELATIVE path to $this->root.
- if(($cwd) AND (is_dir($rootDir .'/'. $cwd)) AND (!ereg($this->root, $cwd))) {
- //looks good. Use it.
- $this->cwd = $cwd;
- $this->realcwd = $this->root .'/'. $cwd;
- } else {
- //no dice. Use the root.
- $this->cwd = '/';
- $this->realcwd = $this->root ;
- }
- chdir($this->realcwd);
-
- //check for the initialMode...
- $useableModes = array('r', 'r+', 'w', 'w+', 'a', 'a+', 'x', 'x+');
- if(($initialMode) AND (in_array($initialMode, $useableModes))) {
- //
- $this->mode = $initialMode;
- } else {
- //define the DEFAULT mode.
- $this->mode = "r+";
- }
-
- }//end __construct()
- //========================================================================================
-
-
-
- //========================================================================================
- public function cdup() {
- $retval = FALSE;
- //easy way to go "up" a directory (just like doing "cd .." in linux)
- if(strlen($this->cwd) > 1) {
- $myCwd = preg_replace('/\/$/', '', $this->cwd);
- if(!preg_match('/^\//', $myCwd)) {
- $myCwd = '/'. $myCwd;
- }
- $myParts = explode('/', $myCwd);
- array_pop($myParts);
- $myCwd = $this->gfObj->string_from_array($myParts, NULL, '/');
- $realCwd = $this->gfObj->create_list($this->root, $myCwd, '/');
- if(file_exists($realCwd)) {
- $retval = TRUE;
- $this->realcwd = $realCwd;
- $this->cwd = '/'. $myCwd;
- }
- }
-
- return($retval);
- }//end cdup()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Think of the linux version of "cd": we're changing the current directory.
- *
- * @param $newDir (str) dir to change to, either absolutte or relative.
- *
- * @return 0 (FAIL) unable to change directory
- * @return 1 (PASS) success.
- */
- public function cd($newDir) {
-
- //check to see if it's a relative path or not...
- //NOTE: non-relative paths should NOT include $this->root.
- if((preg_match('/^\//', $newDir)) AND (is_dir($this->root .'/'. $newDir))) {
- //not a relative path.
- $this->cwd = '/'. $newDir;
- $this->realcwd = $this->root . $newDir;
- $retval = 1;
- } elseif(is_dir($this->realcwd .'/'. $newDir)) {
- //relative path...
- $this->cwd = $this->gfObj->create_list($this->cwd, $newDir, '/');
- $this->realcwd .= '/'. $newDir;
- $retval = 1;
- } else {
- //bad.
- $retval = 0;
- }
- $this->cwd = preg_replace('/\/\//', '/', $this->cwd);
- $this->realcwd = preg_replace('/\/\//', '/', $this->realcwd);
-
- return($retval);
- }//end cd()
- //========================================================================================
-
-
- //========================================================================================
- /**
- * Just like the linux version of the 'ls' command.
- */
- public function ls($filename=NULL, $args=NULL) {
-
- clearstatcache();
- //open the directory for reading.
- $this->dh = opendir($this->realcwd);
- clearstatcache();
- if(is_string($filename)) {
- //check to make sure the file exists.
- $tFile=$this->filename2absolute($filename);
- if(file_exists($tFile)) {
- //it's there... get info about it.
- $info = $this->get_fileinfo($tFile);
- if($info['type'] == 'dir') {
- $oldCwd = $this->cwd;
- $oldRealCwd = $this->realcwd;
-
- $this->cd($filename);
- $retval = $this->ls();
-
- $this->cwd = $oldCwd;
- $this->realcwd = $oldRealCwd;
- }
- else {
- $retval[$filename] = $info;
- }
- } else {
- //stupid!
- $retval[$filename] = "FILE NOT FOUND.";
- }
- } else {
- //array if file/directory names to ignore if matched exactly.
- $ignoreArr = array("CVS", ".svn", ".", "..");
- while (($file = readdir($this->dh)) !== false) {
- if(!in_array($file, $ignoreArr)) {
- $tFile = $this->realcwd .'/'. $file;
- $tType = filetype($tFile);
- $retval[$file] = $this->get_fileinfo($tFile);
- if(!$tType) {
- debug_print("FILE: $tFile || TYPE: $tType || is_file(): ". is_file($tFile) ."is_dir(): ". is_dir($tFile));
- exit;
- }
- #debug_print("FILE: $file || $dir". $file);
- unset($tType);
- }
- }
- }
- #debug_print($retval);
- #debug_print(readdir($this->dh));
- return($retval);
- }//end ls()
- //========================================================================================
-
-
- //========================================================================================
- /**
- * Grabs an array of information for a given file.
- */
- public function get_fileinfo($tFile) {
-
- $retval = array(
- "size" => filesize($tFile),
- "type" => @filetype($tFile),
- "accessed" => fileatime($tFile),
- "modified" => filemtime($tFile),
- "owner" => $this->my_getuser_group(fileowner($tFile), 'uid'),
- "uid" => fileowner($tFile),
- "group" => $this->my_getuser_group(filegroup($tFile), 'gid'),
- "gid" => filegroup($tFile),
- "perms" => $this->translate_perms(fileperms($tFile)),
- "perms_num" => substr(sprintf('%o', fileperms($tFile)), -4)
- );
-
- return($retval);
- }//end get_fileinfo()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Gets the username/groupname of the given uid/gid.
- *
- * @param $int (int) uid/gid to check.
- * @param $type (str) is it a uid or a gid?
- *
- * @return (string) groupname/username
- */
- private function my_getuser_group($int, $type='uid') {
-
- if($type == 'uid') {
- $func = 'posix_getpwuid';
- } elseif($type == 'gid') {
- $func = 'posix_getgrgid';
- } else {
- $retval = $int;
- }
-
- if(!function_exists($func)) {
- throw new exception(__METHOD__ .": required function missing (". $func .")");
- }
- $t = $func($int);
- return($t['name']);
-
- }//end my_getpwuid()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Translates the permissions string (like "0700") into a *nix-style permissions
- * string (i.e. "rwx------").
- *
- * @param $in_Perms (int) permission number string
- *
- * @return (string) permissions string.
- *
- * NOTE: pretty sure I copied this from php.net, though I don't know the owner. If anybody
- * can enlighten me, I'd be glad to give them credit.
- */
- private function translate_perms($in_Perms) {
- $sP = "";
- $sP .= (($in_Perms & 0x0100) ? 'r' : '-') .
- (($in_Perms & 0x0080) ? 'w' : '-') .
- (($in_Perms & 0x0040) ? (($in_Perms & 0x0800) ? 's' : 'x' ) :
- (($in_Perms & 0x0800) ? 'S' : '-'));
- // group
- $sP .= (($in_Perms & 0x0020) ? 'r' : '-') .
- (($in_Perms & 0x0010) ? 'w' : '-') .
- (($in_Perms & 0x0008) ? (($in_Perms & 0x0400) ? 's' : 'x' ) :
- (($in_Perms & 0x0400) ? 'S' : '-'));
-
- // world
- $sP .= (($in_Perms & 0x0004) ? 'r' : '-') .
- (($in_Perms & 0x0002) ? 'w' : '-') .
- (($in_Perms & 0x0001) ? (($in_Perms & 0x0200) ? 't' : 'x' ) :
- (($in_Perms & 0x0200) ? 'T' : '-'));
- return($sP);
- }//end translate_perms()
- //========================================================================================
-
-
- //========================================================================================
- /**
- * Creates an empty file... think of the linux command "touch".
- *
- * @param $filename (string) filename to create.
- *
- * @return 0 (FAIL) unable to create file.
- * @return 1 (PASS) file created successfully.
- */
- public function create_file($filename, $truncateFile=FALSE) {
-
- $retval = 0;
- $filename = $this->filename2absolute($filename);
- $filename = $this->resolve_path_with_dots($filename);
- $this->filename = $filename;
-
- //check to see if the file exists...
- if(!file_exists($filename)) {
- if($this->is_writable(dirname($filename))) {
- //no file. Create it.
- $createFileRes = touch($filename);
- if($createFileRes) {
- $retval = 1;
- }
- else {
- throw new exception(__METHOD__ .": invalid return from touch(". $filename ."), return was (". $createFileRes .")");
- }
- }
- else {
- throw new exception(__METHOD__ .": directory (". dirname($filename) .") is not writable");
- }
- }
- elseif($truncateFile === TRUE) {
- $this->truncate_file($filename);
- }
- else {
- throw new exception(__METHOD__ .": file (". $filename .") exists and truncate not set");
- }
- return($retval);
- }//end create_file()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Opens a stream/resource handle to use for doing file i/o.
- *
- * @param $filename (string) filename to open: should be relative to the current dir.
- * @param $mode (string) mode to use: consult PHP.net's info for fopen().
- *
- * @return 0 (FAIL) unable to open file.
- * @return 1 (PASS) file opened successfully.
- */
- public function openFile($filename=NULL, $mode="r+") {
- clearstatcache();
- if(!strlen($filename) || is_null($filename)) {
- $filename = $this->filename;
- }
- $filename = $this->filename2absolute($filename);
- $this->filename = $filename;
-
- if($this->is_readable($filename)) {
- //make sure we've got a mode to use.
-
- if(!is_string($mode)) {
- $mode = "r+";
- }
- $this->mode = $mode;
-
- if(in_array($this->mode, array("r+", "w", "w+", "a", "a+", "x", "x+")) && !$this->is_writable($filename)) {
- throw new exception(__METHOD__ .": file is not writable (". $filename .") (". $this->is_writable($filename) ."), mode=(". $this->mode .")");
- }
-
- //attempt to open a stream to a file...
- $this->fh = fopen($this->filename, $this->mode);
- if(is_resource($this->fh)) {
- //looks like we opened successfully.
- $retval = 1;
- $this->lineNum = 0;
- } else {
- //something bad happened.
- $retval = 0;
- }
- }
- else {
- throw new exception(__METHOD__ .": file is unreadable (". $filename .")");
- }
-
- return($retval);
- }//end openFile()
- //========================================================================================
-
-
- //========================================================================================
- /**
- * Write the given contents into the current file or the filename given.
- *
- * @param $content (str) Content to write into the file.
- * @param $filename (str,optional) filename to use. If none given, the current one is used.
- *
- * @return 0 (FAIL) unable to write content to the file.
- * @return (n) (PASS) wrote (n) bytes.
- */
- public function write($content, $filename=NULL) {
-
- //open the file for writing.
- if(!$filename) {
- $filename= $this->filename;
- }
- $this->filename = $filename;
-
- //open the file...
- $openResult = $this->openFile($this->filename, $this->mode);
-
- //looks like we made it...
- $retval = fwrite($this->fh, $content, strlen($content));
-
- //done... return the result.
- return($retval);
- }//end write()
- //========================================================================================
-
-
- //========================================================================================
- /**
- * Takes the given filename & returns the ABSOLUTE pathname: checks to see if the given
- * string already has the absolute path in it.
- */
- private function filename2absolute($filename) {
-
- clearstatcache();
-
- $filename = $this->resolve_path_with_dots($filename);
-
- //see if it starts with a "/"...
- if(preg_match("/^\//", $filename)) {
- $retval = $filename;
- } else {
- $retval=$this->realcwd .'/'. $filename;
- $retval = $this->resolve_path_with_dots($retval);
- #debug_print(__METHOD__ .": realcwd=(". $this->realcwd .")");
- #$this->resolve_path_with_dots($retval);
- }
-
- if(!$this->check_chroot($retval, FALSE)) {
- $this->gfObj->debug_print(func_get_args());
- throw new exception(__METHOD__ .": file is outside of allowed directory (". $retval .")");
- }
-
- return($retval);
-
- }//end filename2absolute()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Reads-in the contents of an entire file.
- */
- function read($filename, $returnArray=FALSE) {
- $myFile = $this->filename2absolute($filename);
- if(!file_exists($myFile)) {
- throw new exception(__METHOD__ .": file doesn't exist (". $myFile .")");
- }
- elseif($this->is_readable($myFile)) {
- if($returnArray) {
- $data = file($myFile);
- }
- else {
- $data = file_get_contents($myFile);
- }
-
- if($data === FALSE) {
- throw new exception(__METHOD__. ": file_get_contents() returned FALSE");
- }
- }
- else {
- throw new exception(__METHOD__. ": File isn't readable (". $myFile .")");
- }
- return($data);
- }//end read()
- //========================================================================================
-
-
-
- //========================================================================================
- public function rm($filename) {
- $filename = $this->filename2absolute($filename);
- return(unlink($filename));
- }//end rm()
- //========================================================================================
-
-
-
- //========================================================================================
- public function rmdir($dirname) {
- $dirname = $this->filename2absolute($dirname);
- return(rmdir($dirname));
- }//end rm()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Return the next line for a file.
- *
- * When the end of the file is found, this method returns FALSE (returning NULL might be
- * misconstrued as a blank line).
- */
- public function get_next_line($maxLength=NULL, $trimLine=TRUE) {
- if(is_resource($this->fh) && get_resource_type($this->fh) == 'stream') {
- if(feof($this->fh)) {
- $retval = FALSE;
- }
- else {
- if(!is_numeric($maxLength)) {
- $retval = @fgets($this->fh);
- }
- else {
- $retval = fgets($this->fh, $maxLength);
- }
- if($trimLine) {
- $retval = trim($retval);
- }
-
- if(is_null($this->lineNum) || !is_numeric($this->lineNum) || $this->lineNum < 0) {
- throw new exception(__METHOD__ .": invalid data for lineNum (". $this->lineNum .")");
- }
- $this->lineNum++;
- }
- }
- else {
- throw new exception(__METHOD__ .": invalid filehandle");
- }
-
- return($retval);
- }//end get_next_line()
- //========================================================================================
-
-
-
- //========================================================================================
- public function append_to_file($data, $eolChar="\n") {
- $retval = FALSE;
- if(is_resource($this->fh)) {
- $result = fwrite($this->fh, $data . $eolChar);
- if($result === FALSE) {
- throw new exception(__METHOD__ .": failed to write data to file");
- }
- else {
- $this->lineNum++;
- $retval = $result;
- }
- }
- else {
- throw new exception(__METHOD__ .": invalid filehandle");
- }
-
- return($retval);
- }//end append_to_file()
- //========================================================================================
-
-
-
- //========================================================================================
- public function closeFile() {
- $retval = FALSE;
- if(is_resource($this->fh)) {
- fclose($this->fh);
- $retval = TRUE;
- }
-
- //reset internal pointers.
- $this->filename = NULL;
- $this->lineNum = NULL;
-
- return($retval);
- }//end closeFile()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Compare the given filename to the open filename to see if they match (using this allows
- * giving a filename instead of comparing the whole path).
- */
- public function compare_open_filename($compareToFilename) {
- if(!strlen($compareToFilename) || is_null($compareToFilename)) {
- throw new exception(__METHOD__ .": invalid filename to compare");
- }
- elseif(!strlen($this->filename)) {
- $retval = FALSE;
- }
- else {
- $internalFilename = $this->filename2absolute($this->filename);
- $compareToFilename = $this->filename2absolute($compareToFilename);
- if($internalFilename == $compareToFilename) {
- $retval = TRUE;
- }
- else {
- $retval = FALSE;
- }
- }
-
- return($retval);
- }//end compare_open_filename()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Give a file a new name.
- *
- * TODO: check to make sure both files exist within our root.
- */
- public function rename($currentFilename, $newFilename) {
- if($newFilename == $currentFilename) {
- $this->gfObj->debug_print(func_get_args());
- throw new exception(__METHOD__ .": renaming file to same name");
- }
-
- if($this->compare_open_filename($currentFilename)) {
- $this->closeFile();
- }
-
- if($this->compare_open_filename($newFilename)) {
- //renaming a different file to our currently open file...
- $this->gfObj->debug_print(func_get_args());
- throw new exception(__METHOD__ .": renaming another file (". $currentFilename .") to the currently open filename (". $newFilename .")");
- }
- else {
-
- $currentFilename = $this->filename2absolute($currentFilename);
- $newFilename = $this->filename2absolute($newFilename);
-
- if(!$this->is_writable(dirname($newFilename))) {
- throw new exception(__METHOD__ .": directory isn't writable... ");
- }
- $retval = rename($currentFilename, $newFilename);
- if($retval !== TRUE) {
- throw new exception(__METHOD__ .": failed to rename file (". $retval .")");
- }
- }
-
- return($retval);
-
- }//end rename()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Check if the given filename is executable.
- */
- public function is_executable($filename) {
- $filename = $this->filename2absolute($filename);
- $retval = FALSE;
- if(strlen($filename)) {
- $retval = is_executable($filename);
- }
-
- return($retval);
- }//end is_executable()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Check if the given filename is readable.
- */
- public function is_readable($filename) {
- $filename = $this->filename2absolute($filename);
- $retval = FALSE;
- if(strlen($filename)) {
- $retval = is_readable($filename);
- }
-
- return($retval);
- }//end is_readable()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Check if the given filename/path is writable
- */
- public function is_writable($filenameOrPath) {
- $filenameOrPath = $this->filename2absolute($filenameOrPath);
- $retval = FALSE;
- if(strlen($filenameOrPath)) {
- $retval = is_writable($filenameOrPath);
- }
-
- return($retval);
- }//end is_writable()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Determines how many lines are left in the current file.
- */
- public function count_remaining_lines() {
- if(is_resource($this->fh) && get_resource_type($this->fh) == 'stream') {
- $originalLineNum = $this->lineNum;
-
- $myFilename = $this->filename;
- $myNextLine = $this->get_next_line();
- $retval = 0;
- while($myNextLine !== FALSE) {
- $retval++;
- $myNextLine = $this->get_next_line();
- }
-
- $this->closeFile();
- $this->openFile($myFilename, $this->mode);
-
- if($originalLineNum > 0) {
- while($originalLineNum > $this->lineNum) {
- $this->get_next_line();
- }
- }
-
- if($this->lineNum !== $originalLineNum) {
- throw new exception(__METHOD__ .": failed to match-up old linenum (". $originalLineNum .") with the current one (". $this->lineNum .")");
- }
- }
- else {
- throw new exception(__METHOD__ .": Invalid filehandle, can't count remaining lines");
- }
-
- return($retval);
- }//end count_remaining_files()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Moves the cursor to the given line number.
- *
- * NOTE: remember if you're trying to get line #1 (literally), then you'll
- * want to go to line #0, then call get_next_line() to retrieve it... this
- * is the traditional logical vs. programatic numbering issue. A.k.a. the
- * "off-by-one problem".
- */
- public function go_to_line($lineNum) {
- $retval = FALSE;
- if(is_resource($this->fh) && get_resource_type($this->fh) == 'stream') {
- if($this->lineNum > $lineNum) {
- //gotta "rewind" the cursor back to the beginning.
- rewind($this->fh);
- $this->lineNum=0;
- }
-
- if($lineNum == $this->lineNum) {
- $retval = TRUE;
- }
- elseif($this->lineNum < $lineNum) {
- while($this->lineNum < $lineNum) {
- //don't grab any data, just move the cursor...
- $this->get_next_line();
- }
- if($this->lineNum == $lineNum) {
- $retval = TRUE;
- }
- else {
- throw new exception(__METHOD__ .": couldn't reach the line (". $lineNum ."), failed at (". $this->lineNum .")");
- }
- }
- else {
- throw new exception(__METHOD__ .": internal lineNum (". $this->lineNum .") couldn't be retrieved or reset to (". $lineNum .")");
- }
- }
-
- return($retval);
- }//end go_to_line()
- //========================================================================================
-
-
-
- //========================================================================================
- /**
- * Fix a path that contains "../".
- *
- * EXAMPLE: changes "/home/user/blah/blah/../../test" into "/home/user/test"
- */
- public function resolve_path_with_dots($path) {
-
- while(preg_match('/\/\//', $path)) {
- $path = preg_replace('/\/\//', '/', $path);
- }
- $retval = $path;
- if(strlen($path) && preg_match('/\./', $path)) {
-
- $isAbsolute = FALSE;
- if(preg_match('/^\//', $path)) {
- $isAbsolute = TRUE;
- $path = preg_replace('/^\//', '', $path);
- }
- $pieces = explode('/', $path);
-
- $finalPieces = array();
- for($i=0; $i < count($pieces); $i++) {
- $dirName = $pieces[$i];
- if($dirName == '.') {
- //do nothing; don't bother appending.
- }
- elseif($dirName == '..') {
- $rippedIndex = array_pop($finalPieces);
- }
- else {
- $finalPieces[] = $dirName;
- }
- }
-
- $retval = $this->gfObj->string_from_array($finalPieces, NULL, '/');
- if($isAbsolute) {
- $retval = '/'. $retval;
- }
- }
-
- return($retval);
- }//end resolve_path_with_dots()
- //========================================================================================
-
-
-
- //========================================================================================
- private function check_chroot($path, $translatePath=TRUE) {
- if($translatePath === TRUE) {
- $path = $this->filename2absolute($path);
- }
-
- //now, let's go through the root directory structure, & make sure $path is within that.
- $rootPieces = explode('/', $this->root);
- $pathPieces = explode('/', $path);
-
-
- if($rootPieces[0] == '') {
- array_shift($rootPieces);
- }
- if($rootPieces[(count($rootPieces) -1)] == '') {
- array_pop($rootPieces);
- }
- if($pathPieces[0] == '') {
- array_shift($pathPieces);
- }
-
- $retval = TRUE;
- $tmp = '';
- foreach($rootPieces as $index=>$dirName) {
- $pathDir = $pathPieces[$index];
- if($pathDir != $dirName) {
- $retval = FALSE;
- $this->gfObj->debug_print(__METHOD__ .": failed... tmp=(". $tmp ."), dirName=(". $dirName .")");
- break;
- }
- $tmp = $this->gfObj->create_list($tmp, $dirName, '/');
- }
-
- return($retval);
- }//end check_chroot()
- //========================================================================================
-
-
-
- //========================================================================================
- public function copy_file($filename, $destination) {
- $retval = FALSE;
- if($this->openFile($filename)) {
- if($this->check_chroot($destination)) {
- //okay, try to copy.
- $retval = copy($this->fh, $destination);
- }
- else {
- throw new exception(__METHOD__ .':: destination is not in the directory path');
- }
- }
-
- return($retval);
- }//end copy_file()
- //========================================================================================
-
-
-
- //========================================================================================
- public function move_file($filename, $destination) {
- $retval = FALSE;
- if($this->is_readable($filename)) {
- if($this->check_chroot($destination)) {
- //do the move.
- $retval = rename($filename, $destin...
[truncated message content] |