git-svn: update tests for recent changes
[gitweb.git] / compat / mmap.c
index fca6321ce01152c826bf977cd6b4d6b047ec57fa..a4d2e507f73c5595a2ca76c0369349cc11e2426f 100644 (file)
@@ -2,45 +2,36 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <errno.h>
-#include "../cache.h"
-
-typedef struct fakemmapwritable {
-       void *start;
-       size_t length;
-       int fd;
-       off_t offset;
-       struct fakemmapwritable *next;
-} fakemmapwritable;
-
-static fakemmapwritable *writablelist = NULL;
+#include "../git-compat-util.h"
 
 void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
 {
        int n = 0;
+       off_t current_offset = lseek(fd, 0, SEEK_CUR);
 
-       if(start != NULL)
+       if (start != NULL || !(flags & MAP_PRIVATE))
                die("Invalid usage of gitfakemmap.");
 
-       if(lseek(fd, offset, SEEK_SET)<0) {
+       if (lseek(fd, offset, SEEK_SET) < 0) {
                errno = EINVAL;
                return MAP_FAILED;
        }
 
        start = xmalloc(length);
-       if(start == NULL) {
+       if (start == NULL) {
                errno = ENOMEM;
                return MAP_FAILED;
        }
 
-       while(n < length) {
+       while (n < length) {
                int count = read(fd, start+n, length-n);
 
-               if(count == 0) {
+               if (count == 0) {
                        memset(start+n, 0, length-n);
                        break;
                }
 
-               if(count < 0) {
+               if (count < 0) {
                        free(start);
                        errno = EACCES;
                        return MAP_FAILED;
@@ -49,14 +40,9 @@ void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_
                n += count;
        }
 
-       if(prot & PROT_WRITE) {
-               fakemmapwritable *next = xmalloc(sizeof(fakemmapwritable));
-               next->start = start;
-               next->length = length;
-               next->fd = dup(fd);
-               next->offset = offset;
-               next->next = writablelist;
-               writablelist = next;
+       if (current_offset != lseek(fd, current_offset, SEEK_SET)) {
+               errno = EINVAL;
+               return MAP_FAILED;
        }
 
        return start;
@@ -64,50 +50,7 @@ void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_
 
 int gitfakemunmap(void *start, size_t length)
 {
-       fakemmapwritable *writable = writablelist, *before = NULL;
-
-       while(writable && (writable->start > start + length
-                       || writable->start + writable->length < start)) {
-               before = writable;
-               writable = writable->next;
-       }
-
-       if(writable) {
-               /* need to write back the contents */
-               int n = 0;
-
-               if(writable->start != start || writable->length != length)
-                       die("fakemmap does not support partial write back.");
-
-               if(lseek(writable->fd, writable->offset, SEEK_SET) < 0) {
-                       free(start);
-                       errno = EBADF;
-                       return -1;
-               }
-
-               while(n < length) {
-                       int count = write(writable->fd, start + n, length - n);
-
-                       if(count < 0) {
-                               errno = EINVAL;
-                               return -1;
-                       }
-
-                       n += count;
-               }
-
-               close(writable->fd);
-
-               if(before)
-                       before->next = writable->next;
-               else
-                       writablelist = writable->next;
-
-               free(writable);
-       }
-
        free(start);
-
        return 0;
 }