]> granicus.if.org Git - php/commitdiff
Implement default contexts. For the moment this is useless
authorSara Golemon <pollita@php.net>
Wed, 21 May 2003 04:04:50 +0000 (04:04 +0000)
committerSara Golemon <pollita@php.net>
Wed, 21 May 2003 04:04:50 +0000 (04:04 +0000)
but it will be used soon for connection pooling.

ext/standard/file.c
ext/standard/file.h
main/streams/php_stream_context.h

index 91634a71d12fbf9e158b2bcb33a17ca0261303ae..886a5a6c887c14ed4587e09ea10a2c5a9917e7b6 100644 (file)
@@ -137,10 +137,15 @@ static void file_globals_ctor(php_file_globals *file_globals_p TSRMLS_DC)
        FG(pclose_ret) = 0;
        FG(user_stream_current_filename) = NULL;
        FG(def_chunk_size) = PHP_SOCK_CHUNK_SIZE;
+       FG(default_context) = NULL;
 }
 
 static void file_globals_dtor(php_file_globals *file_globals_p TSRMLS_DC)
 {
+       if (FG(default_context)) {
+               /* This is being automagically freed elsewhere */
+               FG(default_context) = NULL;
+       }
 }
 
 
@@ -181,9 +186,9 @@ PHP_MINIT_FUNCTION(file)
        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_COMPLETED",               PHP_STREAM_NOTIFY_COMPLETED,            CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_RESOLVE",                 PHP_STREAM_NOTIFY_RESOLVE,                      CONST_CS | CONST_PERSISTENT);
        
