From 50081012e8dcf3c4ee4163526f684afa707c5a98 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Sat, 25 Apr 2020 11:39:01 -0700 Subject: feat: added memory mapped file reader --- sys/libn/mmap.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 sys/libn/mmap.c (limited to 'sys') diff --git a/sys/libn/mmap.c b/sys/libn/mmap.c new file mode 100644 index 0000000..d8b2a61 --- /dev/null +++ b/sys/libn/mmap.c @@ -0,0 +1,42 @@ +#include +#include + +#include + +mmap·Reader +mmap·open(byte *filename) +{ + int fd; + int err; + void *buf; + 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, .buf=buf}; + +ERROR: + io·close(s); + return (mmap·Reader){ 0 }; +} + +error +mmap·close(mmap·Reader rdr) +{ + munmap(rdr.buf, rdr.len); + + return 0; +} -- cgit v1.2.1