summaryrefslogtreecommitdiff
path: root/compat/mmap.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-10-30 18:06:39 -0800
committerJunio C Hamano <junkio@cox.net>2005-10-30 18:06:39 -0800
commite634aec752642dcf86c3fc82025e43381d6768c2 (patch)
treea589b6756894d18c841ac61499e5d2c9beda36fd /compat/mmap.c
parenta1c7a69047e88244ed321b5aa2a8bcbba5a869c2 (diff)
parent80e0c0ab91e1cf6a6315d0431bf6873ebbf8bef0 (diff)
GIT 0.99.9av0.99.9a
... to contain the RPM workaround. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'compat/mmap.c')
-rw-r--r--compat/mmap.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/compat/mmap.c b/compat/mmap.c
new file mode 100644
index 0000000000..a051c4767d
--- /dev/null
+++ b/compat/mmap.c
@@ -0,0 +1,50 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include "../cache.h"
+
+void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
+{
+ int n = 0;
+
+ if (start != NULL || !(flags & MAP_PRIVATE))
+ die("Invalid usage of gitfakemmap.");
+
+ if (lseek(fd, offset, SEEK_SET) < 0) {
+ errno = EINVAL;
+ return MAP_FAILED;
+ }
+
+ start = xmalloc(length);
+ if (start == NULL) {
+ errno = ENOMEM;
+ return MAP_FAILED;
+ }
+
+ while (n < length) {
+ int count = read(fd, start+n, length-n);
+
+ if (count == 0) {
+ memset(start+n, 0, length-n);
+ break;
+ }
+
+ if (count < 0) {
+ free(start);
+ errno = EACCES;
+ return MAP_FAILED;
+ }
+
+ n += count;
+ }
+
+ return start;
+}
+
+int gitfakemunmap(void *start, size_t length)
+{
+ free(start);
+ return 0;
+}
+