X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=compat%2Fmmap.c;h=55cb120764da5520da7dbd91193a285551eae8bb;hb=HEAD;hp=fca6321ce01152c826bf977cd6b4d6b047ec57fa;hpb=730d48a2ef88a7fb7aa4409d40b1e6964a93267f;p=git.git diff --git a/compat/mmap.c b/compat/mmap.c index fca6321c..55cb1207 100644 --- a/compat/mmap.c +++ b/compat/mmap.c @@ -2,45 +2,35 @@ #include #include #include -#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; - 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,65 +39,12 @@ 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; - } - return start; } 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; }