xref: /PHP-5.4/main/streams/mmap.c (revision c0d060f5)
1 /*
2   +----------------------------------------------------------------------+
3   | PHP Version 5                                                        |
4   +----------------------------------------------------------------------+
5   | Copyright (c) 1997-2014 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$ */
20 
21 /* Memory Mapping interface for streams */
22 #include "php.h"
23 #include "php_streams_int.h"
24 
_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)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 {
27 	php_stream_mmap_range range;
28 
29 	range.offset = offset;
30 	range.length = length;
31 	range.mode = mode;
32 	range.mapped = NULL;
33 
34 	/* For now, we impose an arbitrary limit to avoid
35 	 * runaway swapping when large files are passed thru. */
36 	if (length > 4 * 1024 * 1024) {
37 		return NULL;
38 	}
39 
40 	if (PHP_STREAM_OPTION_RETURN_OK == php_stream_set_option(stream, PHP_STREAM_OPTION_MMAP_API, PHP_STREAM_MMAP_MAP_RANGE, &range)) {
41 		if (mapped_len) {
42 			*mapped_len = range.length;
43 		}
44 		return range.mapped;
45 	}
46 	return NULL;
47 }
48 
_php_stream_mmap_unmap(php_stream * stream TSRMLS_DC)49 PHPAPI int _php_stream_mmap_unmap(php_stream *stream TSRMLS_DC)
50 {
51 	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 
_php_stream_mmap_unmap_ex(php_stream * stream,off_t readden TSRMLS_DC)54 PHPAPI int _php_stream_mmap_unmap_ex(php_stream *stream, off_t readden TSRMLS_DC)
55 {
56 	int ret = 1;
57 
58 	if (php_stream_seek(stream, readden, SEEK_CUR) != 0) {
59 		ret = 0;
60 	}
61 	if (php_stream_mmap_unmap(stream) == 0) {
62 		ret = 0;
63 	}
64 
65 	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  */
76