Annotation of embedaddon/php/ext/fileinfo/fileinfo.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.0 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_0.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:   | Author: Ilia Alshanetsky <ilia@php.net>                              |
                     16:   +----------------------------------------------------------------------+
                     17: */
                     18: 
                     19: /* $Id: fileinfo.c 321634 2012-01-01 13:15:04Z felipe $ */
                     20: 
                     21: #ifdef HAVE_CONFIG_H
                     22: #include "config.h"
                     23: #endif
                     24: #include "php.h"
                     25: 
                     26: #include <magic.h>
                     27: /* 
                     28:  * HOWMANY specifies the maximum offset libmagic will look at
                     29:  * this is currently hardcoded in the libmagic source but not exported
                     30:  */
                     31: #ifndef HOWMANY
                     32: #define HOWMANY 65536
                     33: #endif
                     34: 
                     35: #include "php_ini.h"
                     36: #include "ext/standard/info.h"
                     37: #include "ext/standard/file.h" /* needed for context stuff */
                     38: #include "php_fileinfo.h"
                     39: #include "fopen_wrappers.h" /* needed for is_url */
                     40: 
                     41: #ifndef _S_IFDIR
                     42: # define _S_IFDIR              S_IFDIR
                     43: #endif
                     44: 
                     45: /* {{{ macros and type definitions */
                     46: struct php_fileinfo {
                     47:        long options;
                     48:        struct magic_set *magic;
                     49: };
                     50: 
                     51: static zend_object_handlers finfo_object_handlers;
                     52: zend_class_entry *finfo_class_entry;
                     53: 
                     54: struct finfo_object {
                     55:        zend_object zo;
                     56:        struct php_fileinfo *ptr;
                     57: };
                     58: 
                     59: #define FILEINFO_DECLARE_INIT_OBJECT(object) \
                     60:        zval *object = getThis();
                     61: 
                     62: #define FILEINFO_REGISTER_OBJECT(_object, _ptr) \
                     63: { \
                     64:        struct finfo_object *obj; \
                     65:         obj = (struct finfo_object*)zend_object_store_get_object(_object TSRMLS_CC); \
                     66:         obj->ptr = _ptr; \
                     67: }
                     68: 
                     69: #define FILEINFO_FROM_OBJECT(finfo, object) \
                     70: { \
                     71:        struct finfo_object *obj = zend_object_store_get_object(object TSRMLS_CC); \
                     72:        finfo = obj->ptr; \
                     73:        if (!finfo) { \
                     74:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "The invalid fileinfo object."); \
                     75:                RETURN_FALSE; \
                     76:        } \
                     77: }
                     78: 
                     79: /* {{{ finfo_objects_dtor
                     80:  */
                     81: static void finfo_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC)
                     82: {
                     83:        struct finfo_object *intern = (struct finfo_object *) object;
                     84: 
                     85:        if (intern->ptr) {
                     86:                magic_close(intern->ptr->magic);
                     87:                efree(intern->ptr);
                     88:        }
                     89: 
                     90:        zend_object_std_dtor(&intern->zo TSRMLS_CC);
                     91:        efree(intern);
                     92: }
                     93: /* }}} */
                     94: 
                     95: /* {{{ finfo_objects_new
                     96:  */
                     97: PHP_FILEINFO_API zend_object_value finfo_objects_new(zend_class_entry *class_type TSRMLS_DC)
                     98: {
                     99:        zend_object_value retval;
                    100:        struct finfo_object *intern;
                    101:        zval *tmp;
                    102: 
                    103:        intern = emalloc(sizeof(struct finfo_object));
                    104:        memset(intern, 0, sizeof(struct finfo_object));
                    105: 
                    106:        zend_object_std_init(&intern->zo, class_type TSRMLS_CC);
                    107:        zend_hash_copy(intern->zo.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref,(void *) &tmp, sizeof(zval *));
                    108: 
                    109:        intern->ptr = NULL;
                    110: 
                    111:        retval.handle = zend_objects_store_put(intern, finfo_objects_dtor, NULL, NULL TSRMLS_CC);
                    112:        retval.handlers = (zend_object_handlers *) &finfo_object_handlers;
                    113: 
                    114:        return retval;
                    115: }
                    116: /* }}} */
                    117: 
                    118: /* {{{ arginfo */
                    119: ZEND_BEGIN_ARG_INFO_EX(arginfo_finfo_open, 0, 0, 0)
                    120:        ZEND_ARG_INFO(0, options)
                    121:        ZEND_ARG_INFO(0, arg)
                    122: ZEND_END_ARG_INFO()
                    123: 
                    124: ZEND_BEGIN_ARG_INFO_EX(arginfo_finfo_close, 0, 0, 1)
                    125:        ZEND_ARG_INFO(0, finfo)
                    126: ZEND_END_ARG_INFO()
                    127: 
                    128: ZEND_BEGIN_ARG_INFO_EX(arginfo_finfo_set_flags, 0, 0, 2)
                    129:        ZEND_ARG_INFO(0, finfo)
                    130:        ZEND_ARG_INFO(0, options)
                    131: ZEND_END_ARG_INFO()
                    132: 
                    133: ZEND_BEGIN_ARG_INFO_EX(arginfo_finfo_method_set_flags, 0, 0, 1)
                    134:        ZEND_ARG_INFO(0, options)
                    135: ZEND_END_ARG_INFO()
                    136: 
                    137: ZEND_BEGIN_ARG_INFO_EX(arginfo_finfo_file, 0, 0, 2)
                    138:        ZEND_ARG_INFO(0, finfo)
                    139:        ZEND_ARG_INFO(0, filename)
                    140:        ZEND_ARG_INFO(0, options)
                    141:        ZEND_ARG_INFO(0, context)
                    142: ZEND_END_ARG_INFO()
                    143: 
                    144: ZEND_BEGIN_ARG_INFO_EX(arginfo_finfo_method_file, 0, 0, 1)
                    145:        ZEND_ARG_INFO(0, filename)
                    146:        ZEND_ARG_INFO(0, options)
                    147:        ZEND_ARG_INFO(0, context)
                    148: ZEND_END_ARG_INFO()
                    149: 
                    150: ZEND_BEGIN_ARG_INFO_EX(arginfo_finfo_buffer, 0, 0, 2)
                    151:        ZEND_ARG_INFO(0, finfo)
                    152:        ZEND_ARG_INFO(0, string)
                    153:        ZEND_ARG_INFO(0, options)
                    154:        ZEND_ARG_INFO(0, context)
                    155: ZEND_END_ARG_INFO()
                    156: 
                    157: ZEND_BEGIN_ARG_INFO_EX(arginfo_finfo_method_buffer, 0, 0, 1)
                    158:        ZEND_ARG_INFO(0, string)
                    159:        ZEND_ARG_INFO(0, options)
                    160:        ZEND_ARG_INFO(0, context)
                    161: ZEND_END_ARG_INFO()
                    162: 
                    163: ZEND_BEGIN_ARG_INFO_EX(arginfo_mime_content_type, 0, 0, 1)
                    164:        ZEND_ARG_INFO(0, string)
                    165: ZEND_END_ARG_INFO()
                    166: /* }}} */
                    167: 
                    168: /* {{{ finfo_class_functions
                    169:  */
                    170: zend_function_entry finfo_class_functions[] = {
                    171:        ZEND_ME_MAPPING(finfo,          finfo_open,     arginfo_finfo_open, ZEND_ACC_PUBLIC)
                    172:        ZEND_ME_MAPPING(set_flags,      finfo_set_flags,arginfo_finfo_method_set_flags, ZEND_ACC_PUBLIC)
                    173:        ZEND_ME_MAPPING(file,           finfo_file,     arginfo_finfo_method_file, ZEND_ACC_PUBLIC)
                    174:        ZEND_ME_MAPPING(buffer,         finfo_buffer,   arginfo_finfo_method_buffer, ZEND_ACC_PUBLIC)
                    175:        PHP_FE_END
                    176: };
                    177: /* }}} */
                    178: 
                    179: #define FINFO_SET_OPTION(magic, options) \
                    180:        if (magic_setflags(magic, options) == -1) { \
                    181:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to set option '%ld' %d:%s", \
                    182:                                options, magic_errno(magic), magic_error(magic)); \
                    183:                RETURN_FALSE; \
                    184:        }
                    185: 
                    186: /* True global resources - no need for thread safety here */
                    187: static int le_fileinfo;
                    188: /* }}} */
                    189: 
                    190: void finfo_resource_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
                    191: {
                    192:        if (rsrc->ptr) {
                    193:                struct php_fileinfo *finfo = (struct php_fileinfo *) rsrc->ptr;
                    194:                magic_close(finfo->magic);
                    195:                efree(rsrc->ptr);
                    196:                rsrc->ptr = NULL;
                    197:        }
                    198: }
                    199: /* }}} */
                    200: 
                    201: 
                    202: /* {{{ fileinfo_functions[]
                    203:  */
                    204: zend_function_entry fileinfo_functions[] = {
                    205:        PHP_FE(finfo_open,              arginfo_finfo_open)
                    206:        PHP_FE(finfo_close,             arginfo_finfo_close)
                    207:        PHP_FE(finfo_set_flags, arginfo_finfo_set_flags)
                    208:        PHP_FE(finfo_file,              arginfo_finfo_file)
                    209:        PHP_FE(finfo_buffer,    arginfo_finfo_buffer)
                    210:        PHP_FE(mime_content_type, arginfo_mime_content_type)
                    211:        {NULL, NULL, NULL}
                    212: };
                    213: /* }}} */
                    214: 
                    215: /* {{{ PHP_MINIT_FUNCTION
                    216:  */
                    217: PHP_MINIT_FUNCTION(finfo)
                    218: {
                    219:        zend_class_entry _finfo_class_entry;
                    220:        INIT_CLASS_ENTRY(_finfo_class_entry, "finfo", finfo_class_functions);
                    221:        _finfo_class_entry.create_object = finfo_objects_new;
                    222:        finfo_class_entry = zend_register_internal_class(&_finfo_class_entry TSRMLS_CC);
                    223: 
                    224:        /* copy the standard object handlers to you handler table */
                    225:        memcpy(&finfo_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
                    226: 
                    227:        le_fileinfo = zend_register_list_destructors_ex(finfo_resource_destructor, NULL, "file_info", module_number);
                    228: 
                    229:        REGISTER_LONG_CONSTANT("FILEINFO_NONE",                 MAGIC_NONE, CONST_CS|CONST_PERSISTENT);
                    230:        REGISTER_LONG_CONSTANT("FILEINFO_SYMLINK",              MAGIC_SYMLINK, CONST_CS|CONST_PERSISTENT);
                    231:        REGISTER_LONG_CONSTANT("FILEINFO_MIME",                 MAGIC_MIME, CONST_CS|CONST_PERSISTENT);
                    232:        REGISTER_LONG_CONSTANT("FILEINFO_MIME_TYPE",    MAGIC_MIME_TYPE, CONST_CS|CONST_PERSISTENT);
                    233:        REGISTER_LONG_CONSTANT("FILEINFO_MIME_ENCODING",MAGIC_MIME_ENCODING, CONST_CS|CONST_PERSISTENT);
                    234: /*     REGISTER_LONG_CONSTANT("FILEINFO_COMPRESS",             MAGIC_COMPRESS, CONST_CS|CONST_PERSISTENT); disabled, as it does fork now */
                    235:        REGISTER_LONG_CONSTANT("FILEINFO_DEVICES",              MAGIC_DEVICES, CONST_CS|CONST_PERSISTENT);
                    236:        REGISTER_LONG_CONSTANT("FILEINFO_CONTINUE",             MAGIC_CONTINUE, CONST_CS|CONST_PERSISTENT);
                    237: #ifdef MAGIC_PRESERVE_ATIME
                    238:        REGISTER_LONG_CONSTANT("FILEINFO_PRESERVE_ATIME",       MAGIC_PRESERVE_ATIME, CONST_CS|CONST_PERSISTENT);
                    239: #endif
                    240: #ifdef MAGIC_RAW
                    241:        REGISTER_LONG_CONSTANT("FILEINFO_RAW",                  MAGIC_RAW, CONST_CS|CONST_PERSISTENT);
                    242: #endif
                    243: 
                    244:        return SUCCESS;
                    245: }
                    246: /* }}} */
                    247: 
                    248: /* {{{ fileinfo_module_entry
                    249:  */
                    250: zend_module_entry fileinfo_module_entry = {
                    251:        STANDARD_MODULE_HEADER,
                    252:        "fileinfo",
                    253:        fileinfo_functions,
                    254:        PHP_MINIT(finfo),
                    255:        NULL,
                    256:        NULL,   
                    257:        NULL,
                    258:        PHP_MINFO(fileinfo),
                    259:        PHP_FILEINFO_VERSION,
                    260:        STANDARD_MODULE_PROPERTIES
                    261: };
                    262: /* }}} */
                    263: 
                    264: #ifdef COMPILE_DL_FILEINFO
                    265: ZEND_GET_MODULE(fileinfo)
                    266: #endif
                    267: 
                    268: /* {{{ PHP_MINFO_FUNCTION
                    269:  */
                    270: PHP_MINFO_FUNCTION(fileinfo)
                    271: {
                    272:        php_info_print_table_start();
                    273:        php_info_print_table_header(2, "fileinfo support", "enabled");
                    274:        php_info_print_table_row(2, "version", PHP_FILEINFO_VERSION);
                    275:        php_info_print_table_end();
                    276: }
                    277: /* }}} */
                    278: 
                    279: /* {{{ proto resource finfo_open([int options [, string arg]])
                    280:    Create a new fileinfo resource. */
                    281: PHP_FUNCTION(finfo_open)
                    282: {
                    283:        long options = MAGIC_NONE;
                    284:        char *file = NULL;
                    285:        int file_len = 0;
                    286:        struct php_fileinfo *finfo;
                    287:        FILEINFO_DECLARE_INIT_OBJECT(object)
                    288:        char resolved_path[MAXPATHLEN];
                    289: 
                    290:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", &options, &file, &file_len) == FAILURE) {
                    291:                RETURN_FALSE;
                    292:        }
                    293:        
                    294:        if (object) {
                    295:                struct finfo_object *finfo_obj = (struct finfo_object*)zend_object_store_get_object(object TSRMLS_CC);
                    296:                
                    297:                if (finfo_obj->ptr) {
                    298:                        magic_close(finfo_obj->ptr->magic);
                    299:                        efree(finfo_obj->ptr);
                    300:                        finfo_obj->ptr = NULL;
                    301:                }
                    302:        }
                    303: 
                    304:        if (file_len == 0) {
                    305:                file = NULL;
                    306:        } else if (file && *file) { /* user specified file, perform open_basedir checks */
                    307:                if (strlen(file) != file_len) {
                    308:                        RETURN_FALSE;
                    309:                }
                    310:                if (!VCWD_REALPATH(file, resolved_path)) {
                    311:                        RETURN_FALSE;
                    312:                }
                    313:                file = resolved_path;
                    314: 
                    315: #if PHP_API_VERSION < 20100412
                    316:                if ((PG(safe_mode) && (!php_checkuid(file, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(file TSRMLS_CC)) {
                    317: #else
                    318:                if (php_check_open_basedir(file TSRMLS_CC)) {
                    319: #endif
                    320:                        RETURN_FALSE;
                    321:                }
                    322:        }
                    323: 
                    324:        finfo = emalloc(sizeof(struct php_fileinfo));
                    325: 
                    326:        finfo->options = options;
                    327:        finfo->magic = magic_open(options);
                    328: 
                    329:        if (finfo->magic == NULL) {
                    330:                efree(finfo);
                    331:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid mode '%ld'.", options);
                    332:                RETURN_FALSE;   
                    333:        }
                    334: 
                    335:        if (magic_load(finfo->magic, file) == -1) {
                    336:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to load magic database at '%s'.", file);
                    337:                magic_close(finfo->magic);
                    338:                efree(finfo);
                    339:                RETURN_FALSE;
                    340:        }       
                    341: 
                    342:        if (object) {
                    343:                FILEINFO_REGISTER_OBJECT(object, finfo);
                    344:        } else {
                    345:                ZEND_REGISTER_RESOURCE(return_value, finfo, le_fileinfo);
                    346:        }       
                    347: }
                    348: /* }}} */
                    349: 
                    350: /* {{{ proto resource finfo_close(resource finfo)
                    351:    Close fileinfo resource. */
                    352: PHP_FUNCTION(finfo_close)
                    353: {
                    354:        struct php_fileinfo *finfo;
                    355:        zval *zfinfo;
                    356: 
                    357:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zfinfo) == FAILURE) {
                    358:                RETURN_FALSE;
                    359:        }
                    360:        ZEND_FETCH_RESOURCE(finfo, struct php_fileinfo *, &zfinfo, -1, "file_info", le_fileinfo);
                    361: 
                    362:        zend_list_delete(Z_RESVAL_P(zfinfo));
                    363: 
                    364:        RETURN_TRUE;
                    365: }
                    366: /* }}} */
                    367: 
                    368: /* {{{ proto bool finfo_set_flags(resource finfo, int options)
                    369:    Set libmagic configuration options. */
                    370: PHP_FUNCTION(finfo_set_flags)
                    371: {
                    372:        long options;
                    373:        struct php_fileinfo *finfo;
                    374:        zval *zfinfo;
                    375:        FILEINFO_DECLARE_INIT_OBJECT(object)
                    376: 
                    377:        if (object) {
                    378:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &options) == FAILURE) {
                    379:                        RETURN_FALSE;
                    380:                }
                    381:                FILEINFO_FROM_OBJECT(finfo, object);
                    382:        } else {
                    383:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &zfinfo, &options) == FAILURE) {
                    384:                        RETURN_FALSE;
                    385:                }
                    386:                ZEND_FETCH_RESOURCE(finfo, struct php_fileinfo *, &zfinfo, -1, "file_info", le_fileinfo);
                    387:        }
                    388: 
                    389:        FINFO_SET_OPTION(finfo->magic, options)
                    390:        finfo->options = options;
                    391: 
                    392:        RETURN_TRUE;
                    393: }
                    394: /* }}} */
                    395: 
                    396: #define FILEINFO_MODE_BUFFER 0
                    397: #define FILEINFO_MODE_STREAM 1
                    398: #define FILEINFO_MODE_FILE 2
                    399: 
                    400: static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode, int mimetype_emu) /* {{{ */
                    401: {
                    402:        long options = 0;
                    403:        char *ret_val = NULL, *buffer = NULL;
                    404:        int buffer_len;
                    405:        struct php_fileinfo *finfo = NULL;
                    406:        zval *zfinfo, *zcontext = NULL;
                    407:        zval *what;
                    408:        char mime_directory[] = "directory";
                    409: 
                    410:        struct magic_set *magic = NULL;
                    411:        FILEINFO_DECLARE_INIT_OBJECT(object)
                    412: 
                    413:        if (mimetype_emu) {
                    414: 
                    415:                /* mime_content_type(..) emulation */
                    416:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &what) == FAILURE) {
                    417:                        return;
                    418:                }
                    419: 
                    420:                switch (Z_TYPE_P(what)) {
                    421:                        case IS_STRING:
                    422:                                buffer = Z_STRVAL_P(what);
                    423:                                buffer_len = Z_STRLEN_P(what);
                    424:                                mode = FILEINFO_MODE_FILE;
                    425:                                break;
                    426: 
                    427:                        case IS_RESOURCE:
                    428:                                mode = FILEINFO_MODE_STREAM;
                    429:                                break;
                    430: 
                    431:                        default:
                    432:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can only process string or stream arguments");
                    433:                                RETURN_FALSE;
                    434:                }
                    435: 
                    436:                magic = magic_open(MAGIC_MIME_TYPE);
                    437:                if (magic_load(magic, NULL) == -1) {
                    438:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to load magic database.");
                    439:                        goto common;
                    440:                }
                    441:        } else if (object) {
                    442:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lr", &buffer, &buffer_len, &options, &zcontext) == FAILURE) {
                    443:                        RETURN_FALSE;
                    444:                }
                    445:                FILEINFO_FROM_OBJECT(finfo, object);
                    446:                magic = finfo->magic;
                    447:        } else {
                    448:                if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|lr", &zfinfo, &buffer, &buffer_len, &options, &zcontext) == FAILURE) {
                    449:                        RETURN_FALSE;
                    450:                }
                    451:                ZEND_FETCH_RESOURCE(finfo, struct php_fileinfo *, &zfinfo, -1, "file_info", le_fileinfo);
                    452:                magic = finfo->magic;
                    453:        }       
                    454: 
                    455:        /* Set options for the current file/buffer. */
                    456:        if (options) {
                    457:                FINFO_SET_OPTION(magic, options)
                    458:        }
                    459: 
                    460:        switch (mode) {
                    461:                case FILEINFO_MODE_BUFFER:
                    462:                {
                    463:                        ret_val = (char *) magic_buffer(magic, buffer, buffer_len);
                    464:                        break;
                    465:                }
                    466: 
                    467:                case FILEINFO_MODE_STREAM:
                    468:                {
                    469:                                php_stream *stream;
                    470:                                off_t streampos;
                    471: 
                    472:                                php_stream_from_zval_no_verify(stream, &what);
                    473:                                if (!stream) {
                    474:                                        goto common;
                    475:                                }
                    476: 
                    477:                                streampos = php_stream_tell(stream); /* remember stream position for restoration */
                    478:                                php_stream_seek(stream, 0, SEEK_SET);
                    479: 
                    480:                                ret_val = (char *) magic_stream(magic, stream);
                    481: 
                    482:                                php_stream_seek(stream, streampos, SEEK_SET);
                    483:                                break;
                    484:                }
                    485: 
                    486:                case FILEINFO_MODE_FILE:
                    487:                {
                    488:                        /* determine if the file is a local file or remote URL */
                    489:                        char *tmp2;
                    490:                        php_stream_wrapper *wrap;
                    491:                        php_stream_statbuf ssb;
                    492: 
                    493:                        if (buffer == NULL || !*buffer) {
                    494:                                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty filename or path");
                    495:                                RETVAL_FALSE;
                    496:                                goto clean;
                    497:                        }
                    498: 
                    499:                        wrap = php_stream_locate_url_wrapper(buffer, &tmp2, 0 TSRMLS_CC);
                    500: 
                    501:                        if (wrap) {
                    502:                                php_stream_context *context = php_stream_context_from_zval(zcontext, 0);
                    503: #if PHP_API_VERSION < 20100412
                    504:                                php_stream *stream = php_stream_open_wrapper_ex(buffer, "rb", ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
                    505: #else
                    506:                                php_stream *stream = php_stream_open_wrapper_ex(buffer, "rb", REPORT_ERRORS, NULL, context);
                    507: #endif
                    508: 
                    509:                                if (!stream) {
                    510:                                        RETVAL_FALSE;
                    511:                                        goto clean;
                    512:                                }
                    513: 
                    514:                                if (php_stream_stat(stream, &ssb) == SUCCESS) {
                    515:                                        if (ssb.sb.st_mode & S_IFDIR) {
                    516:                                                ret_val = mime_directory;
                    517:                                        } else {
                    518:                                                ret_val = (char *)magic_stream(magic, stream);
                    519:                                        }
                    520:                                }
                    521: 
                    522:                                php_stream_close(stream);
                    523:                        }
                    524:                        break;
                    525:                }
                    526: 
                    527:                default:
                    528:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Can only process string or stream arguments");
                    529:        }
                    530: 
                    531: common:
                    532:        if (ret_val) {
                    533:                RETVAL_STRING(ret_val, 1);
                    534:        } else {
                    535:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed identify data %d:%s", magic_errno(magic), magic_error(magic));
                    536:                RETVAL_FALSE;
                    537:        }
                    538: 
                    539: clean:
                    540:        if (mimetype_emu) {
                    541:                magic_close(magic);
                    542:        }
                    543: 
                    544:        /* Restore options */
                    545:        if (options) {
                    546:                FINFO_SET_OPTION(magic, finfo->options)
                    547:        }
                    548:        return;
                    549: }
                    550: /* }}} */
                    551: 
                    552: /* {{{ proto string finfo_file(resource finfo, char *file_name [, int options [, resource context]])
                    553:    Return information about a file. */
                    554: PHP_FUNCTION(finfo_file)
                    555: {
                    556:        _php_finfo_get_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, FILEINFO_MODE_FILE, 0);
                    557: }
                    558: /* }}} */
                    559: 
                    560: /* {{{ proto string finfo_buffer(resource finfo, char *string [, int options [, resource context]])
                    561:    Return infromation about a string buffer. */
                    562: PHP_FUNCTION(finfo_buffer)
                    563: {
                    564:        _php_finfo_get_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, FILEINFO_MODE_BUFFER, 0);
                    565: }
                    566: /* }}} */
                    567: 
                    568: /* {{{ proto string mime_content_type(string filename|resource stream)
                    569:    Return content-type for file */
                    570: PHP_FUNCTION(mime_content_type)
                    571: {
                    572:        _php_finfo_get_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, -1, 1);
                    573: }
                    574: /* }}} */
                    575: 
                    576: 
                    577: /*
                    578:  * Local variables:
                    579:  * tab-width: 4
                    580:  * c-basic-offset: 4
                    581:  * End:
                    582:  * vim600: noet sw=4 ts=4 fdm=marker
                    583:  * vim<600: noet sw=4 ts=4
                    584:  */

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