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