#include "internal.h" mmap·Reader mmap·open(byte *filename) { int fd; int err; void *buf; io·Stream *s; io·Stat st; s = io·open(filename, "r"); fd = io·fd(s); err = io·stat(s, &st); if(err){ errorf("file stat: error code %d", err); goto ERROR; } buf = mmap(nil, st.st_size, PROT_READ, MAP_SHARED, fd, 0); if(!buf){ errorf("mmap: failed"); goto ERROR; } // NOTE: posix systems require that reference kept to mmap file after fd is closed io·close(s); return (mmap·Reader){.len=st.st_size, .b=buf}; ERROR: io·close(s); return (mmap·Reader){ 0 }; } error mmap·close(mmap·Reader rdr) { munmap(rdr.b, rdr.len); return 0; }