X-Git-Url: http://git.thejh.net/?p=libjh.git;a=blobdiff_plain;f=io.c;h=a7696f9f7fd74c277b7914483d81c8ad8b7213b8;hp=1a2ddd679cd8bbf9b1e56b5ac6aa510803893c36;hb=483ad7514b32f4557c8866bbde2091aed69e98b4;hpb=52b17fa113152cb5549772255e2e3ffe66211c81 diff --git a/io.c b/io.c index 1a2ddd6..a7696f9 100644 --- a/io.c +++ b/io.c @@ -9,6 +9,8 @@ HEADER #include #include #include #include +#include +#include // Wrapper for `read` that retries on partial reads. // If last_res is non-NULL, it will be filled with the @@ -138,3 +140,19 @@ PUBLIC_FN int write_file(char *path, char *buf, ssize_t len, int open_flags) { if (close_res) return 1; return 0; } + +PUBLIC_FN void *mmap_file(void *addr, size_t length, int prot, int flags, char *path, off_t offset) { + assert((flags&MAP_ANONYMOUS) == 0); + assert(prot&(PROT_EXEC|PROT_READ|PROT_WRITE)); + int open_flags = O_CLOEXEC; + if ((prot & (PROT_READ|PROT_EXEC)) && !(prot&PROT_WRITE)) open_flags |= O_RDONLY; + else if ((prot & (PROT_READ|PROT_EXEC))) open_flags |= O_RDWR; + else open_flags |= O_WRONLY; + int fd = open(path, open_flags); + if (fd == -1) return NULL; + void *r = mmap(addr, length, prot, flags, fd, offset); + int errno_ = errno; + close(fd); + errno = errno_; + return (r==MAP_FAILED) ? NULL : r; +}