#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; | |
} | |