1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 5 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2009 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 : | Author: Wez Furlong <wez@thebrainroom.com> |
16 : +----------------------------------------------------------------------+
17 : */
18 :
19 : /* $Id: mmap.c 280679 2009-05-17 14:59:24Z lbarnaud $ */
20 :
21 : /* Memory Mapping interface for streams */
22 : #include "php.h"
23 : #include "php_streams_int.h"
24 :
25 : PHPAPI char *_php_stream_mmap_range(php_stream *stream, size_t offset, size_t length, php_stream_mmap_operation_t mode, size_t *mapped_len TSRMLS_DC)
26 546 : {
27 : php_stream_mmap_range range;
28 :
29 546 : range.offset = offset;
30 546 : range.length = length;
31 546 : range.mode = mode;
32 546 : range.mapped = NULL;
33 :
34 : /* For now, we impose an arbitrary 2MB limit to avoid
35 : * runaway swapping when large files are passed thru. */
36 546 : if (length > 2 * 1024 * 1024) {
37 0 : return NULL;
38 : }
39 :
40 546 : if (PHP_STREAM_OPTION_RETURN_OK == php_stream_set_option(stream, PHP_STREAM_OPTION_MMAP_API, PHP_STREAM_MMAP_MAP_RANGE, &range)) {
41 445 : if (mapped_len) {
42 445 : *mapped_len = range.length;
43 : }
44 445 : return range.mapped;
45 : }
46 101 : return NULL;
47 : }
48 :
49 : PHPAPI int _php_stream_mmap_unmap(php_stream *stream TSRMLS_DC)
50 445 : {
51 445 : return php_stream_set_option(stream, PHP_STREAM_OPTION_MMAP_API, PHP_STREAM_MMAP_UNMAP, NULL) == PHP_STREAM_OPTION_RETURN_OK ? 1 : 0;
52 : }
53 :
54 : PHPAPI int _php_stream_mmap_unmap_ex(php_stream *stream, off_t readden TSRMLS_DC)
55 445 : {
56 445 : int ret = 1;
57 :
58 445 : if (php_stream_seek(stream, readden, SEEK_CUR) != 0) {
59 0 : ret = 0;
60 : }
61 445 : if (php_stream_mmap_unmap(stream) == 0) {
62 0 : ret = 0;
63 : }
64 :
65 445 : return ret;
66 : }
67 :
68 : /*
69 : * Local variables:
70 : * tab-width: 4
71 : * c-basic-offset: 4
72 : * End:
73 : * vim600: noet sw=4 ts=4 fdm=marker
74 : * vim<600: noet sw=4 ts=4
75 : */
|