/src/libgit2/src/util/unix/map.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright (C) the libgit2 contributors. All rights reserved. |
3 | | * |
4 | | * This file is part of libgit2, distributed under the GNU GPL v2 with |
5 | | * a Linking Exception. For full terms see the included COPYING file. |
6 | | */ |
7 | | |
8 | | #include "git2_util.h" |
9 | | |
10 | | #if !defined(GIT_WIN32) && !defined(NO_MMAP) |
11 | | |
12 | | #include "map.h" |
13 | | #include <sys/mman.h> |
14 | | #include <unistd.h> |
15 | | #include <errno.h> |
16 | | |
17 | | int git__page_size(size_t *page_size) |
18 | 2 | { |
19 | 2 | long sc_page_size = sysconf(_SC_PAGE_SIZE); |
20 | 2 | if (sc_page_size < 0) { |
21 | 0 | git_error_set(GIT_ERROR_OS, "can't determine system page size"); |
22 | 0 | return -1; |
23 | 0 | } |
24 | 2 | *page_size = (size_t) sc_page_size; |
25 | 2 | return 0; |
26 | 2 | } |
27 | | |
28 | | int git__mmap_alignment(size_t *alignment) |
29 | 0 | { |
30 | 0 | return git__page_size(alignment); |
31 | 0 | } |
32 | | |
33 | | int p_mmap(git_map *out, size_t len, int prot, int flags, int fd, off64_t offset) |
34 | 7.43k | { |
35 | 7.43k | int mprot = PROT_READ; |
36 | 7.43k | int mflag = 0; |
37 | | |
38 | 7.43k | GIT_MMAP_VALIDATE(out, len, prot, flags); |
39 | | |
40 | 7.43k | out->data = NULL; |
41 | 7.43k | out->len = 0; |
42 | | |
43 | 7.43k | if (prot & GIT_PROT_WRITE) |
44 | 0 | mprot |= PROT_WRITE; |
45 | | |
46 | 7.43k | if ((flags & GIT_MAP_TYPE) == GIT_MAP_SHARED) |
47 | 7.43k | mflag = MAP_SHARED; |
48 | 0 | else if ((flags & GIT_MAP_TYPE) == GIT_MAP_PRIVATE) |
49 | 0 | mflag = MAP_PRIVATE; |
50 | 0 | else |
51 | 0 | mflag = MAP_SHARED; |
52 | | |
53 | 7.43k | out->data = mmap(NULL, len, mprot, mflag, fd, offset); |
54 | | |
55 | 7.43k | if (!out->data || out->data == MAP_FAILED) { |
56 | 0 | git_error_set(GIT_ERROR_OS, "failed to mmap. Could not write data"); |
57 | 0 | return -1; |
58 | 0 | } |
59 | | |
60 | 7.43k | out->len = len; |
61 | | |
62 | 7.43k | return 0; |
63 | 7.43k | } |
64 | | |
65 | | int p_munmap(git_map *map) |
66 | 7.43k | { |
67 | 7.43k | GIT_ASSERT_ARG(map); |
68 | 7.43k | munmap(map->data, map->len); |
69 | 7.43k | map->data = NULL; |
70 | 7.43k | map->len = 0; |
71 | | |
72 | 7.43k | return 0; |
73 | 7.43k | } |
74 | | |
75 | | #endif |
76 | | |