From: Derick Rethans Date: Sat, 23 Mar 2002 14:10:57 +0000 (+0000) Subject: - Added read_uploaded_file (patch by Andrew Sitnikov ) X-Git-Tag: php-4.3.0dev-ZendEngine2-Preview1~1094 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e2f110d98210b028e38fdc37086a84f0055917f4;p=php - Added read_uploaded_file (patch by Andrew Sitnikov ) --- 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);