]> granicus.if.org Git - php/commitdiff
add Phar->isWritable() for detecting whether a phar archive can be written to based...
authorGreg Beaver <cellog@php.net>
Thu, 10 Apr 2008 03:32:10 +0000 (03:32 +0000)
committerGreg Beaver <cellog@php.net>
Thu, 10 Apr 2008 03:32:10 +0000 (03:32 +0000)
[DOC]

ext/phar/phar_object.c
ext/phar/tests/phar_oo_iswriteable.phpt

index a1f7e2c2704f73f97c9cdc6ef17e5e33306e813f..28895f20e6c8d911d683f5e16e0b5f70982247bb 100755 (executable)
@@ -2094,6 +2094,28 @@ PHP_METHOD(Phar, isCompressed)
 }
 /* }}} */
 
+/* {{{ proto bool Phar::isWritable()
+ * Returns true if phar.readonly=0 or phar is a PharData AND the actual file is writable.
+ */
+PHP_METHOD(Phar, isWritable)
+{
+       php_stream_statbuf ssb;
+       PHAR_ARCHIVE_OBJECT();
+       
+       if (!phar_obj->arc.archive->is_writeable) {
+               RETURN_FALSE;
+       }
+       if (SUCCESS != php_stream_stat_path(phar_obj->arc.archive->fname, &ssb)) {
+               if (phar_obj->arc.archive->is_brandnew) {
+                       /* assume it works if the file doesn't exist yet */
+                       RETURN_TRUE;
+               }
+               RETURN_FALSE;
+       }
+       RETURN_BOOL((ssb.sb.st_mode & (S_IWOTH | S_IWGRP | S_IWUSR)) != 0);
+}
+/* }}} */
+
 /* {{{ proto bool Phar::delete(string entry)
  * Deletes a named file within the archive.
  */
@@ -3925,6 +3947,7 @@ zend_function_entry php_archive_methods[] = {
        PHP_ME(Phar, hasMetadata,           NULL,                      ZEND_ACC_PUBLIC)
        PHP_ME(Phar, isBuffering,           NULL,                      ZEND_ACC_PUBLIC)
        PHP_ME(Phar, isCompressed,          NULL,                      ZEND_ACC_PUBLIC)
+       PHP_ME(Phar, isWritable,            NULL,                      ZEND_ACC_PUBLIC)
        PHP_ME(Phar, isPhar,                NULL,                      ZEND_ACC_PUBLIC)
        PHP_ME(Phar, isTar,                 NULL,                      ZEND_ACC_PUBLIC)
        PHP_ME(Phar, isZip,                 NULL,                      ZEND_ACC_PUBLIC)
index 9957cea867f4c2f2769c7471af3e74d26ca56350..89e977cd8d4bb095d6bce848c4f0647d487ca8bb 100644 (file)
@@ -8,6 +8,7 @@ phar.require_hash=0
 --FILE--
 <?php
 $fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.1.phar.php';
+$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.tar';
 $pname = 'phar://hio';
 $file = '<?php include "' . $pname . '/a.php"; __HALT_COMPILER(); ?>';
 
@@ -17,6 +18,9 @@ $files['dir/'] = '';
 $hasdir = 1;
 include 'files/phar_test.inc';
 $a = new Phar($fname);
+$b = new PharData($fname2);
+$b['test'] = 'hi';
+
 var_dump($a['a.php']->isWritable());
 var_dump($a['a.php']->isReadable());
 $a['a.php']->chmod(000);
@@ -34,10 +38,26 @@ clearstatcache();
 var_dump($a['a.php']->isWritable());
 var_dump($a['a.php']->isReadable());
 ?>
+archive
+<?php
+ini_set('phar.readonly',0);
+clearstatcache();
+var_dump($a->isWritable());
+var_dump($b->isWritable());
+ini_set('phar.readonly',1);
+clearstatcache();
+var_dump($a->isWritable());
+var_dump($b->isWritable());
+chmod($fname2, 000);
+clearstatcache();
+var_dump($a->isWritable());
+var_dump($b->isWritable());
+?>
 ===DONE===
 --CLEAN--
 <?php 
 unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.1.phar.php');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.tar');
 ?>
 --EXPECT--
 bool(true)
@@ -50,4 +70,11 @@ bool(false)
 bool(true)
 bool(true)
 bool(true)
+archive
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
 ===DONE===