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>