Annotation of embedaddon/php/ext/fileinfo/fileinfo.c, revision 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>