Annotation of embedaddon/php/ext/standard/file.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | PHP Version 5                                                        |
                      4:    +----------------------------------------------------------------------+
                      5:    | Copyright (c) 1997-2012 The PHP Group                                |
                      6:    +----------------------------------------------------------------------+
                      7:    | This source file is subject to version 3.01 of the PHP license,      |
                      8:    | that is bundled with this package in the file LICENSE, and is        |
                      9:    | available through the world-wide-web at the following url:           |
                     10:    | http://www.php.net/license/3_01.txt                                  |
                     11:    | If you did not receive a copy of the PHP license and are unable to   |
                     12:    | obtain it through the world-wide-web, please send a note to          |
                     13:    | license@php.net so we can mail you a copy immediately.               |
                     14:    +----------------------------------------------------------------------+
                     15:    | Authors: Rasmus Lerdorf <rasmus@php.net>                             |
                     16:    |          Stig Bakken <ssb@php.net>                                   |
                     17:    |          Andi Gutmans <andi@zend.com>                                |
                     18:    |          Zeev Suraski <zeev@zend.com>                                |
                     19:    | PHP 4.0 patches by Thies C. Arntzen (thies@thieso.net)               |
                     20:    | PHP streams by Wez Furlong (wez@thebrainroom.com)                    |
                     21:    +----------------------------------------------------------------------+
                     22: */
                     23: 
                     24: /* $Id: file.c 321634 2012-01-01 13:15:04Z felipe $ */
                     25: 
                     26: /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */
                     27: 
                     28: /* {{{ includes */
                     29: 
                     30: #include "php.h"
                     31: #include "php_globals.h"
                     32: #include "ext/standard/flock_compat.h"
                     33: #include "ext/standard/exec.h"
                     34: #include "ext/standard/php_filestat.h"
                     35: #include "php_open_temporary_file.h"
                     36: #include "ext/standard/basic_functions.h"
                     37: #include "php_ini.h"
                     38: #include "php_smart_str.h"
                     39: 
                     40: #include <stdio.h>
                     41: #include <stdlib.h>
                     42: #include <errno.h>
                     43: #include <sys/types.h>
                     44: #include <sys/stat.h>
                     45: #include <fcntl.h>
                     46: 
                     47: #ifdef PHP_WIN32
                     48: # include <io.h>
                     49: # define O_RDONLY _O_RDONLY
                     50: # include "win32/param.h"
                     51: # include "win32/winutil.h"
                     52: # include "win32/fnmatch.h"
                     53: #else
                     54: # if HAVE_SYS_PARAM_H
                     55: #  include <sys/param.h>
                     56: # endif
                     57: # if HAVE_SYS_SELECT_H
                     58: #  include <sys/select.h>
                     59: # endif
                     60: # if defined(NETWARE) && defined(USE_WINSOCK)
                     61: #  include <novsock2.h>
                     62: # else
                     63: #  include <sys/socket.h>
                     64: #  include <netinet/in.h>
                     65: #  include <netdb.h>
                     66: # endif
                     67: # if HAVE_ARPA_INET_H
                     68: #  include <arpa/inet.h>
                     69: # endif
                     70: #endif
                     71: 
                     72: #include "ext/standard/head.h"
                     73: #include "safe_mode.h"
                     74: #include "php_string.h"
                     75: #include "file.h"
                     76: 
                     77: #if HAVE_PWD_H
                     78: # ifdef PHP_WIN32
                     79: #  include "win32/pwd.h"
                     80: # else
                     81: #  include <pwd.h>
                     82: # endif
                     83: #endif
                     84: 
                     85: #ifdef HAVE_SYS_TIME_H
                     86: # include <sys/time.h>
                     87: #endif
                     88: 
                     89: #include "fsock.h"
                     90: #include "fopen_wrappers.h"
                     91: #include "streamsfuncs.h"
                     92: #include "php_globals.h"
                     93: 
                     94: #ifdef HAVE_SYS_FILE_H
                     95: # include <sys/file.h>
                     96: #endif
                     97: 
                     98: #if MISSING_FCLOSE_DECL
                     99: extern int fclose(FILE *);
                    100: #endif
                    101: 
                    102: #ifdef HAVE_SYS_MMAN_H
                    103: # include <sys/mman.h>
                    104: #endif
                    105: 
                    106: #include "scanf.h"
                    107: #include "zend_API.h"
                    108: 
                    109: #ifdef ZTS
                    110: int file_globals_id;
                    111: #else
                    112: php_file_globals file_globals;
                    113: #endif
                    114: 
                    115: #if defined(HAVE_FNMATCH) && !defined(PHP_WIN32)
                    116: # ifndef _GNU_SOURCE
                    117: #  define _GNU_SOURCE
                    118: # endif
                    119: # include <fnmatch.h>
                    120: #endif
                    121: 
                    122: #ifdef HAVE_WCHAR_H
                    123: # include <wchar.h>
                    124: #endif
                    125: 
                    126: #ifndef S_ISDIR
                    127: # define S_ISDIR(mode) (((mode)&S_IFMT) == S_IFDIR)
                    128: #endif
                    129: /* }}} */
                    130: 
                    131: #define PHP_STREAM_TO_ZVAL(stream, arg) \
                    132:        php_stream_from_zval_no_verify(stream, arg); \
                    133:        if (stream == NULL) {   \
                    134:                RETURN_FALSE;   \
                    135:        }
                    136: 
                    137: /* {{{ ZTS-stuff / Globals / Prototypes */
                    138: 
                    139: /* sharing globals is *evil* */                
                    140: static int le_stream_context = FAILURE;
                    141: 
                    142: PHPAPI int php_le_stream_context(void)
                    143: {
                    144:        return le_stream_context;
                    145: }
                    146: /* }}} */
                    147: 
                    148: /* {{{ Module-Stuff
                    149: */
                    150: static ZEND_RSRC_DTOR_FUNC(file_context_dtor)
                    151: {
                    152:        php_stream_context *context = (php_stream_context*)rsrc->ptr;
                    153:        if (context->options) {
                    154:                zval_ptr_dtor(&context->options);
                    155:                context->options = NULL;
                    156:        }
                    157:        php_stream_context_free(context);
                    158: }
                    159: 
                    160: static void file_globals_ctor(php_file_globals *file_globals_p TSRMLS_DC)
                    161: {
                    162:        FG(pclose_ret) = 0;
                    163:        FG(user_stream_current_filename) = NULL;
                    164:        FG(def_chunk_size) = PHP_SOCK_CHUNK_SIZE;
                    165: }
                    166: 
                    167: static void file_globals_dtor(php_file_globals *file_globals_p TSRMLS_DC)
                    168: {
                    169: }
                    170: 
                    171: PHP_INI_BEGIN()
                    172:        STD_PHP_INI_ENTRY("user_agent", NULL, PHP_INI_ALL, OnUpdateString, user_agent, php_file_globals, file_globals)
                    173:        PHP_INI_ENTRY("from", NULL, PHP_INI_ALL, NULL)
                    174:        STD_PHP_INI_ENTRY("default_socket_timeout", "60", PHP_INI_ALL, OnUpdateLong, default_socket_timeout, php_file_globals, file_globals)
                    175:        STD_PHP_INI_ENTRY("auto_detect_line_endings", "0", PHP_INI_ALL, OnUpdateLong, auto_detect_line_endings, php_file_globals, file_globals)
                    176: PHP_INI_END()
                    177: 
                    178: PHP_MINIT_FUNCTION(file)
                    179: {
                    180:        le_stream_context = zend_register_list_destructors_ex(file_context_dtor, NULL, "stream-context", module_number);
                    181: 
                    182: #ifdef ZTS
                    183:        ts_allocate_id(&file_globals_id, sizeof(php_file_globals), (ts_allocate_ctor) file_globals_ctor, (ts_allocate_dtor) file_globals_dtor);
                    184: #else
                    185:        file_globals_ctor(&file_globals TSRMLS_CC);
                    186: #endif
                    187: 
                    188:        REGISTER_INI_ENTRIES();
                    189: 
                    190:        REGISTER_LONG_CONSTANT("SEEK_SET", SEEK_SET, CONST_CS | CONST_PERSISTENT);
                    191:        REGISTER_LONG_CONSTANT("SEEK_CUR", SEEK_CUR, CONST_CS | CONST_PERSISTENT);
                    192:        REGISTER_LONG_CONSTANT("SEEK_END", SEEK_END, CONST_CS | CONST_PERSISTENT);
                    193:        REGISTER_LONG_CONSTANT("LOCK_SH", PHP_LOCK_SH, CONST_CS | CONST_PERSISTENT);
                    194:        REGISTER_LONG_CONSTANT("LOCK_EX", PHP_LOCK_EX, CONST_CS | CONST_PERSISTENT);
                    195:        REGISTER_LONG_CONSTANT("LOCK_UN", PHP_LOCK_UN, CONST_CS | CONST_PERSISTENT);
                    196:        REGISTER_LONG_CONSTANT("LOCK_NB", PHP_LOCK_NB, CONST_CS | CONST_PERSISTENT);
                    197: 
                    198:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_CONNECT",                 PHP_STREAM_NOTIFY_CONNECT,                      CONST_CS | CONST_PERSISTENT);
                    199:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_AUTH_REQUIRED",   PHP_STREAM_NOTIFY_AUTH_REQUIRED,        CONST_CS | CONST_PERSISTENT);
                    200:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_AUTH_RESULT",             PHP_STREAM_NOTIFY_AUTH_RESULT,          CONST_CS | CONST_PERSISTENT);
                    201:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_MIME_TYPE_IS",    PHP_STREAM_NOTIFY_MIME_TYPE_IS,         CONST_CS | CONST_PERSISTENT);
                    202:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_FILE_SIZE_IS",    PHP_STREAM_NOTIFY_FILE_SIZE_IS,         CONST_CS | CONST_PERSISTENT);
                    203:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_REDIRECTED",              PHP_STREAM_NOTIFY_REDIRECTED,           CONST_CS | CONST_PERSISTENT);
                    204:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_PROGRESS",                PHP_STREAM_NOTIFY_PROGRESS,                     CONST_CS | CONST_PERSISTENT);
                    205:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_FAILURE",                 PHP_STREAM_NOTIFY_FAILURE,                      CONST_CS | CONST_PERSISTENT);
                    206:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_COMPLETED",               PHP_STREAM_NOTIFY_COMPLETED,            CONST_CS | CONST_PERSISTENT);
                    207:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_RESOLVE",                 PHP_STREAM_NOTIFY_RESOLVE,                      CONST_CS | CONST_PERSISTENT);
                    208: 
                    209:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_INFO",   PHP_STREAM_NOTIFY_SEVERITY_INFO,        CONST_CS | CONST_PERSISTENT);
                    210:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_WARN",   PHP_STREAM_NOTIFY_SEVERITY_WARN,        CONST_CS | CONST_PERSISTENT);
                    211:        REGISTER_LONG_CONSTANT("STREAM_NOTIFY_SEVERITY_ERR",    PHP_STREAM_NOTIFY_SEVERITY_ERR,         CONST_CS | CONST_PERSISTENT);
                    212: 
                    213:        REGISTER_LONG_CONSTANT("STREAM_FILTER_READ",                    PHP_STREAM_FILTER_READ,                         CONST_CS | CONST_PERSISTENT);
                    214:        REGISTER_LONG_CONSTANT("STREAM_FILTER_WRITE",                   PHP_STREAM_FILTER_WRITE,                        CONST_CS | CONST_PERSISTENT);
                    215:        REGISTER_LONG_CONSTANT("STREAM_FILTER_ALL",                             PHP_STREAM_FILTER_ALL,                          CONST_CS | CONST_PERSISTENT);
                    216: 
                    217:        REGISTER_LONG_CONSTANT("STREAM_CLIENT_PERSISTENT",              PHP_STREAM_CLIENT_PERSISTENT,           CONST_CS | CONST_PERSISTENT);
                    218:        REGISTER_LONG_CONSTANT("STREAM_CLIENT_ASYNC_CONNECT",   PHP_STREAM_CLIENT_ASYNC_CONNECT,        CONST_CS | CONST_PERSISTENT);
                    219:        REGISTER_LONG_CONSTANT("STREAM_CLIENT_CONNECT",                 PHP_STREAM_CLIENT_CONNECT,      CONST_CS | CONST_PERSISTENT);
                    220: 
                    221:        REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv2_CLIENT",             STREAM_CRYPTO_METHOD_SSLv2_CLIENT,      CONST_CS|CONST_PERSISTENT);
                    222:        REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_CLIENT",             STREAM_CRYPTO_METHOD_SSLv3_CLIENT,      CONST_CS|CONST_PERSISTENT);
                    223:        REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_CLIENT",    STREAM_CRYPTO_METHOD_SSLv23_CLIENT,     CONST_CS|CONST_PERSISTENT);
                    224:        REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_CLIENT",               STREAM_CRYPTO_METHOD_TLS_CLIENT,        CONST_CS|CONST_PERSISTENT);
                    225:        REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv2_SERVER",             STREAM_CRYPTO_METHOD_SSLv2_SERVER,      CONST_CS|CONST_PERSISTENT);
                    226:        REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv3_SERVER",             STREAM_CRYPTO_METHOD_SSLv3_SERVER,      CONST_CS|CONST_PERSISTENT);
                    227:        REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_SSLv23_SERVER",    STREAM_CRYPTO_METHOD_SSLv23_SERVER,     CONST_CS|CONST_PERSISTENT);
                    228:        REGISTER_LONG_CONSTANT("STREAM_CRYPTO_METHOD_TLS_SERVER",               STREAM_CRYPTO_METHOD_TLS_SERVER,        CONST_CS|CONST_PERSISTENT);
                    229: 
                    230:        REGISTER_LONG_CONSTANT("STREAM_SHUT_RD",        STREAM_SHUT_RD,         CONST_CS|CONST_PERSISTENT);
                    231:        REGISTER_LONG_CONSTANT("STREAM_SHUT_WR",        STREAM_SHUT_WR,         CONST_CS|CONST_PERSISTENT);
                    232:        REGISTER_LONG_CONSTANT("STREAM_SHUT_RDWR",      STREAM_SHUT_RDWR,       CONST_CS|CONST_PERSISTENT);
                    233: 
                    234: #ifdef PF_INET
                    235:        REGISTER_LONG_CONSTANT("STREAM_PF_INET", PF_INET, CONST_CS|CONST_PERSISTENT);
                    236: #elif defined(AF_INET)
                    237:        REGISTER_LONG_CONSTANT("STREAM_PF_INET", AF_INET, CONST_CS|CONST_PERSISTENT);
                    238: #endif
                    239: 
                    240: #ifdef PF_INET6
                    241:        REGISTER_LONG_CONSTANT("STREAM_PF_INET6", PF_INET6, CONST_CS|CONST_PERSISTENT);
                    242: #elif defined(AF_INET6)
                    243:        REGISTER_LONG_CONSTANT("STREAM_PF_INET6", AF_INET6, CONST_CS|CONST_PERSISTENT);
                    244: #endif
                    245: 
                    246: #ifdef PF_UNIX
                    247:        REGISTER_LONG_CONSTANT("STREAM_PF_UNIX", PF_UNIX, CONST_CS|CONST_PERSISTENT);
                    248: #elif defined(AF_UNIX)
                    249:        REGISTER_LONG_CONSTANT("STREAM_PF_UNIX", AF_UNIX, CONST_CS|CONST_PERSISTENT);
                    250: #endif
                    251: 
                    252: #ifdef IPPROTO_IP
                    253:        /* most people will use this one when calling socket() or socketpair() */
                    254:        REGISTER_LONG_CONSTANT("STREAM_IPPROTO_IP", IPPROTO_IP, CONST_CS|CONST_PERSISTENT);
                    255: #endif
                    256: 
                    257: #ifdef IPPROTO_TCP
                    258:        REGISTER_LONG_CONSTANT("STREAM_IPPROTO_TCP", IPPROTO_TCP, CONST_CS|CONST_PERSISTENT);
                    259: #endif
                    260: 
                    261: #ifdef IPPROTO_UDP
                    262:        REGISTER_LONG_CONSTANT("STREAM_IPPROTO_UDP", IPPROTO_UDP, CONST_CS|CONST_PERSISTENT);
                    263: #endif
                    264: 
                    265: #ifdef IPPROTO_ICMP
                    266:        REGISTER_LONG_CONSTANT("STREAM_IPPROTO_ICMP", IPPROTO_ICMP, CONST_CS|CONST_PERSISTENT);
                    267: #endif
                    268: 
                    269: #ifdef IPPROTO_RAW
                    270:        REGISTER_LONG_CONSTANT("STREAM_IPPROTO_RAW", IPPROTO_RAW, CONST_CS|CONST_PERSISTENT);
                    271: #endif
                    272: 
                    273:        REGISTER_LONG_CONSTANT("STREAM_SOCK_STREAM", SOCK_STREAM, CONST_CS|CONST_PERSISTENT);
                    274:        REGISTER_LONG_CONSTANT("STREAM_SOCK_DGRAM", SOCK_DGRAM, CONST_CS|CONST_PERSISTENT);
                    275: 
                    276: #ifdef SOCK_RAW
                    277:        REGISTER_LONG_CONSTANT("STREAM_SOCK_RAW", SOCK_RAW, CONST_CS|CONST_PERSISTENT);
                    278: #endif
                    279: 
                    280: #ifdef SOCK_SEQPACKET
                    281:        REGISTER_LONG_CONSTANT("STREAM_SOCK_SEQPACKET", SOCK_SEQPACKET, CONST_CS|CONST_PERSISTENT);
                    282: #endif
                    283: 
                    284: #ifdef SOCK_RDM
                    285:        REGISTER_LONG_CONSTANT("STREAM_SOCK_RDM", SOCK_RDM, CONST_CS|CONST_PERSISTENT);
                    286: #endif
                    287: 
                    288:        REGISTER_LONG_CONSTANT("STREAM_PEEK", STREAM_PEEK, CONST_CS | CONST_PERSISTENT);
                    289:        REGISTER_LONG_CONSTANT("STREAM_OOB",  STREAM_OOB, CONST_CS | CONST_PERSISTENT);
                    290: 
                    291:        REGISTER_LONG_CONSTANT("STREAM_SERVER_BIND",                    STREAM_XPORT_BIND,                                      CONST_CS | CONST_PERSISTENT);
                    292:        REGISTER_LONG_CONSTANT("STREAM_SERVER_LISTEN",                  STREAM_XPORT_LISTEN,                            CONST_CS | CONST_PERSISTENT);
                    293: 
                    294:        REGISTER_LONG_CONSTANT("FILE_USE_INCLUDE_PATH",                 PHP_FILE_USE_INCLUDE_PATH,                      CONST_CS | CONST_PERSISTENT);
                    295:        REGISTER_LONG_CONSTANT("FILE_IGNORE_NEW_LINES",                 PHP_FILE_IGNORE_NEW_LINES,                      CONST_CS | CONST_PERSISTENT);
                    296:        REGISTER_LONG_CONSTANT("FILE_SKIP_EMPTY_LINES",                 PHP_FILE_SKIP_EMPTY_LINES,                      CONST_CS | CONST_PERSISTENT);
                    297:        REGISTER_LONG_CONSTANT("FILE_APPEND",                                   PHP_FILE_APPEND,                                        CONST_CS | CONST_PERSISTENT);
                    298:        REGISTER_LONG_CONSTANT("FILE_NO_DEFAULT_CONTEXT",               PHP_FILE_NO_DEFAULT_CONTEXT,            CONST_CS | CONST_PERSISTENT);
                    299: 
                    300:        REGISTER_LONG_CONSTANT("FILE_TEXT",                                             0,                                                                      CONST_CS | CONST_PERSISTENT);
                    301:        REGISTER_LONG_CONSTANT("FILE_BINARY",                                   0,                                                                      CONST_CS | CONST_PERSISTENT);
                    302: 
                    303: #ifdef HAVE_FNMATCH
                    304:        REGISTER_LONG_CONSTANT("FNM_NOESCAPE", FNM_NOESCAPE, CONST_CS | CONST_PERSISTENT);
                    305:        REGISTER_LONG_CONSTANT("FNM_PATHNAME", FNM_PATHNAME, CONST_CS | CONST_PERSISTENT);
                    306:        REGISTER_LONG_CONSTANT("FNM_PERIOD",   FNM_PERIOD,   CONST_CS | CONST_PERSISTENT);
                    307: # ifdef FNM_CASEFOLD /* a GNU extension */ /* TODO emulate if not available */
                    308:        REGISTER_LONG_CONSTANT("FNM_CASEFOLD", FNM_CASEFOLD, CONST_CS | CONST_PERSISTENT);
                    309: # endif
                    310: #endif
                    311: 
                    312:        return SUCCESS;
                    313: }
                    314: /* }}} */
                    315: 
                    316: PHP_MSHUTDOWN_FUNCTION(file) /* {{{ */
                    317: {
                    318: #ifndef ZTS
                    319:        file_globals_dtor(&file_globals TSRMLS_CC);
                    320: #endif
                    321:        return SUCCESS;
                    322: }
                    323: /* }}} */
                    324: 
                    325: static int flock_values[] = { LOCK_SH, LOCK_EX, LOCK_UN };
                    326: 
                    327: /* {{{ proto bool flock(resource fp, int operation [, int &wouldblock])
                    328:    Portable file locking */
                    329: PHP_FUNCTION(flock)
                    330: {
                    331:        zval *arg1, *arg3 = NULL;
                    332:        int act;
                    333:        php_stream *stream;
                    334:        long operation = 0;
                    335: 
                    336:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|z", &arg1, &operation, &arg3) == FAILURE) {
                    337:                return;
                    338:        }
                    339: 
                    340:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                    341: 
                    342:        act = operation & 3;
                    343:        if (act < 1 || act > 3) {
                    344:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Illegal operation argument");
                    345:                RETURN_FALSE;
                    346:        }
                    347: 
                    348:        if (arg3 && PZVAL_IS_REF(arg3)) {
                    349:                convert_to_long_ex(&arg3);
                    350:                Z_LVAL_P(arg3) = 0;
                    351:        }
                    352: 
                    353:        /* flock_values contains all possible actions if (operation & 4) we won't block on the lock */
                    354:        act = flock_values[act - 1] | (operation & PHP_LOCK_NB ? LOCK_NB : 0);
                    355:        if (php_stream_lock(stream, act)) {
                    356:                if (operation && errno == EWOULDBLOCK && arg3 && PZVAL_IS_REF(arg3)) {
                    357:                        Z_LVAL_P(arg3) = 1;
                    358:                }
                    359:                RETURN_FALSE;
                    360:        }
                    361:        RETURN_TRUE;
                    362: }
                    363: /* }}} */
                    364: 
                    365: #define PHP_META_UNSAFE ".\\+*?[^]$() "
                    366: 
                    367: /* {{{ proto array get_meta_tags(string filename [, bool use_include_path])
                    368:    Extracts all meta tag content attributes from a file and returns an array */
                    369: PHP_FUNCTION(get_meta_tags)
                    370: {
                    371:        char *filename;
                    372:        int filename_len;
                    373:        zend_bool use_include_path = 0;
                    374:        int in_tag = 0, done = 0;
                    375:        int looking_for_val = 0, have_name = 0, have_content = 0;
                    376:        int saw_name = 0, saw_content = 0;
                    377:        char *name = NULL, *value = NULL, *temp = NULL;
                    378:        php_meta_tags_token tok, tok_last;
                    379:        php_meta_tags_data md;
                    380: 
                    381:        /* Initiailize our structure */
                    382:        memset(&md, 0, sizeof(md));
                    383: 
                    384:        /* Parse arguments */
                    385:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &filename, &filename_len, &use_include_path) == FAILURE) {
                    386:                return;
                    387:        }
                    388: 
                    389:        if (strlen(filename) != filename_len) {
                    390:                RETURN_FALSE;
                    391:        }
                    392: 
                    393:        md.stream = php_stream_open_wrapper(filename, "rb",
                    394:                        (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS,
                    395:                        NULL);
                    396:        if (!md.stream) {
                    397:                RETURN_FALSE;
                    398:        }
                    399: 
                    400:        array_init(return_value);
                    401: 
                    402:        tok_last = TOK_EOF;
                    403: 
                    404:        while (!done && (tok = php_next_meta_token(&md TSRMLS_CC)) != TOK_EOF) {
                    405:                if (tok == TOK_ID) {
                    406:                        if (tok_last == TOK_OPENTAG) {
                    407:                                md.in_meta = !strcasecmp("meta", md.token_data);
                    408:                        } else if (tok_last == TOK_SLASH && in_tag) {
                    409:                                if (strcasecmp("head", md.token_data) == 0) {
                    410:                                        /* We are done here! */
                    411:                                        done = 1;
                    412:                                }
                    413:                        } else if (tok_last == TOK_EQUAL && looking_for_val) {
                    414:                                if (saw_name) {
                    415:                                        STR_FREE(name);
                    416:                                        /* Get the NAME attr (Single word attr, non-quoted) */
                    417:                                        temp = name = estrndup(md.token_data, md.token_len);
                    418: 
                    419:                                        while (temp && *temp) {
                    420:                                                if (strchr(PHP_META_UNSAFE, *temp)) {
                    421:                                                        *temp = '_';
                    422:                                                }
                    423:                                                temp++;
                    424:                                        }
                    425: 
                    426:                                        have_name = 1;
                    427:                                } else if (saw_content) {
                    428:                                        STR_FREE(value);
                    429:                                        /* Get the CONTENT attr (Single word attr, non-quoted) */
                    430:                                        if (PG(magic_quotes_runtime)) {
                    431:                                                value = php_addslashes(md.token_data, 0, &md.token_len, 0 TSRMLS_CC);
                    432:                                        } else {
                    433:                                                value = estrndup(md.token_data, md.token_len);
                    434:                                        }
                    435: 
                    436:                                        have_content = 1;
                    437:                                }
                    438: 
                    439:                                looking_for_val = 0;
                    440:                        } else {
                    441:                                if (md.in_meta) {
                    442:                                        if (strcasecmp("name", md.token_data) == 0) {
                    443:                                                saw_name = 1;
                    444:                                                saw_content = 0;
                    445:                                                looking_for_val = 1;
                    446:                                        } else if (strcasecmp("content", md.token_data) == 0) {
                    447:                                                saw_name = 0;
                    448:                                                saw_content = 1;
                    449:                                                looking_for_val = 1;
                    450:                                        }
                    451:                                }
                    452:                        }
                    453:                } else if (tok == TOK_STRING && tok_last == TOK_EQUAL && looking_for_val) {
                    454:                        if (saw_name) {
                    455:                                STR_FREE(name);
                    456:                                /* Get the NAME attr (Quoted single/double) */
                    457:                                temp = name = estrndup(md.token_data, md.token_len);
                    458: 
                    459:                                while (temp && *temp) {
                    460:                                        if (strchr(PHP_META_UNSAFE, *temp)) {
                    461:                                                *temp = '_';
                    462:                                        }
                    463:                                        temp++;
                    464:                                }
                    465: 
                    466:                                have_name = 1;
                    467:                        } else if (saw_content) {
                    468:                                STR_FREE(value);
                    469:                                /* Get the CONTENT attr (Single word attr, non-quoted) */
                    470:                                if (PG(magic_quotes_runtime)) {
                    471:                                        value = php_addslashes(md.token_data, 0, &md.token_len, 0 TSRMLS_CC);
                    472:                                } else {
                    473:                                        value = estrndup(md.token_data, md.token_len);
                    474:                                }
                    475: 
                    476:                                have_content = 1;
                    477:                        }
                    478: 
                    479:                        looking_for_val = 0;
                    480:                } else if (tok == TOK_OPENTAG) {
                    481:                        if (looking_for_val) {
                    482:                                looking_for_val = 0;
                    483:                                have_name = saw_name = 0;
                    484:                                have_content = saw_content = 0;
                    485:                        }
                    486:                        in_tag = 1;
                    487:                } else if (tok == TOK_CLOSETAG) {
                    488:                        if (have_name) {
                    489:                                /* For BC */
                    490:                                php_strtolower(name, strlen(name));
                    491:                                if (have_content) {
                    492:                                        add_assoc_string(return_value, name, value, 1);
                    493:                                } else {
                    494:                                        add_assoc_string(return_value, name, "", 1);
                    495:                                }
                    496: 
                    497:                                efree(name);
                    498:                                STR_FREE(value);
                    499:                        } else if (have_content) {
                    500:                                efree(value);
                    501:                        }
                    502: 
                    503:                        name = value = NULL;
                    504: 
                    505:                        /* Reset all of our flags */
                    506:                        in_tag = looking_for_val = 0;
                    507:                        have_name = saw_name = 0;
                    508:                        have_content = saw_content = 0;
                    509:                        md.in_meta = 0;
                    510:                }
                    511: 
                    512:                tok_last = tok;
                    513: 
                    514:                if (md.token_data)
                    515:                        efree(md.token_data);
                    516: 
                    517:                md.token_data = NULL;
                    518:        }
                    519: 
                    520:        STR_FREE(value);
                    521:        STR_FREE(name);
                    522:        php_stream_close(md.stream);
                    523: }
                    524: /* }}} */
                    525: 
                    526: /* {{{ proto string file_get_contents(string filename [, bool use_include_path [, resource context [, long offset [, long maxlen]]]])
                    527:    Read the entire file into a string */
                    528: PHP_FUNCTION(file_get_contents)
                    529: {
                    530:        char *filename;
                    531:        int filename_len;
                    532:        char *contents;
                    533:        zend_bool use_include_path = 0;
                    534:        php_stream *stream;
                    535:        int len;
                    536:        long offset = -1;
                    537:        long maxlen = PHP_STREAM_COPY_ALL;
                    538:        zval *zcontext = NULL;
                    539:        php_stream_context *context = NULL;
                    540: 
                    541:        /* Parse arguments */
                    542:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|br!ll", &filename, &filename_len, &use_include_path, &zcontext, &offset, &maxlen) == FAILURE) {
                    543:                return;
                    544:        }
                    545: 
                    546:        if (strlen(filename) != filename_len) {
                    547:                RETURN_FALSE;
                    548:        }
                    549: 
                    550:        if (ZEND_NUM_ARGS() == 5 && maxlen < 0) {
                    551:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "length must be greater than or equal to zero");
                    552:                RETURN_FALSE;
                    553:        }
                    554: 
                    555:        context = php_stream_context_from_zval(zcontext, 0);
                    556: 
                    557:        stream = php_stream_open_wrapper_ex(filename, "rb",
                    558:                                (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS,
                    559:                                NULL, context);
                    560:        if (!stream) {
                    561:                RETURN_FALSE;
                    562:        }
                    563: 
                    564:        if (offset > 0 && php_stream_seek(stream, offset, SEEK_SET) < 0) {
                    565:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to seek to position %ld in the stream", offset);
                    566:                php_stream_close(stream);
                    567:                RETURN_FALSE;
                    568:        }
                    569: 
                    570:        if ((len = php_stream_copy_to_mem(stream, &contents, maxlen, 0)) > 0) {
                    571: 
                    572:                if (PG(magic_quotes_runtime)) {
                    573:                        contents = php_addslashes(contents, len, &len, 1 TSRMLS_CC); /* 1 = free source string */
                    574:                }
                    575: 
                    576:                RETVAL_STRINGL(contents, len, 0);
                    577:        } else if (len == 0) {
                    578:                RETVAL_EMPTY_STRING();
                    579:        } else {
                    580:                RETVAL_FALSE;
                    581:        }
                    582: 
                    583:        php_stream_close(stream);
                    584: }
                    585: /* }}} */
                    586: 
                    587: /* {{{ proto int file_put_contents(string file, mixed data [, int flags [, resource context]])
                    588:    Write/Create a file with contents data and return the number of bytes written */
                    589: PHP_FUNCTION(file_put_contents)
                    590: {
                    591:        php_stream *stream;
                    592:        char *filename;
                    593:        int filename_len;
                    594:        zval *data;
                    595:        int numbytes = 0;
                    596:        long flags = 0;
                    597:        zval *zcontext = NULL;
                    598:        php_stream_context *context = NULL;
                    599:        php_stream *srcstream = NULL;
                    600:        char mode[3] = "wb";
                    601: 
                    602:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz/|lr!", &filename, &filename_len, &data, &flags, &zcontext) == FAILURE) {
                    603:                return;
                    604:        }
                    605: 
                    606:        if (strlen(filename) != filename_len) {
                    607:                RETURN_FALSE;
                    608:        }
                    609: 
                    610:        if (Z_TYPE_P(data) == IS_RESOURCE) {
                    611:                php_stream_from_zval(srcstream, &data);
                    612:        }
                    613: 
                    614:        context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT);
                    615: 
                    616:        if (flags & PHP_FILE_APPEND) {
                    617:                mode[0] = 'a';
                    618:        } else if (flags & LOCK_EX) {
                    619:                /* check to make sure we are dealing with a regular file */
                    620:                if (php_memnstr(filename, "://", sizeof("://") - 1, filename + filename_len)) {
                    621:                        if (strncasecmp(filename, "file://", sizeof("file://") - 1)) {
                    622:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Exclusive locks may only be set for regular files");
                    623:                                RETURN_FALSE;
                    624:                        }
                    625:                }
                    626:                mode[0] = 'c';
                    627:        }
                    628:        mode[2] = '\0';
                    629: 
                    630:        stream = php_stream_open_wrapper_ex(filename, mode, ((flags & PHP_FILE_USE_INCLUDE_PATH) ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
                    631:        if (stream == NULL) {
                    632:                RETURN_FALSE;
                    633:        }
                    634: 
                    635:        if (flags & LOCK_EX && (!php_stream_supports_lock(stream) || php_stream_lock(stream, LOCK_EX))) {
                    636:                php_stream_close(stream);
                    637:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Exclusive locks are not supported for this stream");
                    638:                RETURN_FALSE;
                    639:        }
                    640: 
                    641:        if (mode[0] == 'c') {
                    642:                php_stream_truncate_set_size(stream, 0);
                    643:        }
                    644: 
                    645:        switch (Z_TYPE_P(data)) {
                    646:                case IS_RESOURCE: {
                    647:                        size_t len;
                    648:                        if (php_stream_copy_to_stream_ex(srcstream, stream, PHP_STREAM_COPY_ALL, &len) != SUCCESS) {
                    649:                                numbytes = -1;
                    650:                        } else {
                    651:                                numbytes = len;
                    652:                        }
                    653:                        break;
                    654:                }
                    655:                case IS_NULL:
                    656:                case IS_LONG:
                    657:                case IS_DOUBLE:
                    658:                case IS_BOOL:
                    659:                case IS_CONSTANT:
                    660:                        convert_to_string_ex(&data);
                    661: 
                    662:                case IS_STRING:
                    663:                        if (Z_STRLEN_P(data)) {
                    664:                                numbytes = php_stream_write(stream, Z_STRVAL_P(data), Z_STRLEN_P(data));
                    665:                                if (numbytes != Z_STRLEN_P(data)) {
                    666:                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only %d of %d bytes written, possibly out of free disk space", numbytes, Z_STRLEN_P(data));
                    667:                                        numbytes = -1;
                    668:                                }
                    669:                        }
                    670:                        break;
                    671: 
                    672:                case IS_ARRAY:
                    673:                        if (zend_hash_num_elements(Z_ARRVAL_P(data))) {
                    674:                                int bytes_written;
                    675:                                zval **tmp;
                    676:                                HashPosition pos;
                    677: 
                    678:                                zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(data), &pos);
                    679:                                while (zend_hash_get_current_data_ex(Z_ARRVAL_P(data), (void **) &tmp, &pos) == SUCCESS) {
                    680:                                        if (Z_TYPE_PP(tmp) != IS_STRING) {
                    681:                                                SEPARATE_ZVAL(tmp);
                    682:                                                convert_to_string(*tmp);
                    683:                                        }
                    684:                                        if (Z_STRLEN_PP(tmp)) {
                    685:                                                numbytes += Z_STRLEN_PP(tmp);
                    686:                                                bytes_written = php_stream_write(stream, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
                    687:                                                if (bytes_written < 0 || bytes_written != Z_STRLEN_PP(tmp)) {
                    688:                                                        if (bytes_written < 0) {
                    689:                                                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to write %d bytes to %s", Z_STRLEN_PP(tmp), filename);
                    690:                                                        } else {
                    691:                                                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only %d of %d bytes written, possibly out of free disk space", bytes_written, Z_STRLEN_PP(tmp));
                    692:                                                        }
                    693:                                                        numbytes = -1;
                    694:                                                        break;
                    695:                                                }
                    696:                                        }
                    697:                                        zend_hash_move_forward_ex(Z_ARRVAL_P(data), &pos);
                    698:                                }
                    699:                        }
                    700:                        break;
                    701: 
                    702:                case IS_OBJECT:
                    703:                        if (Z_OBJ_HT_P(data) != NULL) {
                    704:                                zval out;
                    705: 
                    706:                                if (zend_std_cast_object_tostring(data, &out, IS_STRING TSRMLS_CC) == SUCCESS) {
                    707:                                        numbytes = php_stream_write(stream, Z_STRVAL(out), Z_STRLEN(out));
                    708:                                        if (numbytes != Z_STRLEN(out)) {
                    709:                                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Only %d of %d bytes written, possibly out of free disk space", numbytes, Z_STRLEN(out));
                    710:                                                numbytes = -1;
                    711:                                        }
                    712:                                        zval_dtor(&out);
                    713:                                        break;
                    714:                                }
                    715:                        }
                    716:                default:
                    717:                        numbytes = -1;
                    718:                        break;
                    719:        }
                    720:        php_stream_close(stream);
                    721: 
                    722:        if (numbytes < 0) {
                    723:                RETURN_FALSE;
                    724:        }
                    725: 
                    726:        RETURN_LONG(numbytes);
                    727: }
                    728: /* }}} */
                    729: 
                    730: #define PHP_FILE_BUF_SIZE      80
                    731: 
                    732: /* {{{ proto array file(string filename [, int flags[, resource context]])
                    733:    Read entire file into an array */
                    734: PHP_FUNCTION(file)
                    735: {
                    736:        char *filename;
                    737:        int filename_len;
                    738:        char *slashed, *target_buf=NULL, *p, *s, *e;
                    739:        register int i = 0;
                    740:        int target_len, len;
                    741:        char eol_marker = '\n';
                    742:        long flags = 0;
                    743:        zend_bool use_include_path;
                    744:        zend_bool include_new_line;
                    745:        zend_bool skip_blank_lines;
                    746:        php_stream *stream;
                    747:        zval *zcontext = NULL;
                    748:        php_stream_context *context = NULL;
                    749: 
                    750:        /* Parse arguments */
                    751:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lr!", &filename, &filename_len, &flags, &zcontext) == FAILURE) {
                    752:                return;
                    753:        }
                    754: 
                    755:        if (strlen(filename) != filename_len) {
                    756:                RETURN_FALSE;
                    757:        }
                    758: 
                    759:        if (flags < 0 || flags > (PHP_FILE_USE_INCLUDE_PATH | PHP_FILE_IGNORE_NEW_LINES | PHP_FILE_SKIP_EMPTY_LINES | PHP_FILE_NO_DEFAULT_CONTEXT)) {
                    760:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%ld' flag is not supported", flags);
                    761:                RETURN_FALSE;
                    762:        }
                    763: 
                    764:        use_include_path = flags & PHP_FILE_USE_INCLUDE_PATH;
                    765:        include_new_line = !(flags & PHP_FILE_IGNORE_NEW_LINES);
                    766:        skip_blank_lines = flags & PHP_FILE_SKIP_EMPTY_LINES;
                    767: 
                    768:        context = php_stream_context_from_zval(zcontext, flags & PHP_FILE_NO_DEFAULT_CONTEXT);
                    769: 
                    770:        stream = php_stream_open_wrapper_ex(filename, "rb", (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
                    771:        if (!stream) {
                    772:                RETURN_FALSE;
                    773:        }
                    774: 
                    775:        /* Initialize return array */
                    776:        array_init(return_value);
                    777: 
                    778:        if ((target_len = php_stream_copy_to_mem(stream, &target_buf, PHP_STREAM_COPY_ALL, 0))) {
                    779:                s = target_buf;
                    780:                e = target_buf + target_len;
                    781: 
                    782:                if (!(p = php_stream_locate_eol(stream, target_buf, target_len TSRMLS_CC))) {
                    783:                        p = e;
                    784:                        goto parse_eol;
                    785:                }
                    786: 
                    787:                if (stream->flags & PHP_STREAM_FLAG_EOL_MAC) {
                    788:                        eol_marker = '\r';
                    789:                }
                    790: 
                    791:                /* for performance reasons the code is duplicated, so that the if (include_new_line)
                    792:                 * will not need to be done for every single line in the file. */
                    793:                if (include_new_line) {
                    794:                        do {
                    795:                                p++;
                    796: parse_eol:
                    797:                                if (PG(magic_quotes_runtime)) {
                    798:                                        /* s is in target_buf which is freed at the end of the function */
                    799:                                        slashed = php_addslashes(s, (p-s), &len, 0 TSRMLS_CC);
                    800:                                        add_index_stringl(return_value, i++, slashed, len, 0);
                    801:                                } else {
                    802:                                        add_index_stringl(return_value, i++, estrndup(s, p-s), p-s, 0);
                    803:                                }
                    804:                                s = p;
                    805:                        } while ((p = memchr(p, eol_marker, (e-p))));
                    806:                } else {
                    807:                        do {
                    808:                                int windows_eol = 0;
                    809:                                if (p != target_buf && eol_marker == '\n' && *(p - 1) == '\r') {
                    810:                                        windows_eol++;
                    811:                                }
                    812:                                if (skip_blank_lines && !(p-s-windows_eol)) {
                    813:                                        s = ++p;
                    814:                                        continue;
                    815:                                }
                    816:                                if (PG(magic_quotes_runtime)) {
                    817:                                        /* s is in target_buf which is freed at the end of the function */
                    818:                                        slashed = php_addslashes(s, (p-s-windows_eol), &len, 0 TSRMLS_CC);
                    819:                                        add_index_stringl(return_value, i++, slashed, len, 0);
                    820:                                } else {
                    821:                                        add_index_stringl(return_value, i++, estrndup(s, p-s-windows_eol), p-s-windows_eol, 0);
                    822:                                }
                    823:                                s = ++p;
                    824:                        } while ((p = memchr(p, eol_marker, (e-p))));
                    825:                }
                    826: 
                    827:                /* handle any left overs of files without new lines */
                    828:                if (s != e) {
                    829:                        p = e;
                    830:                        goto parse_eol;
                    831:                }
                    832:        }
                    833: 
                    834:        if (target_buf) {
                    835:                efree(target_buf);
                    836:        }
                    837:        php_stream_close(stream);
                    838: }
                    839: /* }}} */
                    840: 
                    841: /* {{{ proto string tempnam(string dir, string prefix)
                    842:    Create a unique filename in a directory */
                    843: PHP_FUNCTION(tempnam)
                    844: {
                    845:        char *dir, *prefix;
                    846:        int dir_len, prefix_len;
                    847:        size_t p_len;
                    848:        char *opened_path;
                    849:        char *p;
                    850:        int fd;
                    851: 
                    852:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dir, &dir_len, &prefix, &prefix_len) == FAILURE) {
                    853:                return;
                    854:        }
                    855: 
                    856:        if (strlen(dir) != dir_len) {
                    857:                RETURN_FALSE;
                    858:        }
                    859: 
                    860:        if (strlen(prefix) != prefix_len) {
                    861:                RETURN_FALSE;
                    862:        }
                    863: 
                    864:        if (PG(safe_mode) &&(!php_checkuid(dir, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
                    865:                RETURN_FALSE;
                    866:        }
                    867: 
                    868:        if (php_check_open_basedir(dir TSRMLS_CC)) {
                    869:                RETURN_FALSE;
                    870:        }
                    871: 
                    872:        php_basename(prefix, prefix_len, NULL, 0, &p, &p_len TSRMLS_CC);
                    873:        if (p_len > 64) {
                    874:                p[63] = '\0';
                    875:        }
                    876:        
                    877:        RETVAL_FALSE;
                    878: 
                    879:        if ((fd = php_open_temporary_fd_ex(dir, p, &opened_path, 1 TSRMLS_CC)) >= 0) {
                    880:                close(fd);
                    881:                RETVAL_STRING(opened_path, 0);
                    882:        }
                    883:        efree(p);
                    884: }
                    885: /* }}} */
                    886: 
                    887: /* {{{ proto resource tmpfile(void)
                    888:    Create a temporary file that will be deleted automatically after use */
                    889: PHP_NAMED_FUNCTION(php_if_tmpfile)
                    890: {
                    891:        php_stream *stream;
                    892: 
                    893:        if (zend_parse_parameters_none() == FAILURE) {
                    894:                return;
                    895:        }
                    896: 
                    897:        stream = php_stream_fopen_tmpfile();
                    898: 
                    899:        if (stream) {
                    900:                php_stream_to_zval(stream, return_value);
                    901:        } else {
                    902:                RETURN_FALSE;
                    903:        }
                    904: }
                    905: /* }}} */
                    906: 
                    907: /* {{{ proto resource fopen(string filename, string mode [, bool use_include_path [, resource context]])
                    908:    Open a file or a URL and return a file pointer */
                    909: PHP_NAMED_FUNCTION(php_if_fopen)
                    910: {
                    911:        char *filename, *mode;
                    912:        int filename_len, mode_len;
                    913:        zend_bool use_include_path = 0;
                    914:        zval *zcontext = NULL;
                    915:        php_stream *stream;
                    916:        php_stream_context *context = NULL;
                    917: 
                    918:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|br", &filename, &filename_len, &mode, &mode_len, &use_include_path, &zcontext) == FAILURE) {
                    919:                RETURN_FALSE;
                    920:        }
                    921: 
                    922:        if (strlen(filename) != filename_len) {
                    923:                RETURN_FALSE;
                    924:        }
                    925: 
                    926:        context = php_stream_context_from_zval(zcontext, 0);
                    927: 
                    928:        stream = php_stream_open_wrapper_ex(filename, mode, (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
                    929: 
                    930:        if (stream == NULL) {
                    931:                RETURN_FALSE;
                    932:        }
                    933: 
                    934:        php_stream_to_zval(stream, return_value);
                    935: }
                    936: /* }}} */
                    937: 
                    938: /* {{{ proto bool fclose(resource fp)
                    939:    Close an open file pointer */
                    940: PHPAPI PHP_FUNCTION(fclose)
                    941: {
                    942:        zval *arg1;
                    943:        php_stream *stream;
                    944: 
                    945:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) {
                    946:                RETURN_FALSE;
                    947:        }
                    948: 
                    949:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                    950: 
                    951:        if ((stream->flags & PHP_STREAM_FLAG_NO_FCLOSE) != 0) {
                    952:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%d is not a valid stream resource", stream->rsrc_id);
                    953:                RETURN_FALSE;
                    954:        }
                    955: 
                    956:        if (!stream->is_persistent) {
                    957:                zend_list_delete(stream->rsrc_id);
                    958:        } else {
                    959:                php_stream_pclose(stream);
                    960:        }
                    961: 
                    962:        RETURN_TRUE;
                    963: }
                    964: /* }}} */
                    965: 
                    966: /* {{{ proto resource popen(string command, string mode)
                    967:    Execute a command and open either a read or a write pipe to it */
                    968: PHP_FUNCTION(popen)
                    969: {
                    970:        char *command, *mode;
                    971:        int command_len, mode_len;
                    972:        FILE *fp;
                    973:        php_stream *stream;
                    974:        char *posix_mode, *b, *buf = 0, *tmp;
                    975: 
                    976:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &command, &command_len, &mode, &mode_len) == FAILURE) {
                    977:                return;
                    978:        }
                    979: 
                    980:        posix_mode = estrndup(mode, mode_len);
                    981: #ifndef PHP_WIN32
                    982:        {
                    983:                char *z = memchr(posix_mode, 'b', mode_len);
                    984:                if (z) {
                    985:                        memmove(z, z + 1, mode_len - (z - posix_mode));
                    986:                }
                    987:        }
                    988: #endif
                    989:        if (PG(safe_mode)){
                    990:                b = strchr(command, ' ');
                    991:                if (!b) {
                    992:                        b = strrchr(command, '/');
                    993:                } else {
                    994:                        char *c;
                    995: 
                    996:                        c = command;
                    997:                        while((*b != '/') && (b != c)) {
                    998:                                b--;
                    999:                        }
                   1000:                        if (b == c) {
                   1001:                                b = NULL;
                   1002:                        }
                   1003:                }
                   1004: 
                   1005:                if (b) {
                   1006:                        spprintf(&buf, 0, "%s%s", PG(safe_mode_exec_dir), b);
                   1007:                } else {
                   1008:                        spprintf(&buf, 0, "%s/%s", PG(safe_mode_exec_dir), command);
                   1009:                }
                   1010: 
                   1011:                tmp = php_escape_shell_cmd(buf);
                   1012:                fp = VCWD_POPEN(tmp, posix_mode);
                   1013:                efree(tmp);
                   1014: 
                   1015:                if (!fp) {
                   1016:                        php_error_docref2(NULL TSRMLS_CC, buf, posix_mode, E_WARNING, "%s", strerror(errno));
                   1017:                        efree(posix_mode);
                   1018:                        efree(buf);
                   1019:                        RETURN_FALSE;
                   1020:                }
                   1021: 
                   1022:                efree(buf);
                   1023: 
                   1024:        } else {
                   1025:                fp = VCWD_POPEN(command, posix_mode);
                   1026:                if (!fp) {
                   1027:                        php_error_docref2(NULL TSRMLS_CC, command, posix_mode, E_WARNING, "%s", strerror(errno));
                   1028:                        efree(posix_mode);
                   1029:                        RETURN_FALSE;
                   1030:                }
                   1031:        }
                   1032:        stream = php_stream_fopen_from_pipe(fp, mode);
                   1033: 
                   1034:        if (stream == NULL)     {
                   1035:                php_error_docref2(NULL TSRMLS_CC, command, mode, E_WARNING, "%s", strerror(errno));
                   1036:                RETVAL_FALSE;
                   1037:        } else {
                   1038:                php_stream_to_zval(stream, return_value);
                   1039:        }
                   1040: 
                   1041:        efree(posix_mode);
                   1042: }
                   1043: /* }}} */
                   1044: 
                   1045: /* {{{ proto int pclose(resource fp)
                   1046:    Close a file pointer opened by popen() */
                   1047: PHP_FUNCTION(pclose)
                   1048: {
                   1049:        zval *arg1;
                   1050:        php_stream *stream;
                   1051: 
                   1052:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) {
                   1053:                RETURN_FALSE;
                   1054:        }
                   1055: 
                   1056:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1057: 
                   1058:        zend_list_delete(stream->rsrc_id);
                   1059:        RETURN_LONG(FG(pclose_ret));
                   1060: }
                   1061: /* }}} */
                   1062: 
                   1063: /* {{{ proto bool feof(resource fp)
                   1064:    Test for end-of-file on a file pointer */
                   1065: PHPAPI PHP_FUNCTION(feof)
                   1066: {
                   1067:        zval *arg1;
                   1068:        php_stream *stream;
                   1069: 
                   1070:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) {
                   1071:                RETURN_FALSE;
                   1072:        }
                   1073: 
                   1074:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1075: 
                   1076:        if (php_stream_eof(stream)) {
                   1077:                RETURN_TRUE;
                   1078:        } else {
                   1079:                RETURN_FALSE;
                   1080:        }
                   1081: }
                   1082: /* }}} */
                   1083: 
                   1084: /* {{{ proto string fgets(resource fp[, int length])
                   1085:    Get a line from file pointer */
                   1086: PHPAPI PHP_FUNCTION(fgets)
                   1087: {
                   1088:        zval *arg1;
                   1089:        long len = 1024;
                   1090:        char *buf = NULL;
                   1091:        int argc = ZEND_NUM_ARGS();
                   1092:        size_t line_len = 0;
                   1093:        php_stream *stream;
                   1094: 
                   1095:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|l", &arg1, &len) == FAILURE) {
                   1096:                RETURN_FALSE;
                   1097:        }
                   1098: 
                   1099:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1100: 
                   1101:        if (argc == 1) {
                   1102:                /* ask streams to give us a buffer of an appropriate size */
                   1103:                buf = php_stream_get_line(stream, NULL, 0, &line_len);
                   1104:                if (buf == NULL) {
                   1105:                        goto exit_failed;
                   1106:                }
                   1107:        } else if (argc > 1) {
                   1108:                if (len <= 0) {
                   1109:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0");
                   1110:                        RETURN_FALSE;
                   1111:                }
                   1112: 
                   1113:                buf = ecalloc(len + 1, sizeof(char));
                   1114:                if (php_stream_get_line(stream, buf, len, &line_len) == NULL) {
                   1115:                        goto exit_failed;
                   1116:                }
                   1117:        }
                   1118: 
                   1119:        if (PG(magic_quotes_runtime)) {
                   1120:                Z_STRVAL_P(return_value) = php_addslashes(buf, line_len, &Z_STRLEN_P(return_value), 1 TSRMLS_CC);
                   1121:                Z_TYPE_P(return_value) = IS_STRING;
                   1122:        } else {
                   1123:                ZVAL_STRINGL(return_value, buf, line_len, 0);
                   1124:                /* resize buffer if it's much larger than the result.
                   1125:                 * Only needed if the user requested a buffer size. */
                   1126:                if (argc > 1 && Z_STRLEN_P(return_value) < len / 2) {
                   1127:                        Z_STRVAL_P(return_value) = erealloc(buf, line_len + 1);
                   1128:                }
                   1129:        }
                   1130:        return;
                   1131: 
                   1132: exit_failed:
                   1133:        RETVAL_FALSE;
                   1134:        if (buf) {
                   1135:                efree(buf);
                   1136:        }
                   1137: }
                   1138: /* }}} */
                   1139: 
                   1140: /* {{{ proto string fgetc(resource fp)
                   1141:    Get a character from file pointer */
                   1142: PHPAPI PHP_FUNCTION(fgetc)
                   1143: {
                   1144:        zval *arg1;
                   1145:        char buf[2];
                   1146:        int result;
                   1147:        php_stream *stream;
                   1148: 
                   1149:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) {
                   1150:                RETURN_FALSE;
                   1151:        }
                   1152: 
                   1153:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1154: 
                   1155:        result = php_stream_getc(stream);
                   1156: 
                   1157:        if (result == EOF) {
                   1158:                RETVAL_FALSE;
                   1159:        } else {
                   1160:                buf[0] = result;
                   1161:                buf[1] = '\0';
                   1162: 
                   1163:                RETURN_STRINGL(buf, 1, 1);
                   1164:        }
                   1165: }
                   1166: /* }}} */
                   1167: 
                   1168: /* {{{ proto string fgetss(resource fp [, int length [, string allowable_tags]])
                   1169:    Get a line from file pointer and strip HTML tags */
                   1170: PHPAPI PHP_FUNCTION(fgetss)
                   1171: {
                   1172:        zval *fd;
                   1173:        long bytes = 0;
                   1174:        size_t len = 0;
                   1175:        size_t actual_len, retval_len;
                   1176:        char *buf = NULL, *retval;
                   1177:        php_stream *stream;
                   1178:        char *allowed_tags=NULL;
                   1179:        int allowed_tags_len=0;
                   1180: 
                   1181:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|ls", &fd, &bytes, &allowed_tags, &allowed_tags_len) == FAILURE) {
                   1182:                RETURN_FALSE;
                   1183:        }
                   1184: 
                   1185:        PHP_STREAM_TO_ZVAL(stream, &fd);
                   1186: 
                   1187:        if (ZEND_NUM_ARGS() >= 2) {
                   1188:                if (bytes <= 0) {
                   1189:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0");
                   1190:                        RETURN_FALSE;
                   1191:                }
                   1192: 
                   1193:                len = (size_t) bytes;
                   1194:                buf = safe_emalloc(sizeof(char), (len + 1), 0);
                   1195:                /*needed because recv doesnt set null char at end*/
                   1196:                memset(buf, 0, len + 1);
                   1197:        }
                   1198: 
                   1199:        if ((retval = php_stream_get_line(stream, buf, len, &actual_len)) == NULL)      {
                   1200:                if (buf != NULL) {
                   1201:                        efree(buf);
                   1202:                }
                   1203:                RETURN_FALSE;
                   1204:        }
                   1205: 
                   1206:        retval_len = php_strip_tags(retval, actual_len, &stream->fgetss_state, allowed_tags, allowed_tags_len);
                   1207: 
                   1208:        RETURN_STRINGL(retval, retval_len, 0);
                   1209: }
                   1210: /* }}} */
                   1211: 
                   1212: /* {{{ proto mixed fscanf(resource stream, string format [, string ...])
                   1213:    Implements a mostly ANSI compatible fscanf() */
                   1214: PHP_FUNCTION(fscanf)
                   1215: {
                   1216:        int result, format_len, type, argc = 0;
                   1217:        zval ***args = NULL;
                   1218:        zval *file_handle;
                   1219:        char *buf, *format;
                   1220:        size_t len;
                   1221:        void *what;
                   1222: 
                   1223:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs*", &file_handle, &format, &format_len, &args, &argc) == FAILURE) {
                   1224:                return;
                   1225:        }
                   1226: 
                   1227:        what = zend_fetch_resource(&file_handle TSRMLS_CC, -1, "File-Handle", &type, 2, php_file_le_stream(), php_file_le_pstream());
                   1228: 
                   1229:        /* we can't do a ZEND_VERIFY_RESOURCE(what), otherwise we end up
                   1230:         * with a leak if we have an invalid filehandle. This needs changing
                   1231:         * if the code behind ZEND_VERIFY_RESOURCE changed. - cc */
                   1232:        if (!what) {
                   1233:                if (args) {
                   1234:                        efree(args);
                   1235:                }
                   1236:                RETURN_FALSE;
                   1237:        }
                   1238: 
                   1239:        buf = php_stream_get_line((php_stream *) what, NULL, 0, &len);
                   1240:        if (buf == NULL) {
                   1241:                if (args) {
                   1242:                        efree(args);
                   1243:                }
                   1244:                RETURN_FALSE;
                   1245:        }
                   1246: 
                   1247:        result = php_sscanf_internal(buf, format, argc, args, 0, &return_value TSRMLS_CC);
                   1248: 
                   1249:        if (args) {
                   1250:                efree(args);
                   1251:        }
                   1252:        efree(buf);
                   1253: 
                   1254:        if (SCAN_ERROR_WRONG_PARAM_COUNT == result) {
                   1255:                WRONG_PARAM_COUNT;
                   1256:        }
                   1257: }
                   1258: /* }}} */
                   1259: 
                   1260: /* {{{ proto int fwrite(resource fp, string str [, int length])
                   1261:    Binary-safe file write */
                   1262: PHPAPI PHP_FUNCTION(fwrite)
                   1263: {
                   1264:        zval *arg1;
                   1265:        char *arg2;
                   1266:        int arg2len;
                   1267:        int ret;
                   1268:        int num_bytes;
                   1269:        long arg3 = 0;
                   1270:        char *buffer = NULL;
                   1271:        php_stream *stream;
                   1272: 
                   1273:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|l", &arg1, &arg2, &arg2len, &arg3) == FAILURE) {
                   1274:                RETURN_FALSE;
                   1275:        }
                   1276: 
                   1277:        if (ZEND_NUM_ARGS() == 2) {
                   1278:                num_bytes = arg2len;
                   1279:        } else {
                   1280:                num_bytes = MAX(0, MIN((int)arg3, arg2len));
                   1281:        }
                   1282: 
                   1283:        if (!num_bytes) {
                   1284:                RETURN_LONG(0);
                   1285:        }
                   1286: 
                   1287:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1288: 
                   1289:        if (PG(magic_quotes_runtime)) {
                   1290:                buffer = estrndup(arg2, num_bytes);
                   1291:                php_stripslashes(buffer, &num_bytes TSRMLS_CC);
                   1292:        }
                   1293: 
                   1294:        ret = php_stream_write(stream, buffer ? buffer : arg2, num_bytes);
                   1295:        if (buffer) {
                   1296:                efree(buffer);
                   1297:        }
                   1298: 
                   1299:        RETURN_LONG(ret);
                   1300: }
                   1301: /* }}} */
                   1302: 
                   1303: /* {{{ proto bool fflush(resource fp)
                   1304:    Flushes output */
                   1305: PHPAPI PHP_FUNCTION(fflush)
                   1306: {
                   1307:        zval *arg1;
                   1308:        int ret;
                   1309:        php_stream *stream;
                   1310: 
                   1311:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) {
                   1312:                RETURN_FALSE;
                   1313:        }
                   1314: 
                   1315:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1316: 
                   1317:        ret = php_stream_flush(stream);
                   1318:        if (ret) {
                   1319:                RETURN_FALSE;
                   1320:        }
                   1321:        RETURN_TRUE;
                   1322: }
                   1323: /* }}} */
                   1324: 
                   1325: /* {{{ proto bool rewind(resource fp)
                   1326:    Rewind the position of a file pointer */
                   1327: PHPAPI PHP_FUNCTION(rewind)
                   1328: {
                   1329:        zval *arg1;
                   1330:        php_stream *stream;
                   1331: 
                   1332:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) {
                   1333:                RETURN_FALSE;
                   1334:        }
                   1335: 
                   1336:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1337: 
                   1338:        if (-1 == php_stream_rewind(stream)) {
                   1339:                RETURN_FALSE;
                   1340:        }
                   1341:        RETURN_TRUE;
                   1342: }
                   1343: /* }}} */
                   1344: 
                   1345: /* {{{ proto int ftell(resource fp)
                   1346:    Get file pointer's read/write position */
                   1347: PHPAPI PHP_FUNCTION(ftell)
                   1348: {
                   1349:        zval *arg1;
                   1350:        long ret;
                   1351:        php_stream *stream;
                   1352: 
                   1353:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) {
                   1354:                RETURN_FALSE;
                   1355:        }
                   1356: 
                   1357:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1358: 
                   1359:        ret = php_stream_tell(stream);
                   1360:        if (ret == -1)  {
                   1361:                RETURN_FALSE;
                   1362:        }
                   1363:        RETURN_LONG(ret);
                   1364: }
                   1365: /* }}} */
                   1366: 
                   1367: /* {{{ proto int fseek(resource fp, int offset [, int whence])
                   1368:    Seek on a file pointer */
                   1369: PHPAPI PHP_FUNCTION(fseek)
                   1370: {
                   1371:        zval *arg1;
                   1372:        long arg2, whence = SEEK_SET;
                   1373:        php_stream *stream;
                   1374: 
                   1375:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl|l", &arg1, &arg2, &whence) == FAILURE) {
                   1376:                RETURN_FALSE;
                   1377:        }
                   1378: 
                   1379:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1380: 
                   1381:        RETURN_LONG(php_stream_seek(stream, arg2, whence));
                   1382: }
                   1383: /* }}} */
                   1384: 
                   1385: /* {{{ php_mkdir
                   1386: */
                   1387: 
                   1388: /* DEPRECATED APIs: Use php_stream_mkdir() instead */
                   1389: PHPAPI int php_mkdir_ex(char *dir, long mode, int options TSRMLS_DC)
                   1390: {
                   1391:        int ret;
                   1392: 
                   1393:        if (PG(safe_mode) && (!php_checkuid(dir, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
                   1394:                return -1;
                   1395:        }
                   1396: 
                   1397:        if (php_check_open_basedir(dir TSRMLS_CC)) {
                   1398:                return -1;
                   1399:        }
                   1400: 
                   1401:        if ((ret = VCWD_MKDIR(dir, (mode_t)mode)) < 0 && (options & REPORT_ERRORS)) {
                   1402:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
                   1403:        }
                   1404: 
                   1405:        return ret;
                   1406: }
                   1407: 
                   1408: PHPAPI int php_mkdir(char *dir, long mode TSRMLS_DC)
                   1409: {
                   1410:        return php_mkdir_ex(dir, mode, REPORT_ERRORS TSRMLS_CC);
                   1411: }
                   1412: /* }}} */
                   1413: 
                   1414: /* {{{ proto bool mkdir(string pathname [, int mode [, bool recursive [, resource context]]])
                   1415:    Create a directory */
                   1416: PHP_FUNCTION(mkdir)
                   1417: {
                   1418:        char *dir;
                   1419:        int dir_len;
                   1420:        zval *zcontext = NULL;
                   1421:        long mode = 0777;
                   1422:        zend_bool recursive = 0;
                   1423:        php_stream_context *context;
                   1424: 
                   1425:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lbr", &dir, &dir_len, &mode, &recursive, &zcontext) == FAILURE) {
                   1426:                RETURN_FALSE;
                   1427:        }
                   1428: 
                   1429:        if (strlen(dir) != dir_len) {
                   1430:                RETURN_FALSE;
                   1431:        }
                   1432: 
                   1433:        context = php_stream_context_from_zval(zcontext, 0);
                   1434: 
                   1435:        RETURN_BOOL(php_stream_mkdir(dir, mode, (recursive ? PHP_STREAM_MKDIR_RECURSIVE : 0) | REPORT_ERRORS, context));
                   1436: }
                   1437: /* }}} */
                   1438: 
                   1439: /* {{{ proto bool rmdir(string dirname[, resource context])
                   1440:    Remove a directory */
                   1441: PHP_FUNCTION(rmdir)
                   1442: {
                   1443:        char *dir;
                   1444:        int dir_len;
                   1445:        zval *zcontext = NULL;
                   1446:        php_stream_context *context;
                   1447: 
                   1448:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &dir, &dir_len, &zcontext) == FAILURE) {
                   1449:                RETURN_FALSE;
                   1450:        }
                   1451: 
                   1452:        if (strlen(dir) != dir_len) {
                   1453:                RETURN_FALSE;
                   1454:        }
                   1455: 
                   1456:        context = php_stream_context_from_zval(zcontext, 0);
                   1457: 
                   1458:        RETURN_BOOL(php_stream_rmdir(dir, REPORT_ERRORS, context));
                   1459: }
                   1460: /* }}} */
                   1461: 
                   1462: /* {{{ proto int readfile(string filename [, bool use_include_path[, resource context]])
                   1463:    Output a file or a URL */
                   1464: PHP_FUNCTION(readfile)
                   1465: {
                   1466:        char *filename;
                   1467:        int filename_len;
                   1468:        int size = 0;
                   1469:        zend_bool use_include_path = 0;
                   1470:        zval *zcontext = NULL;
                   1471:        php_stream *stream;
                   1472:        php_stream_context *context = NULL;
                   1473: 
                   1474:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|br!", &filename, &filename_len, &use_include_path, &zcontext) == FAILURE) {
                   1475:                RETURN_FALSE;
                   1476:        }
                   1477: 
                   1478:        if (strlen(filename) != filename_len) {
                   1479:                RETURN_FALSE;
                   1480:        }
                   1481: 
                   1482:        context = php_stream_context_from_zval(zcontext, 0);
                   1483: 
                   1484:        stream = php_stream_open_wrapper_ex(filename, "rb", (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
                   1485:        if (stream) {
                   1486:                size = php_stream_passthru(stream);
                   1487:                php_stream_close(stream);
                   1488:                RETURN_LONG(size);
                   1489:        }
                   1490: 
                   1491:        RETURN_FALSE;
                   1492: }
                   1493: /* }}} */
                   1494: 
                   1495: /* {{{ proto int umask([int mask])
                   1496:    Return or change the umask */
                   1497: PHP_FUNCTION(umask)
                   1498: {
                   1499:        long arg1 = 0;
                   1500:        int oldumask;
                   1501:        
                   1502:        oldumask = umask(077);
                   1503: 
                   1504:        if (BG(umask) == -1) {
                   1505:                BG(umask) = oldumask;
                   1506:        }
                   1507:        
                   1508:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &arg1) == FAILURE) {
                   1509:                RETURN_FALSE;
                   1510:        }
                   1511: 
                   1512:        if (ZEND_NUM_ARGS() == 0) {
                   1513:                umask(oldumask);
                   1514:        } else {
                   1515:                umask(arg1);
                   1516:        }
                   1517: 
                   1518:        RETURN_LONG(oldumask);
                   1519: }
                   1520: /* }}} */
                   1521: 
                   1522: /* {{{ proto int fpassthru(resource fp)
                   1523:    Output all remaining data from a file pointer */
                   1524: PHPAPI PHP_FUNCTION(fpassthru)
                   1525: {
                   1526:        zval *arg1;
                   1527:        int size;
                   1528:        php_stream *stream;
                   1529: 
                   1530:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) {
                   1531:                RETURN_FALSE;
                   1532:        }
                   1533: 
                   1534:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1535: 
                   1536:        size = php_stream_passthru(stream);
                   1537:        RETURN_LONG(size);
                   1538: }
                   1539: /* }}} */
                   1540: 
                   1541: /* {{{ proto bool rename(string old_name, string new_name[, resource context])
                   1542:    Rename a file */
                   1543: PHP_FUNCTION(rename)
                   1544: {
                   1545:        char *old_name, *new_name;
                   1546:        int old_name_len, new_name_len;
                   1547:        zval *zcontext = NULL;
                   1548:        php_stream_wrapper *wrapper;
                   1549:        php_stream_context *context;
                   1550: 
                   1551:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|r", &old_name, &old_name_len, &new_name, &new_name_len, &zcontext) == FAILURE) {
                   1552:                RETURN_FALSE;
                   1553:        }
                   1554: 
                   1555:        if (strlen(old_name) != old_name_len) {
                   1556:                RETURN_FALSE;
                   1557:        }
                   1558: 
                   1559:        if (strlen(new_name) != new_name_len) {
                   1560:                RETURN_FALSE;
                   1561:        }
                   1562: 
                   1563:        wrapper = php_stream_locate_url_wrapper(old_name, NULL, 0 TSRMLS_CC);
                   1564: 
                   1565:        if (!wrapper || !wrapper->wops) {
                   1566:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate stream wrapper");
                   1567:                RETURN_FALSE;
                   1568:        }
                   1569: 
                   1570:        if (!wrapper->wops->rename) {
                   1571:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s wrapper does not support renaming", wrapper->wops->label ? wrapper->wops->label : "Source");
                   1572:                RETURN_FALSE;
                   1573:        }
                   1574: 
                   1575:        if (wrapper != php_stream_locate_url_wrapper(new_name, NULL, 0 TSRMLS_CC)) {
                   1576:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot rename a file across wrapper types");
                   1577:                RETURN_FALSE;
                   1578:        }
                   1579: 
                   1580:        context = php_stream_context_from_zval(zcontext, 0);
                   1581: 
                   1582:        RETURN_BOOL(wrapper->wops->rename(wrapper, old_name, new_name, 0, context TSRMLS_CC));
                   1583: }
                   1584: /* }}} */
                   1585: 
                   1586: /* {{{ proto bool unlink(string filename[, context context])
                   1587:    Delete a file */
                   1588: PHP_FUNCTION(unlink)
                   1589: {
                   1590:        char *filename;
                   1591:        int filename_len;
                   1592:        php_stream_wrapper *wrapper;
                   1593:        zval *zcontext = NULL;
                   1594:        php_stream_context *context = NULL;
                   1595: 
                   1596:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|r", &filename, &filename_len, &zcontext) == FAILURE) {
                   1597:                RETURN_FALSE;
                   1598:        }
                   1599: 
                   1600:        if (strlen(filename) != filename_len) {
                   1601:                RETURN_FALSE;
                   1602:        }
                   1603: 
                   1604:        context = php_stream_context_from_zval(zcontext, 0);
                   1605: 
                   1606:        wrapper = php_stream_locate_url_wrapper(filename, NULL, 0 TSRMLS_CC);
                   1607: 
                   1608:        if (!wrapper || !wrapper->wops) {
                   1609:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to locate stream wrapper");
                   1610:                RETURN_FALSE;
                   1611:        }
                   1612: 
                   1613:        if (!wrapper->wops->unlink) {
                   1614:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s does not allow unlinking", wrapper->wops->label ? wrapper->wops->label : "Wrapper");
                   1615:                RETURN_FALSE;
                   1616:        }
                   1617:        RETURN_BOOL(wrapper->wops->unlink(wrapper, filename, ENFORCE_SAFE_MODE | REPORT_ERRORS, context TSRMLS_CC));
                   1618: }
                   1619: /* }}} */
                   1620: 
                   1621: /* {{{ proto bool ftruncate(resource fp, int size)
                   1622:    Truncate file to 'size' length */
                   1623: PHP_NAMED_FUNCTION(php_if_ftruncate)
                   1624: {
                   1625:        zval *fp;
                   1626:        long size;
                   1627:        php_stream *stream;
                   1628: 
                   1629:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &fp, &size) == FAILURE) {
                   1630:                RETURN_FALSE;
                   1631:        }
                   1632: 
                   1633:        PHP_STREAM_TO_ZVAL(stream, &fp);
                   1634: 
                   1635:        if (!php_stream_truncate_supported(stream)) {
                   1636:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can't truncate this stream!");
                   1637:                RETURN_FALSE;
                   1638:        }
                   1639: 
                   1640:        RETURN_BOOL(0 == php_stream_truncate_set_size(stream, size));
                   1641: }
                   1642: /* }}} */
                   1643: 
                   1644: /* {{{ proto array fstat(resource fp)
                   1645:    Stat() on a filehandle */
                   1646: PHP_NAMED_FUNCTION(php_if_fstat)
                   1647: {
                   1648:        zval *fp;
                   1649:        zval *stat_dev, *stat_ino, *stat_mode, *stat_nlink, *stat_uid, *stat_gid, *stat_rdev,
                   1650:                 *stat_size, *stat_atime, *stat_mtime, *stat_ctime, *stat_blksize, *stat_blocks;
                   1651:        php_stream *stream;
                   1652:        php_stream_statbuf stat_ssb;
                   1653:        char *stat_sb_names[13] = {
                   1654:                "dev", "ino", "mode", "nlink", "uid", "gid", "rdev",
                   1655:                "size", "atime", "mtime", "ctime", "blksize", "blocks"
                   1656:        };
                   1657: 
                   1658:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &fp) == FAILURE) {
                   1659:                RETURN_FALSE;
                   1660:        }
                   1661: 
                   1662:        PHP_STREAM_TO_ZVAL(stream, &fp);
                   1663: 
                   1664:        if (php_stream_stat(stream, &stat_ssb)) {
                   1665:                RETURN_FALSE;
                   1666:        }
                   1667: 
                   1668:        array_init(return_value);
                   1669: 
                   1670:        MAKE_LONG_ZVAL_INCREF(stat_dev, stat_ssb.sb.st_dev);
                   1671:        MAKE_LONG_ZVAL_INCREF(stat_ino, stat_ssb.sb.st_ino);
                   1672:        MAKE_LONG_ZVAL_INCREF(stat_mode, stat_ssb.sb.st_mode);
                   1673:        MAKE_LONG_ZVAL_INCREF(stat_nlink, stat_ssb.sb.st_nlink);
                   1674:        MAKE_LONG_ZVAL_INCREF(stat_uid, stat_ssb.sb.st_uid);
                   1675:        MAKE_LONG_ZVAL_INCREF(stat_gid, stat_ssb.sb.st_gid);
                   1676: #ifdef HAVE_ST_RDEV
                   1677:        MAKE_LONG_ZVAL_INCREF(stat_rdev, stat_ssb.sb.st_rdev);
                   1678: #else
                   1679:        MAKE_LONG_ZVAL_INCREF(stat_rdev, -1);
                   1680: #endif
                   1681:        MAKE_LONG_ZVAL_INCREF(stat_size, stat_ssb.sb.st_size);
                   1682:        MAKE_LONG_ZVAL_INCREF(stat_atime, stat_ssb.sb.st_atime);
                   1683:        MAKE_LONG_ZVAL_INCREF(stat_mtime, stat_ssb.sb.st_mtime);
                   1684:        MAKE_LONG_ZVAL_INCREF(stat_ctime, stat_ssb.sb.st_ctime);
                   1685: #ifdef HAVE_ST_BLKSIZE
                   1686:        MAKE_LONG_ZVAL_INCREF(stat_blksize, stat_ssb.sb.st_blksize);
                   1687: #else
                   1688:        MAKE_LONG_ZVAL_INCREF(stat_blksize,-1);
                   1689: #endif
                   1690: #ifdef HAVE_ST_BLOCKS
                   1691:        MAKE_LONG_ZVAL_INCREF(stat_blocks, stat_ssb.sb.st_blocks);
                   1692: #else
                   1693:        MAKE_LONG_ZVAL_INCREF(stat_blocks,-1);
                   1694: #endif
                   1695:        /* Store numeric indexes in propper order */
                   1696:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_dev, sizeof(zval *), NULL);
                   1697:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_ino, sizeof(zval *), NULL);
                   1698:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_mode, sizeof(zval *), NULL);
                   1699:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_nlink, sizeof(zval *), NULL);
                   1700:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_uid, sizeof(zval *), NULL);
                   1701:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_gid, sizeof(zval *), NULL);
                   1702:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_rdev, sizeof(zval *), NULL);
                   1703:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_size, sizeof(zval *), NULL);
                   1704:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_atime, sizeof(zval *), NULL);
                   1705:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_mtime, sizeof(zval *), NULL);
                   1706:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_ctime, sizeof(zval *), NULL);
                   1707:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_blksize, sizeof(zval *), NULL);
                   1708:        zend_hash_next_index_insert(HASH_OF(return_value), (void *)&stat_blocks, sizeof(zval *), NULL);
                   1709: 
                   1710:        /* Store string indexes referencing the same zval*/
                   1711:        zend_hash_update(HASH_OF(return_value), stat_sb_names[0], strlen(stat_sb_names[0])+1, (void *)&stat_dev, sizeof(zval *), NULL);
                   1712:        zend_hash_update(HASH_OF(return_value), stat_sb_names[1], strlen(stat_sb_names[1])+1, (void *)&stat_ino, sizeof(zval *), NULL);
                   1713:        zend_hash_update(HASH_OF(return_value), stat_sb_names[2], strlen(stat_sb_names[2])+1, (void *)&stat_mode, sizeof(zval *), NULL);
                   1714:        zend_hash_update(HASH_OF(return_value), stat_sb_names[3], strlen(stat_sb_names[3])+1, (void *)&stat_nlink, sizeof(zval *), NULL);
                   1715:        zend_hash_update(HASH_OF(return_value), stat_sb_names[4], strlen(stat_sb_names[4])+1, (void *)&stat_uid, sizeof(zval *), NULL);
                   1716:        zend_hash_update(HASH_OF(return_value), stat_sb_names[5], strlen(stat_sb_names[5])+1, (void *)&stat_gid, sizeof(zval *), NULL);
                   1717:        zend_hash_update(HASH_OF(return_value), stat_sb_names[6], strlen(stat_sb_names[6])+1, (void *)&stat_rdev, sizeof(zval *), NULL);
                   1718:        zend_hash_update(HASH_OF(return_value), stat_sb_names[7], strlen(stat_sb_names[7])+1, (void *)&stat_size, sizeof(zval *), NULL);
                   1719:        zend_hash_update(HASH_OF(return_value), stat_sb_names[8], strlen(stat_sb_names[8])+1, (void *)&stat_atime, sizeof(zval *), NULL);
                   1720:        zend_hash_update(HASH_OF(return_value), stat_sb_names[9], strlen(stat_sb_names[9])+1, (void *)&stat_mtime, sizeof(zval *), NULL);
                   1721:        zend_hash_update(HASH_OF(return_value), stat_sb_names[10], strlen(stat_sb_names[10])+1, (void *)&stat_ctime, sizeof(zval *), NULL);
                   1722:        zend_hash_update(HASH_OF(return_value), stat_sb_names[11], strlen(stat_sb_names[11])+1, (void *)&stat_blksize, sizeof(zval *), NULL);
                   1723:        zend_hash_update(HASH_OF(return_value), stat_sb_names[12], strlen(stat_sb_names[12])+1, (void *)&stat_blocks, sizeof(zval *), NULL);
                   1724: }
                   1725: /* }}} */
                   1726: 
                   1727: /* {{{ proto bool copy(string source_file, string destination_file [, resource context])
                   1728:    Copy a file */
                   1729: PHP_FUNCTION(copy)
                   1730: {
                   1731:        char *source, *target;
                   1732:        int source_len, target_len;
                   1733:        zval *zcontext = NULL;
                   1734:        php_stream_context *context;
                   1735: 
                   1736:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|r", &source, &source_len, &target, &target_len, &zcontext) == FAILURE) {
                   1737:                return;
                   1738:        }
                   1739: 
                   1740:        if (strlen(source) != source_len) {
                   1741:                RETURN_FALSE;
                   1742:        }
                   1743: 
                   1744:        if (strlen(target) != target_len) {
                   1745:                RETURN_FALSE;
                   1746:        }
                   1747: 
                   1748:        if (PG(safe_mode) &&(!php_checkuid(source, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
                   1749:                RETURN_FALSE;
                   1750:        }
                   1751: 
                   1752:        if (php_check_open_basedir(source TSRMLS_CC)) {
                   1753:                RETURN_FALSE;
                   1754:        }
                   1755: 
                   1756:        context = php_stream_context_from_zval(zcontext, 0);
                   1757: 
                   1758:        if (php_copy_file_ctx(source, target, 0, context TSRMLS_CC) == SUCCESS) {
                   1759:                RETURN_TRUE;
                   1760:        } else {
                   1761:                RETURN_FALSE;
                   1762:        }
                   1763: }
                   1764: /* }}} */
                   1765: 
                   1766: /* {{{ php_copy_file
                   1767:  */
                   1768: PHPAPI int php_copy_file(char *src, char *dest TSRMLS_DC)
                   1769: {
                   1770:        return php_copy_file_ctx(src, dest, ENFORCE_SAFE_MODE, NULL TSRMLS_CC);
                   1771: }
                   1772: /* }}} */
                   1773: 
                   1774: /* {{{ php_copy_file_ex
                   1775:  */
                   1776: PHPAPI int php_copy_file_ex(char *src, char *dest, int src_chk TSRMLS_DC)
                   1777: {
                   1778:        return php_copy_file_ctx(src, dest, ENFORCE_SAFE_MODE, NULL TSRMLS_CC);
                   1779: }
                   1780: /* }}} */
                   1781: 
                   1782: /* {{{ php_copy_file_ctx
                   1783:  */
                   1784: PHPAPI int php_copy_file_ctx(char *src, char *dest, int src_chk, php_stream_context *context TSRMLS_DC)
                   1785: {
                   1786:        php_stream *srcstream = NULL, *deststream = NULL;
                   1787:        int ret = FAILURE;
                   1788:        php_stream_statbuf src_s, dest_s;
                   1789: 
                   1790:        switch (php_stream_stat_path_ex(src, 0, &src_s, context)) {
                   1791:                case -1:
                   1792:                        /* non-statable stream */
                   1793:                        goto safe_to_copy;
                   1794:                        break;
                   1795:                case 0:
                   1796:                        break;
                   1797:                default: /* failed to stat file, does not exist? */
                   1798:                        return ret;
                   1799:        }
                   1800:        if (S_ISDIR(src_s.sb.st_mode)) {
                   1801:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "The first argument to copy() function cannot be a directory");
                   1802:                return FAILURE;
                   1803:        }
                   1804: 
                   1805:        switch (php_stream_stat_path_ex(dest, PHP_STREAM_URL_STAT_QUIET, &dest_s, context)) {
                   1806:                case -1:
                   1807:                        /* non-statable stream */
                   1808:                        goto safe_to_copy;
                   1809:                        break;
                   1810:                case 0:
                   1811:                        break;
                   1812:                default: /* failed to stat file, does not exist? */
                   1813:                        return ret;
                   1814:        }
                   1815:        if (S_ISDIR(dest_s.sb.st_mode)) {
                   1816:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "The second argument to copy() function cannot be a directory");
                   1817:                return FAILURE;
                   1818:        }
                   1819:        if (!src_s.sb.st_ino || !dest_s.sb.st_ino) {
                   1820:                goto no_stat;
                   1821:        }
                   1822:        if (src_s.sb.st_ino == dest_s.sb.st_ino && src_s.sb.st_dev == dest_s.sb.st_dev) {
                   1823:                return ret;
                   1824:        } else {
                   1825:                goto safe_to_copy;
                   1826:        }
                   1827: no_stat:
                   1828:        {
                   1829:                char *sp, *dp;
                   1830:                int res;
                   1831: 
                   1832:                if ((sp = expand_filepath(src, NULL TSRMLS_CC)) == NULL) {
                   1833:                        return ret;
                   1834:                }
                   1835:                if ((dp = expand_filepath(dest, NULL TSRMLS_CC)) == NULL) {
                   1836:                        efree(sp);
                   1837:                        goto safe_to_copy;
                   1838:                }
                   1839: 
                   1840:                res =
                   1841: #ifndef PHP_WIN32
                   1842:                        !strcmp(sp, dp);
                   1843: #else
                   1844:                        !strcasecmp(sp, dp);
                   1845: #endif
                   1846: 
                   1847:                efree(sp);
                   1848:                efree(dp);
                   1849:                if (res) {
                   1850:                        return ret;
                   1851:                }
                   1852:        }
                   1853: safe_to_copy:
                   1854: 
                   1855:        srcstream = php_stream_open_wrapper_ex(src, "rb", src_chk | REPORT_ERRORS, NULL, context);
                   1856: 
                   1857:        if (!srcstream) {
                   1858:                return ret;
                   1859:        }
                   1860: 
                   1861:        deststream = php_stream_open_wrapper_ex(dest, "wb", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
                   1862: 
                   1863:        if (srcstream && deststream) {
                   1864:                ret = php_stream_copy_to_stream_ex(srcstream, deststream, PHP_STREAM_COPY_ALL, NULL);
                   1865:        }
                   1866:        if (srcstream) {
                   1867:                php_stream_close(srcstream);
                   1868:        }
                   1869:        if (deststream) {
                   1870:                php_stream_close(deststream);
                   1871:        }
                   1872:        return ret;
                   1873: }
                   1874: /* }}} */
                   1875: 
                   1876: /* {{{ proto string fread(resource fp, int length)
                   1877:    Binary-safe file read */
                   1878: PHPAPI PHP_FUNCTION(fread)
                   1879: {
                   1880:        zval *arg1;
                   1881:        long len;
                   1882:        php_stream *stream;
                   1883: 
                   1884:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &arg1, &len) == FAILURE) {
                   1885:                RETURN_FALSE;
                   1886:        }
                   1887: 
                   1888:        PHP_STREAM_TO_ZVAL(stream, &arg1);
                   1889: 
                   1890:        if (len <= 0) {
                   1891:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter must be greater than 0");
                   1892:                RETURN_FALSE;
                   1893:        }
                   1894: 
                   1895:        Z_STRVAL_P(return_value) = emalloc(len + 1);
                   1896:        Z_STRLEN_P(return_value) = php_stream_read(stream, Z_STRVAL_P(return_value), len);
                   1897: 
                   1898:        /* needed because recv/read/gzread doesnt put a null at the end*/
                   1899:        Z_STRVAL_P(return_value)[Z_STRLEN_P(return_value)] = 0;
                   1900: 
                   1901:        if (PG(magic_quotes_runtime)) {
                   1902:                Z_STRVAL_P(return_value) = php_addslashes(Z_STRVAL_P(return_value),
                   1903:                                Z_STRLEN_P(return_value), &Z_STRLEN_P(return_value), 1 TSRMLS_CC);
                   1904:        }
                   1905:        Z_TYPE_P(return_value) = IS_STRING;
                   1906: }
                   1907: /* }}} */
                   1908: 
                   1909: static const char *php_fgetcsv_lookup_trailing_spaces(const char *ptr, size_t len, const char delimiter TSRMLS_DC) /* {{{ */
                   1910: {
                   1911:        int inc_len;
                   1912:        unsigned char last_chars[2] = { 0, 0 };
                   1913: 
                   1914:        while (len > 0) {
                   1915:                inc_len = (*ptr == '\0' ? 1: php_mblen(ptr, len));
                   1916:                switch (inc_len) {
                   1917:                        case -2:
                   1918:                        case -1:
                   1919:                                inc_len = 1;
                   1920:                                php_mblen(NULL, 0);
                   1921:                                break;
                   1922:                        case 0:
                   1923:                                goto quit_loop;
                   1924:                        case 1:
                   1925:                        default:
                   1926:                                last_chars[0] = last_chars[1];
                   1927:                                last_chars[1] = *ptr;
                   1928:                                break;
                   1929:                }
                   1930:                ptr += inc_len;
                   1931:                len -= inc_len;
                   1932:        }
                   1933: quit_loop:
                   1934:        switch (last_chars[1]) {
                   1935:                case '\n':
                   1936:                        if (last_chars[0] == '\r') {
                   1937:                                return ptr - 2;
                   1938:                        }
                   1939:                        /* break is omitted intentionally */
                   1940:                case '\r':
                   1941:                        return ptr - 1;
                   1942:        }
                   1943:        return ptr;
                   1944: }
                   1945: /* }}} */
                   1946: 
                   1947: #define FPUTCSV_FLD_CHK(c) memchr(Z_STRVAL(field), c, Z_STRLEN(field))
                   1948: 
                   1949: /* {{{ proto int fputcsv(resource fp, array fields [, string delimiter [, string enclosure]])
                   1950:    Format line as CSV and write to file pointer */
                   1951: PHP_FUNCTION(fputcsv)
                   1952: {
                   1953:        char delimiter = ',';   /* allow this to be set as parameter */
                   1954:        char enclosure = '"';   /* allow this to be set as parameter */
                   1955:        const char escape_char = '\\';
                   1956:        php_stream *stream;
                   1957:        int ret;
                   1958:        zval *fp = NULL, *fields = NULL, **field_tmp = NULL, field;
                   1959:        char *delimiter_str = NULL, *enclosure_str = NULL;
                   1960:        int delimiter_str_len = 0, enclosure_str_len = 0;
                   1961:        HashPosition pos;
                   1962:        int count, i = 0;
                   1963:        smart_str csvline = {0};
                   1964: 
                   1965:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra|ss",
                   1966:                        &fp, &fields, &delimiter_str, &delimiter_str_len,
                   1967:                        &enclosure_str, &enclosure_str_len) == FAILURE) {
                   1968:                return;
                   1969:        }
                   1970: 
                   1971:        if (delimiter_str != NULL) {
                   1972:                /* Make sure that there is at least one character in string */
                   1973:                if (delimiter_str_len < 1) {
                   1974:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "delimiter must be a character");
                   1975:                        RETURN_FALSE;
                   1976:                } else if (delimiter_str_len > 1) {
                   1977:                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "delimiter must be a single character");
                   1978:                }
                   1979: 
                   1980:                /* use first character from string */
                   1981:                delimiter = *delimiter_str;
                   1982:        }
                   1983: 
                   1984:        if (enclosure_str != NULL) {
                   1985:                if (enclosure_str_len < 1) {
                   1986:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "enclosure must be a character");
                   1987:                        RETURN_FALSE;
                   1988:                } else if (enclosure_str_len > 1) {
                   1989:                        php_error_docref(NULL TSRMLS_CC, E_NOTICE, "enclosure must be a single character");
                   1990:                }
                   1991:                /* use first character from string */
                   1992:                enclosure = *enclosure_str;
                   1993:        }
                   1994: 
                   1995:        PHP_STREAM_TO_ZVAL(stream, &fp);
                   1996: 
                   1997:        count = zend_hash_num_elements(Z_ARRVAL_P(fields));
                   1998:        zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(fields), &pos);
                   1999:        while (zend_hash_get_current_data_ex(Z_ARRVAL_P(fields), (void **) &field_tmp, &pos) == SUCCESS) {
                   2000:                field = **field_tmp;
                   2001: 
                   2002:                if (Z_TYPE_PP(field_tmp) != IS_STRING) {
                   2003:                        zval_copy_ctor(&field);
                   2004:                        convert_to_string(&field);
                   2005:                }
                   2006: 
                   2007:                /* enclose a field that contains a delimiter, an enclosure character, or a newline */
                   2008:                if (FPUTCSV_FLD_CHK(delimiter) ||
                   2009:                        FPUTCSV_FLD_CHK(enclosure) ||
                   2010:                        FPUTCSV_FLD_CHK(escape_char) ||
                   2011:                        FPUTCSV_FLD_CHK('\n') ||
                   2012:                        FPUTCSV_FLD_CHK('\r') ||
                   2013:                        FPUTCSV_FLD_CHK('\t') ||
                   2014:                        FPUTCSV_FLD_CHK(' ')
                   2015:                ) {
                   2016:                        char *ch = Z_STRVAL(field);
                   2017:                        char *end = ch + Z_STRLEN(field);
                   2018:                        int escaped = 0;
                   2019: 
                   2020:                        smart_str_appendc(&csvline, enclosure);
                   2021:                        while (ch < end) {
                   2022:                                if (*ch == escape_char) {
                   2023:                                        escaped = 1;
                   2024:                                } else if (!escaped && *ch == enclosure) {
                   2025:                                        smart_str_appendc(&csvline, enclosure);
                   2026:                                } else {
                   2027:                                        escaped = 0;
                   2028:                                }
                   2029:                                smart_str_appendc(&csvline, *ch);
                   2030:                                ch++;
                   2031:                        }
                   2032:                        smart_str_appendc(&csvline, enclosure);
                   2033:                } else {
                   2034:                        smart_str_appendl(&csvline, Z_STRVAL(field), Z_STRLEN(field));
                   2035:                }
                   2036: 
                   2037:                if (++i != count) {
                   2038:                        smart_str_appendl(&csvline, &delimiter, 1);
                   2039:                }
                   2040:                zend_hash_move_forward_ex(Z_ARRVAL_P(fields), &pos);
                   2041: 
                   2042:                if (Z_TYPE_PP(field_tmp) != IS_STRING) {
                   2043:                        zval_dtor(&field);
                   2044:                }
                   2045:        }
                   2046: 
                   2047:        smart_str_appendc(&csvline, '\n');
                   2048:        smart_str_0(&csvline);
                   2049: 
                   2050:        if (!PG(magic_quotes_runtime)) {
                   2051:                ret = php_stream_write(stream, csvline.c, csvline.len);
                   2052:        } else {
                   2053:                char *buffer = estrndup(csvline.c, csvline.len);
                   2054:                int len = csvline.len;
                   2055:                php_stripslashes(buffer, &len TSRMLS_CC);
                   2056:                ret = php_stream_write(stream, buffer, len);
                   2057:                efree(buffer);
                   2058:        }
                   2059: 
                   2060:        smart_str_free(&csvline);
                   2061: 
                   2062:        RETURN_LONG(ret);
                   2063: }
                   2064: /* }}} */
                   2065: 
                   2066: /* {{{ proto array fgetcsv(resource fp [,int length [, string delimiter [, string enclosure [, string escape]]]])
                   2067:    Get line from file pointer and parse for CSV fields */
                   2068: PHP_FUNCTION(fgetcsv)
                   2069: {
                   2070:        char delimiter = ',';   /* allow this to be set as parameter */
                   2071:        char enclosure = '"';   /* allow this to be set as parameter */
                   2072:        char escape = '\\';
                   2073: 
                   2074:        /* first section exactly as php_fgetss */
                   2075: 
                   2076:        long len = 0;
                   2077:        size_t buf_len;
                   2078:        char *buf;
                   2079:        php_stream *stream;
                   2080: 
                   2081:        {
                   2082:                zval *fd, **len_zv = NULL;
                   2083:                char *delimiter_str = NULL;
                   2084:                int delimiter_str_len = 0;
                   2085:                char *enclosure_str = NULL;
                   2086:                int enclosure_str_len = 0;
                   2087:                char *escape_str = NULL;
                   2088:                int escape_str_len = 0;
                   2089: 
                   2090:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|Zsss",
                   2091:                        &fd, &len_zv, &delimiter_str, &delimiter_str_len,
                   2092:                        &enclosure_str, &enclosure_str_len,
                   2093:                        &escape_str, &escape_str_len) == FAILURE
                   2094:                ) {
                   2095:                        return;
                   2096:                }
                   2097: 
                   2098:                if (delimiter_str != NULL) {
                   2099:                        /* Make sure that there is at least one character in string */
                   2100:                        if (delimiter_str_len < 1) {
                   2101:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "delimiter must be a character");
                   2102:                                RETURN_FALSE;
                   2103:                        } else if (delimiter_str_len > 1) {
                   2104:                                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "delimiter must be a single character");
                   2105:                        }
                   2106: 
                   2107:                        /* use first character from string */
                   2108:                        delimiter = delimiter_str[0];
                   2109:                }
                   2110: 
                   2111:                if (enclosure_str != NULL) {
                   2112:                        if (enclosure_str_len < 1) {
                   2113:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "enclosure must be a character");
                   2114:                                RETURN_FALSE;
                   2115:                        } else if (enclosure_str_len > 1) {
                   2116:                                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "enclosure must be a single character");
                   2117:                        }
                   2118: 
                   2119:                        /* use first character from string */
                   2120:                        enclosure = enclosure_str[0];
                   2121:                }
                   2122: 
                   2123:                if (escape_str != NULL) {
                   2124:                        if (escape_str_len < 1) {
                   2125:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "escape must be character");
                   2126:                                RETURN_FALSE;
                   2127:                        } else if (escape_str_len > 1) {
                   2128:                                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "escape must be a single character");
                   2129:                        }
                   2130: 
                   2131:                        escape = escape_str[0];
                   2132:                }
                   2133: 
                   2134:                if (len_zv != NULL && Z_TYPE_PP(len_zv) != IS_NULL) {
                   2135:                        convert_to_long_ex(len_zv);
                   2136:                        len = Z_LVAL_PP(len_zv);
                   2137:                        if (len < 0) {
                   2138:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Length parameter may not be negative");
                   2139:                                RETURN_FALSE;
                   2140:                        } else if (len == 0) {
                   2141:                                len = -1;
                   2142:                        }
                   2143:                } else {
                   2144:                        len = -1;
                   2145:                }
                   2146: 
                   2147:                PHP_STREAM_TO_ZVAL(stream, &fd);
                   2148:        }
                   2149: 
                   2150:        if (len < 0) {
                   2151:                if ((buf = php_stream_get_line(stream, NULL, 0, &buf_len)) == NULL) {
                   2152:                        RETURN_FALSE;
                   2153:                }
                   2154:        } else {
                   2155:                buf = emalloc(len + 1);
                   2156:                if (php_stream_get_line(stream, buf, len + 1, &buf_len) == NULL) {
                   2157:                        efree(buf);
                   2158:                        RETURN_FALSE;
                   2159:                }
                   2160:        }
                   2161: 
                   2162:        php_fgetcsv(stream, delimiter, enclosure, escape, buf_len, buf, return_value TSRMLS_CC);
                   2163: }
                   2164: /* }}} */
                   2165: 
                   2166: PHPAPI void php_fgetcsv(php_stream *stream, char delimiter, char enclosure, char escape_char, size_t buf_len, char *buf, zval *return_value TSRMLS_DC) /* {{{ */
                   2167: {
                   2168:        char *temp, *tptr, *bptr, *line_end, *limit;
                   2169:        size_t temp_len, line_end_len;
                   2170:        int inc_len;
                   2171:        zend_bool first_field = 1;
                   2172: 
                   2173:        /* initialize internal state */
                   2174:        php_mblen(NULL, 0);
                   2175: 
                   2176:        /* Now into new section that parses buf for delimiter/enclosure fields */
                   2177: 
                   2178:        /* Strip trailing space from buf, saving end of line in case required for enclosure field */
                   2179: 
                   2180:        bptr = buf;
                   2181:        tptr = (char *)php_fgetcsv_lookup_trailing_spaces(buf, buf_len, delimiter TSRMLS_CC);
                   2182:        line_end_len = buf_len - (size_t)(tptr - buf);
                   2183:        line_end = limit = tptr;
                   2184: 
                   2185:        /* reserve workspace for building each individual field */
                   2186:        temp_len = buf_len;
                   2187:        temp = emalloc(temp_len + line_end_len + 1);
                   2188: 
                   2189:        /* Initialize return array */
                   2190:        array_init(return_value);
                   2191: 
                   2192:        /* Main loop to read CSV fields */
                   2193:        /* NB this routine will return a single null entry for a blank line */
                   2194: 
                   2195:        do {
                   2196:                char *comp_end, *hunk_begin;
                   2197: 
                   2198:                tptr = temp;
                   2199:                inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0);
                   2200:                if (inc_len == 1) {
                   2201:                        char *tmp = bptr;
                   2202:                        while ((*tmp != delimiter) && isspace((int)*(unsigned char *)tmp)) {
                   2203:                                tmp++;
                   2204:                        }
                   2205:                        if (*tmp == enclosure) {
                   2206:                                bptr = tmp;
                   2207:                        }
                   2208:                }
                   2209: 
                   2210:                if (first_field && bptr == line_end) {
                   2211:                        add_next_index_null(return_value);
                   2212:                        break;
                   2213:                }
                   2214:                first_field = 0;
                   2215:                /* 2. Read field, leaving bptr pointing at start of next field */
                   2216:                if (inc_len != 0 && *bptr == enclosure) {
                   2217:                        int state = 0;
                   2218: 
                   2219:                        bptr++; /* move on to first character in field */
                   2220:                        hunk_begin = bptr;
                   2221: 
                   2222:                        /* 2A. handle enclosure delimited field */
                   2223:                        for (;;) {
                   2224:                                switch (inc_len) {
                   2225:                                        case 0:
                   2226:                                                switch (state) {
                   2227:                                                        case 2:
                   2228:                                                                memcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
                   2229:                                                                tptr += (bptr - hunk_begin - 1);
                   2230:                                                                hunk_begin = bptr;
                   2231:                                                                goto quit_loop_2;
                   2232: 
                   2233:                                                        case 1:
                   2234:                                                                memcpy(tptr, hunk_begin, bptr - hunk_begin);
                   2235:                                                                tptr += (bptr - hunk_begin);
                   2236:                                                                hunk_begin = bptr;
                   2237:                                                                /* break is omitted intentionally */
                   2238: 
                   2239:                                                        case 0: {
                   2240:                                                                char *new_buf;
                   2241:                                                                size_t new_len;
                   2242:                                                                char *new_temp;
                   2243: 
                   2244:                                                                if (hunk_begin != line_end) {
                   2245:                                                                        memcpy(tptr, hunk_begin, bptr - hunk_begin);
                   2246:                                                                        tptr += (bptr - hunk_begin);
                   2247:                                                                        hunk_begin = bptr;
                   2248:                                                                }
                   2249: 
                   2250:                                                                /* add the embedded line end to the field */
                   2251:                                                                memcpy(tptr, line_end, line_end_len);
                   2252:                                                                tptr += line_end_len;
                   2253: 
                   2254:                                                                if (stream == NULL) {
                   2255:                                                                        goto quit_loop_2;
                   2256:                                                                } else if ((new_buf = php_stream_get_line(stream, NULL, 0, &new_len)) == NULL) {
                   2257:                                                                        /* we've got an unterminated enclosure,
                   2258:                                                                         * assign all the data from the start of
                   2259:                                                                         * the enclosure to end of data to the
                   2260:                                                                         * last element */
                   2261:                                                                        if ((size_t)temp_len > (size_t)(limit - buf)) {
                   2262:                                                                                goto quit_loop_2;
                   2263:                                                                        }
                   2264:                                                                        zval_dtor(return_value);
                   2265:                                                                        RETVAL_FALSE;
                   2266:                                                                        goto out;
                   2267:                                                                }
                   2268:                                                                temp_len += new_len;
                   2269:                                                                new_temp = erealloc(temp, temp_len);
                   2270:                                                                tptr = new_temp + (size_t)(tptr - temp);
                   2271:                                                                temp = new_temp;
                   2272: 
                   2273:                                                                efree(buf);
                   2274:                                                                buf_len = new_len;
                   2275:                                                                bptr = buf = new_buf;
                   2276:                                                                hunk_begin = buf;
                   2277: 
                   2278:                                                                line_end = limit = (char *)php_fgetcsv_lookup_trailing_spaces(buf, buf_len, delimiter TSRMLS_CC);
                   2279:                                                                line_end_len = buf_len - (size_t)(limit - buf);
                   2280: 
                   2281:                                                                state = 0;
                   2282:                                                        } break;
                   2283:                                                }
                   2284:                                                break;
                   2285: 
                   2286:                                        case -2:
                   2287:                                        case -1:
                   2288:                                                php_mblen(NULL, 0);
                   2289:                                                /* break is omitted intentionally */
                   2290:                                        case 1:
                   2291:                                                /* we need to determine if the enclosure is
                   2292:                                                 * 'real' or is it escaped */
                   2293:                                                switch (state) {
                   2294:                                                        case 1: /* escaped */
                   2295:                                                                bptr++;
                   2296:                                                                state = 0;
                   2297:                                                                break;
                   2298:                                                        case 2: /* embedded enclosure ? let's check it */
                   2299:                                                                if (*bptr != enclosure) {
                   2300:                                                                        /* real enclosure */
                   2301:                                                                        memcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
                   2302:                                                                        tptr += (bptr - hunk_begin - 1);
                   2303:                                                                        hunk_begin = bptr;
                   2304:                                                                        goto quit_loop_2;
                   2305:                                                                }
                   2306:                                                                memcpy(tptr, hunk_begin, bptr - hunk_begin);
                   2307:                                                                tptr += (bptr - hunk_begin);
                   2308:                                                                bptr++;
                   2309:                                                                hunk_begin = bptr;
                   2310:                                                                state = 0;
                   2311:                                                                break;
                   2312:                                                        default:
                   2313:                                                                if (*bptr == enclosure) {
                   2314:                                                                        state = 2;
                   2315:                                                                } else if (*bptr == escape_char) {
                   2316:                                                                        state = 1;
                   2317:                                                                }
                   2318:                                                                bptr++;
                   2319:                                                                break;
                   2320:                                                }
                   2321:                                                break;
                   2322: 
                   2323:                                        default:
                   2324:                                                switch (state) {
                   2325:                                                        case 2:
                   2326:                                                                /* real enclosure */
                   2327:                                                                memcpy(tptr, hunk_begin, bptr - hunk_begin - 1);
                   2328:                                                                tptr += (bptr - hunk_begin - 1);
                   2329:                                                                hunk_begin = bptr;
                   2330:                                                                goto quit_loop_2;
                   2331:                                                        case 1:
                   2332:                                                                bptr += inc_len;
                   2333:                                                                memcpy(tptr, hunk_begin, bptr - hunk_begin);
                   2334:                                                                tptr += (bptr - hunk_begin);
                   2335:                                                                hunk_begin = bptr;
                   2336:                                                                break;
                   2337:                                                        default:
                   2338:                                                                bptr += inc_len;
                   2339:                                                                break;
                   2340:                                                }
                   2341:                                                break;
                   2342:                                }
                   2343:                                inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0);
                   2344:                        }
                   2345: 
                   2346:                quit_loop_2:
                   2347:                        /* look up for a delimiter */
                   2348:                        for (;;) {
                   2349:                                switch (inc_len) {
                   2350:                                        case 0:
                   2351:                                                goto quit_loop_3;
                   2352: 
                   2353:                                        case -2:
                   2354:                                        case -1:
                   2355:                                                inc_len = 1;
                   2356:                                                php_mblen(NULL, 0);
                   2357:                                                /* break is omitted intentionally */
                   2358:                                        case 1:
                   2359:                                                if (*bptr == delimiter) {
                   2360:                                                        goto quit_loop_3;
                   2361:                                                }
                   2362:                                                break;
                   2363:                                        default:
                   2364:                                                break;
                   2365:                                }
                   2366:                                bptr += inc_len;
                   2367:                                inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0);
                   2368:                        }
                   2369: 
                   2370:                quit_loop_3:
                   2371:                        memcpy(tptr, hunk_begin, bptr - hunk_begin);
                   2372:                        tptr += (bptr - hunk_begin);
                   2373:                        bptr += inc_len;
                   2374:                        comp_end = tptr;
                   2375:                } else {
                   2376:                        /* 2B. Handle non-enclosure field */
                   2377: 
                   2378:                        hunk_begin = bptr;
                   2379: 
                   2380:                        for (;;) {
                   2381:                                switch (inc_len) {
                   2382:                                        case 0:
                   2383:                                                goto quit_loop_4;
                   2384:                                        case -2:
                   2385:                                        case -1:
                   2386:                                                inc_len = 1;
                   2387:                                                php_mblen(NULL, 0);
                   2388:                                                /* break is omitted intentionally */
                   2389:                                        case 1:
                   2390:                                                if (*bptr == delimiter) {
                   2391:                                                        goto quit_loop_4;
                   2392:                                                }
                   2393:                                                break;
                   2394:                                        default:
                   2395:                                                break;
                   2396:                                }
                   2397:                                bptr += inc_len;
                   2398:                                inc_len = (bptr < limit ? (*bptr == '\0' ? 1: php_mblen(bptr, limit - bptr)): 0);
                   2399:                        }
                   2400:                quit_loop_4:
                   2401:                        memcpy(tptr, hunk_begin, bptr - hunk_begin);
                   2402:                        tptr += (bptr - hunk_begin);
                   2403: 
                   2404:                        comp_end = (char *)php_fgetcsv_lookup_trailing_spaces(temp, tptr - temp, delimiter TSRMLS_CC);
                   2405:                        if (*bptr == delimiter) {
                   2406:                                bptr++;
                   2407:                        }
                   2408:                }
                   2409: 
                   2410:                /* 3. Now pass our field back to php */
                   2411:                *comp_end = '\0';
                   2412:                add_next_index_stringl(return_value, temp, comp_end - temp, 1);
                   2413:        } while (inc_len > 0);
                   2414: 
                   2415: out:
                   2416:        efree(temp);
                   2417:        if (stream) {
                   2418:                efree(buf);
                   2419:        }
                   2420: }
                   2421: /* }}} */
                   2422: 
                   2423: #if (!defined(__BEOS__) && !defined(NETWARE) && HAVE_REALPATH) || defined(ZTS)
                   2424: /* {{{ proto string realpath(string path)
                   2425:    Return the resolved path */
                   2426: PHP_FUNCTION(realpath)
                   2427: {
                   2428:        char *filename;
                   2429:        int filename_len;
                   2430:        char resolved_path_buff[MAXPATHLEN];
                   2431: 
                   2432:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
                   2433:                return;
                   2434:        }
                   2435: 
                   2436:        if (strlen(filename) != filename_len) {
                   2437:                RETURN_FALSE;
                   2438:        }
                   2439: 
                   2440:        if (VCWD_REALPATH(filename, resolved_path_buff)) {
                   2441:                if (PG(safe_mode) && (!php_checkuid(resolved_path_buff, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
                   2442:                        RETURN_FALSE;
                   2443:                }
                   2444: 
                   2445:                if (php_check_open_basedir(resolved_path_buff TSRMLS_CC)) {
                   2446:                        RETURN_FALSE;
                   2447:                }
                   2448: 
                   2449: #ifdef ZTS
                   2450:                if (VCWD_ACCESS(resolved_path_buff, F_OK)) {
                   2451:                        RETURN_FALSE;
                   2452:                }
                   2453: #endif
                   2454:                RETURN_STRING(resolved_path_buff, 1);
                   2455:        } else {
                   2456:                RETURN_FALSE;
                   2457:        }
                   2458: }
                   2459: /* }}} */
                   2460: #endif
                   2461: 
                   2462: /* See http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.2 */
                   2463: #define PHP_META_HTML401_CHARS "-_.:"
                   2464: 
                   2465: /* {{{ php_next_meta_token
                   2466:    Tokenizes an HTML file for get_meta_tags */
                   2467: php_meta_tags_token php_next_meta_token(php_meta_tags_data *md TSRMLS_DC)
                   2468: {
                   2469:        int ch = 0, compliment;
                   2470:        char buff[META_DEF_BUFSIZE + 1];
                   2471: 
                   2472:        memset((void *)buff, 0, META_DEF_BUFSIZE + 1);
                   2473: 
                   2474:        while (md->ulc || (!php_stream_eof(md->stream) && (ch = php_stream_getc(md->stream)))) {
                   2475:                if (php_stream_eof(md->stream)) {
                   2476:                        break;
                   2477:                }
                   2478: 
                   2479:                if (md->ulc) {
                   2480:                        ch = md->lc;
                   2481:                        md->ulc = 0;
                   2482:                }
                   2483: 
                   2484:                switch (ch) {
                   2485:                        case '<':
                   2486:                                return TOK_OPENTAG;
                   2487:                                break;
                   2488: 
                   2489:                        case '>':
                   2490:                                return TOK_CLOSETAG;
                   2491:                                break;
                   2492: 
                   2493:                        case '=':
                   2494:                                return TOK_EQUAL;
                   2495:                                break;
                   2496:                        case '/':
                   2497:                                return TOK_SLASH;
                   2498:                                break;
                   2499: 
                   2500:                        case '\'':
                   2501:                        case '"':
                   2502:                                compliment = ch;
                   2503:                                md->token_len = 0;
                   2504:                                while (!php_stream_eof(md->stream) && (ch = php_stream_getc(md->stream)) && ch != compliment && ch != '<' && ch != '>') {
                   2505:                                        buff[(md->token_len)++] = ch;
                   2506: 
                   2507:                                        if (md->token_len == META_DEF_BUFSIZE) {
                   2508:                                                break;
                   2509:                                        }
                   2510:                                }
                   2511: 
                   2512:                                if (ch == '<' || ch == '>') {
                   2513:                                        /* Was just an apostrohpe */
                   2514:                                        md->ulc = 1;
                   2515:                                        md->lc = ch;
                   2516:                                }
                   2517: 
                   2518:                                /* We don't need to alloc unless we are in a meta tag */
                   2519:                                if (md->in_meta) {
                   2520:                                        md->token_data = (char *) emalloc(md->token_len + 1);
                   2521:                                        memcpy(md->token_data, buff, md->token_len+1);
                   2522:                                }
                   2523: 
                   2524:                                return TOK_STRING;
                   2525:                                break;
                   2526: 
                   2527:                        case '\n':
                   2528:                        case '\r':
                   2529:                        case '\t':
                   2530:                                break;
                   2531: 
                   2532:                        case ' ':
                   2533:                                return TOK_SPACE;
                   2534:                                break;
                   2535: 
                   2536:                        default:
                   2537:                                if (isalnum(ch)) {
                   2538:                                        md->token_len = 0;
                   2539:                                        buff[(md->token_len)++] = ch;
                   2540:                                        while (!php_stream_eof(md->stream) && (ch = php_stream_getc(md->stream)) && (isalnum(ch) || strchr(PHP_META_HTML401_CHARS, ch))) {
                   2541:                                                buff[(md->token_len)++] = ch;
                   2542: 
                   2543:                                                if (md->token_len == META_DEF_BUFSIZE) {
                   2544:                                                        break;
                   2545:                                                }
                   2546:                                        }
                   2547: 
                   2548:                                        /* This is ugly, but we have to replace ungetc */
                   2549:                                        if (!isalpha(ch) && ch != '-') {
                   2550:                                                md->ulc = 1;
                   2551:                                                md->lc = ch;
                   2552:                                        }
                   2553: 
                   2554:                                        md->token_data = (char *) emalloc(md->token_len + 1);
                   2555:                                        memcpy(md->token_data, buff, md->token_len+1);
                   2556: 
                   2557:                                        return TOK_ID;
                   2558:                                } else {
                   2559:                                        return TOK_OTHER;
                   2560:                                }
                   2561:                                break;
                   2562:                }
                   2563:        }
                   2564: 
                   2565:        return TOK_EOF;
                   2566: }
                   2567: /* }}} */
                   2568: 
                   2569: #ifdef HAVE_FNMATCH
                   2570: /* {{{ proto bool fnmatch(string pattern, string filename [, int flags])
                   2571:    Match filename against pattern */
                   2572: PHP_FUNCTION(fnmatch)
                   2573: {
                   2574:        char *pattern, *filename;
                   2575:        int pattern_len, filename_len;
                   2576:        long flags = 0;
                   2577: 
                   2578:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", &pattern, &pattern_len, &filename, &filename_len, &flags) == FAILURE) {
                   2579:                return;
                   2580:        }
                   2581: 
                   2582:        if (strlen(pattern) != pattern_len) {
                   2583:                RETURN_FALSE;
                   2584:        }
                   2585: 
                   2586:        if (strlen(filename) != filename_len) {
                   2587:                RETURN_FALSE;
                   2588:        }
                   2589:        
                   2590:        if (filename_len >= MAXPATHLEN) {
                   2591:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Filename exceeds the maximum allowed length of %d characters", MAXPATHLEN);
                   2592:                RETURN_FALSE;
                   2593:        }
                   2594:        if (pattern_len >= MAXPATHLEN) {
                   2595:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Pattern exceeds the maximum allowed length of %d characters", MAXPATHLEN);
                   2596:                RETURN_FALSE;
                   2597:        }
                   2598: 
                   2599:        RETURN_BOOL( ! fnmatch( pattern, filename, flags ));
                   2600: }
                   2601: /* }}} */
                   2602: #endif
                   2603: 
                   2604: /* {{{ proto string sys_get_temp_dir()
                   2605:    Returns directory path used for temporary files */
                   2606: PHP_FUNCTION(sys_get_temp_dir)
                   2607: {
                   2608:        if (zend_parse_parameters_none() == FAILURE) {
                   2609:                return;
                   2610:        }
                   2611:        RETURN_STRING((char *)php_get_temporary_directory(), 1);
                   2612: }
                   2613: /* }}} */
                   2614: 
                   2615: /*
                   2616:  * Local variables:
                   2617:  * tab-width: 4
                   2618:  * c-basic-offset: 4
                   2619:  * End:
                   2620:  * vim600: noet sw=4 ts=4 fdm=marker
                   2621:  * vim<600: noet sw=4 ts=4
                   2622:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>