-       REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_INFO",   PHP_STREAM_NOTIFY_SEVERITY_INFO, CONST_CS | CONST_PERSISTENT);
-       REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_WARN",   PHP_STREAM_NOTIFY_SEVERITY_WARN, CONST_CS | CONST_PERSISTENT);
-       REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_ERR",    PHP_STREAM_NOTIFY_SEVERITY_ERR,  CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_INFO",   PHP_STREAM_NOTIFY_SEVERITY_INFO,        CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_WARN",   PHP_STREAM_NOTIFY_SEVERITY_WARN,        CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_ERR",    PHP_STREAM_NOTIFY_SEVERITY_ERR,         CONST_CS | CONST_PERSISTENT);
 
        REGISTER_LONG_CONSTANT("STREAM_FILTER_READ",                    PHP_STREAM_FILTER_READ,                         CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("STREAM_FILTER_WRITE",                   PHP_STREAM_FILTER_WRITE,                        CONST_CS | CONST_PERSISTENT);
@@ -195,10 +200,11 @@ PHP_MINIT_FUNCTION(file)
        REGISTER_LONG_CONSTANT("STREAM_SERVER_BIND",                    STREAM_XPORT_BIND,                                      CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("STREAM_SERVER_LISTEN",                  STREAM_XPORT_LISTEN,                            CONST_CS | CONST_PERSISTENT);
        
-       REGISTER_LONG_CONSTANT("FILE_USE_INCLUDE_PATH", PHP_FILE_USE_INCLUDE_PATH, CONST_CS | CONST_PERSISTENT);
-       REGISTER_LONG_CONSTANT("FILE_IGNORE_NEW_LINES", PHP_FILE_IGNORE_NEW_LINES, CONST_CS | CONST_PERSISTENT);
-       REGISTER_LONG_CONSTANT("FILE_SKIP_EMPTY_LINES", PHP_FILE_SKIP_EMPTY_LINES, CONST_CS | CONST_PERSISTENT);
-       REGISTER_LONG_CONSTANT("FILE_APPEND", PHP_FILE_APPEND, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("FILE_USE_INCLUDE_PATH",                 PHP_FILE_USE_INCLUDE_PATH,                      CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("FILE_IGNORE_NEW_LINES",                 PHP_FILE_IGNORE_NEW_LINES,                      CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("FILE_SKIP_EMPTY_LINES",                 PHP_FILE_SKIP_EMPTY_LINES,                      CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("FILE_APPEND",                                   PHP_FILE_APPEND,                                        CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("FILE_NO_DEFAULT_CONTEXT",               PHP_FILE_NO_DEFAULT_CONTEXT,            CONST_CS | CONST_PERSISTENT);
        
 #ifdef HAVE_FNMATCH
        REGISTER_LONG_CONSTANT("FNM_NOESCAPE", FNM_NOESCAPE, CONST_CS | CONST_PERSISTENT);
@@ -439,9 +445,7 @@ PHP_FUNCTION(file_get_contents)
                return;
        }
 
-       if (zcontext) {
-               context = zend_fetch_resource(&zcontext TSRMLS_CC, -1, "Stream-Context", NULL, 1, php_le_stream_context());
-       }
+       context = php_stream_context_from_zval(zcontext, 0);
 
        stream = php_stream_open_wrapper_ex(filename, "rb", 
                                (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS,
@@ -486,9 +490,7 @@ PHP_FUNCTION(file_put_contents)
                return;
        }
 
-       if (zcontext) {
-               context = zend_fetch_resource(&zcontext TSRMLS_CC, -1, "Stream-Context", NULL, 1, php_le_stream_context());
-       }
+       context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT);
 
        stream = php_stream_open_wrapper_ex(filename, (flags & PHP_FILE_APPEND) ? "ab" : "wb", 
                        ((flags & PHP_FILE_USE_INCLUDE_PATH) ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
@@ -533,8 +535,8 @@ PHP_FUNCTION(file)
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lr!", &filename, &filename_len, &flags, &zcontext) == FAILURE) {
                return;
        }
-       if (flags < 0 || flags > (PHP_FILE_USE_INCLUDE_PATH | PHP_FILE_IGNORE_NEW_LINES | PHP_FILE_SKIP_EMPTY_LINES)) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%l' flag is not supported.", flags);
+       if (flags < 0 || flags > (PHP_FILE_USE_INCLUDE_PATH | PHP_FILE_IGNORE_NEW_LINES | PHP_FILE_SKIP_EMPTY_LINES | PHP_FILE_NO_DEFAULT_CONTEXT)) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%d' flag is not supported.", flags);
                RETURN_FALSE;
        }
        
@@ -542,9 +544,7 @@ PHP_FUNCTION(file)
        include_new_line = !(flags & PHP_FILE_IGNORE_NEW_LINES);
        skip_blank_lines = flags & PHP_FILE_SKIP_EMPTY_LINES;
 
-       if (zcontext) {
-               context = zend_fetch_resource(&zcontext TSRMLS_CC, -1, "Stream-Context", NULL, 1, php_le_stream_context());
-       }
+       context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT);
 
        stream = php_stream_open_wrapper_ex(filename, "rb", (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
        if (!stream) {
@@ -682,9 +682,8 @@ PHP_NAMED_FUNCTION(php_if_fopen)
                                &mode, &mode_len, &use_include_path, &zcontext) == FAILURE) {
                RETURN_FALSE;
        }
-       if (zcontext) {
-               ZEND_FETCH_RESOURCE(context, php_stream_context*, &zcontext, -1, "stream-context", le_stream_context);
-       }
+
+       context = php_stream_context_from_zval(zcontext, 0);
        
        stream = php_stream_open_wrapper_ex(filename, mode, (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
 
@@ -1308,9 +1307,7 @@ PHP_FUNCTION(readfile)
                RETURN_FALSE;
        }
 
-       if (zcontext) {
-               context = zend_fetch_resource(&zcontext TSRMLS_CC, -1, "Stream-Context", NULL, 1, php_le_stream_context());
-       }
+       context = php_stream_context_from_zval(zcontext, 0);
 
        stream = php_stream_open_wrapper_ex(filename, "rb", (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
        if (stream) {
@@ -1419,9 +1416,7 @@ PHP_FUNCTION(unlink)
                RETURN_FALSE;
        }
 
-       if (zcontext) {
-               context = zend_fetch_resource(&zcontext TSRMLS_CC, -1, "Stream-Context", NULL, 1, php_le_stream_context());
-       }
+       context = php_stream_context_from_zval(zcontext, 0);
 
        wrapper = php_stream_locate_url_wrapper(filename, NULL, 0 TSRMLS_CC);
 
index c797bd11fbaeda96ff853a30940c7608233af11a..014cf335538ef4167a603d8975ee2b8e906ac24c 100644 (file)
@@ -78,6 +78,7 @@ PHPAPI int php_copy_file(char *src, char *dest TSRMLS_DC);
 #define PHP_FILE_IGNORE_NEW_LINES 2
 #define PHP_FILE_SKIP_EMPTY_LINES 4
 #define PHP_FILE_APPEND 8
+#define PHP_FILE_NO_DEFAULT_CONTEXT 16
 
 typedef enum _php_meta_tags_token {
        TOK_EOF = 0,
@@ -110,6 +111,7 @@ typedef struct {
        long default_socket_timeout;
        char *user_agent;
        char *user_stream_current_filename; /* for simple recursion protection */
+       php_stream_context *default_context;
 } php_file_globals;
 
 #ifdef ZTS
index 2094b4c8a3507cb1bb32220c51a753f85d139730..147de6849e8282ffcd15801b6a54b6d56d3e8d32 100644 (file)
@@ -29,6 +29,15 @@ typedef void (*php_stream_notification_func)(php_stream_context *context,
 
 #define PHP_STREAM_NOTIFIER_PROGRESS   1
 
+/* Attempt to fetch context from the zval passed,
+   If no context was passed, use the default context
+   The the default context has not yet been created, do it now. */
+#define php_stream_context_from_zval(zcontext, nocontext) ( \
+               (zcontext) ? zend_fetch_resource(&(zcontext) TSRMLS_CC, -1, "Stream-Context", NULL, 1, php_le_stream_context()) : \
+               (nocontext) ? NULL : \
+               FG(default_context) ? FG(default_context) : \
+               (FG(default_context) = php_stream_context_alloc()) )
+
 typedef struct _php_stream_notifier {
        php_stream_notification_func func;
        void *ptr;