}
/* }}} */
+/* {{{ 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.
*/
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)
--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(); ?>';
$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);
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)
bool(true)
bool(true)
bool(true)
+archive
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
===DONE===