Skip to content

Commit

Permalink
add support for the msync syscall
Browse files Browse the repository at this point in the history
  • Loading branch information
maminrayej committed Jul 3, 2024
1 parent 3f1599f commit ddf483e
Showing 1 changed file with 45 additions and 0 deletions.
45 changes: 45 additions & 0 deletions libc-bottom-half/mman/mman.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ struct map {
int flags;
off_t offset;
size_t length;
int fd;
};

void *mmap(void *addr, size_t length, int prot, int flags,
Expand Down Expand Up @@ -90,6 +91,17 @@ void *mmap(void *addr, size_t length, int prot, int flags,
// or with zeros.
addr = map + 1;
if ((flags & MAP_ANON) == 0) {
int new_fd = dup(fd);

if (new_fd < 0) {
errno = EINVAL;
free(map);

return NULL;
}

map->fd = new_fd;

char *body = (char *)addr;
while (length > 0) {
const ssize_t nread = pread(fd, body, length, offset);
Expand Down Expand Up @@ -126,3 +138,36 @@ int munmap(void *addr, size_t length) {
// Success!
return 0;
}

int msync (void *addr, size_t length, int flags) {
struct map *map = (struct map *)addr - 1;
size_t map_flags = map->flags;
off_t map_offset = map->offset;
size_t map_length = map->length;
int fd = map->fd;

if (length > map_length) {
errno = EINVAL;
return -1;
}

if ((map_flags & MAP_ANON) == 0) {
char *body = (char *)addr;

while (length > 0) {
const ssize_t nwrite = pwrite(fd, body, length, map_offset);

if (nwrite > 0) {
length -= (size_t)nwrite;
map_offset += (size_t)nwrite;
body += (size_t)nwrite;
} else if (errno == EINTR) {
continue;
} else {
return -1;
}
}
}

return 0;
}

0 comments on commit ddf483e

Please sign in to comment.