X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fmmap.c;h=aa63622259d50034fce4b774dc600c92dcf1828b;hb=359bfe46342e7ae719dbea0c254807b4b9ad54a4;hp=47147310ecf018fec0589168fe47a877d3253d50;hpb=b8b4146a066884ae9493d1642ae2a70412b2a5ca;p=libucw.git diff --git a/lib/mmap.c b/lib/mmap.c index 47147310..aa636222 100644 --- a/lib/mmap.c +++ b/lib/mmap.c @@ -1,36 +1,47 @@ /* - * Sherlock Library -- Mapping of Files + * UCW Library -- Mapping of Files * - * (c) 1999 Martin Mares, + * (c) 1999--2002 Martin Mares + * + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. */ +#include "lib/lib.h" + #include #include #include #include #include -#include "lib.h" - void * -mmap_file(byte *name, unsigned *len) +mmap_file(byte *name, unsigned *len, int writeable) { - int fd = open(name, O_RDONLY); + int fd = open(name, writeable ? O_RDWR : O_RDONLY); struct stat st; void *x; if (fd < 0) - return NULL; + die("open(%s): %m", name); if (fstat(fd, &st) < 0) - x = NULL; - else + die("fstat(%s): %m", name); + if (len) + *len = st.st_size; + if (st.st_size) { - if (len) - *len = st.st_size; - x = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); + x = mmap(NULL, st.st_size, writeable ? (PROT_READ | PROT_WRITE) : PROT_READ, MAP_SHARED, fd, 0); if (x == MAP_FAILED) - x = NULL; + die("mmap(%s): %m", name); } + else /* For empty file, we can return any non-zero address */ + x = ""; close(fd); return x; } + +void +munmap_file(void *start, unsigned len) +{ + munmap(start, len); +}