summaryrefslogtreecommitdiffstats
path: root/compat/mmap.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 14:47:53 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 14:47:53 +0000
commitc8bae7493d2f2910b57f13ded012e86bdcfb0532 (patch)
tree24e09d9f84dec336720cf393e156089ca2835791 /compat/mmap.c
parentInitial commit. (diff)
downloadgit-c8bae7493d2f2910b57f13ded012e86bdcfb0532.tar.xz
git-c8bae7493d2f2910b57f13ded012e86bdcfb0532.zip
Adding upstream version 1:2.39.2.upstream/1%2.39.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compat/mmap.c')
-rw-r--r--compat/mmap.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/compat/mmap.c b/compat/mmap.c
new file mode 100644
index 0000000..2fe1c77
--- /dev/null
+++ b/compat/mmap.c
@@ -0,0 +1,45 @@
+#include "../git-compat-util.h"
+
+void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)
+{
+ size_t n = 0;
+
+ if (start != NULL || flags != MAP_PRIVATE || prot != PROT_READ)
+ die("Invalid usage of mmap when built with NO_MMAP");
+
+ if (length == 0) {
+ errno = EINVAL;
+ return MAP_FAILED;
+ }
+
+ start = malloc(length);
+ if (!start) {
+ errno = ENOMEM;
+ return MAP_FAILED;
+ }
+
+ while (n < length) {
+ ssize_t count = xpread(fd, (char *)start + n, length - n, offset + n);
+
+ if (count == 0) {
+ memset((char *)start+n, 0, length-n);
+ break;
+ }
+
+ if (count < 0) {
+ free(start);
+ errno = EACCES;
+ return MAP_FAILED;
+ }
+
+ n += count;
+ }
+
+ return start;
+}
+
+int git_munmap(void *start, size_t length)
+{
+ free(start);
+ return 0;
+}