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