#include "internal.h" mmap·Reader mmap·open(byte *filename) { int err; void *buf; io·Buffer io; sys·Info info; mmap·Reader rdr = {0}; if(io·open(filename, sys·ORead, &io)){ errorf("failed to open %s", filename); goto done; } if(sys·infofd(io.fd, &info)){ errorf("file stat: error code %d", err); goto done; } if(sys·mmap(nil, info.size, sys·ProtRead, sys·MapShared, io.fd, 0, &buf)){ errorf("mmap: failed"); goto done; } // NOTE: posix systems require that reference kept to mmap file after fd is closed rdr = (mmap·Reader){.len=info.size, .b=buf}; done: io·close((io·Header*)&io); return rdr; } int mmap·close(mmap·Reader rdr) { sys·munmap(rdr.b, rdr.len); return 0; }