cellog Thu Apr 10 03:32:09 2008 UTC Modified files: /pecl/phar phar_object.c /pecl/phar/tests phar_oo_iswriteable.phpt Log: add Phar->isWritable() for detecting whether a phar archive can be written to based on phar.readonly combined with actual file permissions [DOC] http://cvs.php.net/viewvc.cgi/pecl/phar/phar_object.c?r1=1.196&r2=1.197&diff_format=u Index: pecl/phar/phar_object.c diff -u pecl/phar/phar_object.c:1.196 pecl/phar/phar_object.c:1.197 --- pecl/phar/phar_object.c:1.196 Wed Apr 9 19:23:30 2008 +++ pecl/phar/phar_object.c Thu Apr 10 03:32:09 2008 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: phar_object.c,v 1.196 2008/04/09 19:23:30 cellog Exp $ */ +/* $Id: phar_object.c,v 1.197 2008/04/10 03:32:09 cellog Exp $ */ #include "phar_internal.h" #include "func_interceptors.h" @@ -2094,6 +2094,28 @@ } /* }}} */ +/* {{{ 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 @@ 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) http://cvs.php.net/viewvc.cgi/pecl/phar/tests/phar_oo_iswriteable.phpt?r1=1.1&r2=1.2&diff_format=u Index: pecl/phar/tests/phar_oo_iswriteable.phpt diff -u pecl/phar/tests/phar_oo_iswriteable.phpt:1.1 pecl/phar/tests/phar_oo_iswriteable.phpt:1.2 --- pecl/phar/tests/phar_oo_iswriteable.phpt:1.1 Thu Apr 10 03:12:07 2008 +++ pecl/phar/tests/phar_oo_iswriteable.phpt Thu Apr 10 03:32:09 2008 @@ -8,6 +8,7 @@ --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 @@ $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 @@ 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(true) bool(true) bool(true) +archive +bool(true) +bool(true) +bool(false) +bool(true) +bool(false) +bool(false) ===DONE===