]> granicus.if.org Git - php/commitdiff
- Added read_uploaded_file (patch by Andrew Sitnikov <sitnikov@infonet.ee>)
authorDerick Rethans <derick@php.net>
Sat, 23 Mar 2002 14:10:57 +0000 (14:10 +0000)
committerDerick Rethans <derick@php.net>
Sat, 23 Mar 2002 14:10:57 +0000 (14:10 +0000)
ext/standard/basic_functions.c
ext/standard/basic_functions.h

index edc7817c91a393969ba3dca1ae776f7c27181773..95ef394a574d5a7cbecbf5d4e86e747286923e01 100644 (file)
@@ -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)
 {
index 7b3d83d764e72529f3081eed949f5bdd57309354..d19bcfd71262206d2ef4a43123f3b616aad42b36 100644 (file)
@@ -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);