summaryrefslogtreecommitdiff
path: root/ext/standard/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/file.c')
-rw-r--r--ext/standard/file.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/ext/standard/file.c b/ext/standard/file.c
index 4da72890f9..096444272a 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -1403,34 +1403,36 @@ PHP_FUNCTION(rename)
}
/* }}} */
-/* {{{ proto bool unlink(string filename)
+/* {{{ proto bool unlink(string filename[, context context])
Delete a file */
PHP_FUNCTION(unlink)
{
- zval **filename;
- int ret;
+ char *filename;
+ int filename_len;
+ php_stream_wrapper *wrapper;
+ zval *zcontext = NULL;
+ php_stream_context *context = NULL;
- if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &filename) == FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &filename, &filename_len, &zcontext) == FAILURE) {
+ RETURN_FALSE;
}
- convert_to_string_ex(filename);
- if (PG(safe_mode) && !php_checkuid(Z_STRVAL_PP(filename), NULL, CHECKUID_CHECK_FILE_AND_DIR)) {
- RETURN_FALSE;
+ if (zcontext) {
+ context = zend_fetch_resource(&zcontext TSRMLS_CC, -1, "Stream-Context", NULL, 1, php_le_stream_context());
}
- if (php_check_open_basedir(Z_STRVAL_PP(filename) TSRMLS_CC)) {
+ wrapper = php_stream_locate_url_wrapper(filename, NULL, 0 TSRMLS_CC);
+
+ if (!wrapper || !wrapper->wops) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate stream wrapper");
RETURN_FALSE;
}
- ret = VCWD_UNLINK(Z_STRVAL_PP(filename));
- if (ret == -1) {
- php_error_docref1(NULL TSRMLS_CC, Z_STRVAL_PP(filename), E_WARNING, "%s", strerror(errno));
+ if (!wrapper->wops->unlink) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s does not allow unlinking", wrapper->wops->label ? wrapper->wops->label : "Wrapper");
RETURN_FALSE;
}
- /* Clear stat cache */
- PHP_FN(clearstatcache)(INTERNAL_FUNCTION_PARAM_PASSTHRU);
- RETURN_TRUE;
+ RETURN_BOOL(wrapper->wops->unlink(wrapper, filename, context TSRMLS_CC));
}
/* }}} */