summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerick Rethans <derick@php.net>2002-03-23 14:10:57 +0000
committerDerick Rethans <derick@php.net>2002-03-23 14:10:57 +0000
commite2f110d98210b028e38fdc37086a84f0055917f4 (patch)
tree3b33bb560265a1ab66a2851e72956abbd0e10319
parentbfa05df3fdf217c649b51f07c13b3c354d0b6944 (diff)
downloadphp-git-e2f110d98210b028e38fdc37086a84f0055917f4.tar.gz
- Added read_uploaded_file (patch by Andrew Sitnikov <sitnikov@infonet.ee>)
-rw-r--r--ext/standard/basic_functions.c70
-rw-r--r--ext/standard/basic_functions.h1
2 files changed, 71 insertions, 0 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index edc7817c91..95ef394a57 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -527,6 +527,7 @@ function_entry basic_functions[] = {
PHP_FE(parse_ini_file, NULL)
PHP_FE(is_uploaded_file, NULL)
PHP_FE(move_uploaded_file, NULL)
+ PHP_FE(read_uploaded_file, NULL)
/* functions from type.c */
PHP_FE(intval, NULL)
@@ -2351,6 +2352,75 @@ PHP_FUNCTION(move_uploaded_file)
}
/* }}} */
+/* {{{ proto string read_uploaded_file(string path)
+ Read a file if and only if it was created by an upload and return it content or FALSE if error */
+PHP_FUNCTION(read_uploaded_file)
+{
+ zval **file;
+ FILE *fp;
+ int issock = 0, socketd = 0;
+ int fd;
+ struct stat sbuf;
+ size_t len, rlen;
+
+ if (!SG(rfc1867_uploaded_files)) {
+ RETURN_FALSE;
+ }
+
+ if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &file) != SUCCESS) {
+ ZEND_WRONG_PARAM_COUNT();
+ }
+ convert_to_string_ex(file);
+
+ if (!zend_hash_exists(SG(rfc1867_uploaded_files), Z_STRVAL_PP(file), Z_STRLEN_PP(file) + 1)) {
+ php_error(E_WARNING, "'%s' is not uploaded file", Z_STRVAL_PP(file));
+ RETURN_FALSE;
+ }
+
+ fp = php_fopen_wrapper(Z_STRVAL_PP(file), "rb", 0, &issock, &socketd, NULL TSRMLS_CC);
+
+ if (!fp) {
+ php_error(E_WARNING, "%s(): Can not open file '%s'", get_active_function_name(TSRMLS_C), Z_STRVAL_PP(file));
+ RETURN_FALSE;
+ }
+
+ fd = fileno(fp);
+
+ if (fstat(fd, &sbuf) != 0) {
+ php_error(E_WARNING, "%s(): fstat failed", get_active_function_name(TSRMLS_C));
+ RETURN_FALSE;
+ }
+
+ len = sbuf.st_size;
+
+ Z_STRVAL_P(return_value) = emalloc(len + 1);
+
+ if (!Z_STRVAL_P(return_value)) {
+ php_error(E_WARNING, "%s(): Cannot allocate %i bytes", get_active_function_name(TSRMLS_C), len);
+ RETURN_FALSE;
+ }
+
+ rlen = fread(Z_STRVAL_P(return_value), 1, len, fp);
+
+ fclose(fp);
+
+ if (rlen != len) {
+ php_error(E_WARNING, "%s(): Can not read '%s'", get_active_function_name(TSRMLS_C), Z_STRVAL_PP(file));
+ efree(Z_STRVAL_P(return_value));
+ RETURN_FALSE;
+ }
+
+ Z_STRLEN_P(return_value) = rlen;
+ Z_STRVAL_P(return_value)[Z_STRLEN_P(return_value)] = 0;
+
+ if (PG(magic_quotes_runtime)) {
+ Z_STRVAL_P(return_value) = php_addslashes(Z_STRVAL_P(return_value),
+ Z_STRLEN_P(return_value), &Z_STRLEN_P(return_value), 1 TSRMLS_CC);
+ }
+ Z_TYPE_P(return_value) = IS_STRING;
+}
+/* }}} */
+
static void php_simple_ini_parser_cb(zval *arg1, zval *arg2, int callback_type, zval *arr)
{
diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h
index 7b3d83d764..d19bcfd712 100644
--- a/ext/standard/basic_functions.h
+++ b/ext/standard/basic_functions.h
@@ -95,6 +95,7 @@ PHP_FUNCTION(unregister_tick_function);
PHP_FUNCTION(is_uploaded_file);
PHP_FUNCTION(move_uploaded_file);
+PHP_FUNCTION(read_uploaded_file);
/* From the INI parser */
PHP_FUNCTION(parse_ini_file);