diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-11-11 16:31:58 -0800 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-11-11 16:31:58 -0800 |
commit | 9695ea005d4af93dcd60f74f10fd3c54499a182f (patch) | |
tree | 3e1a9abb9456ba07c0c97cd3d691f6a2df115791 /sys/base/mmap/mmap.c | |
parent | c65794b50b1bc729e7a4e940b76a973afa3030b9 (diff) |
chore: split up base library into individual files for smaller binaries
Diffstat (limited to 'sys/base/mmap/mmap.c')
-rw-r--r-- | sys/base/mmap/mmap.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/sys/base/mmap/mmap.c b/sys/base/mmap/mmap.c new file mode 100644 index 0000000..ce3011c --- /dev/null +++ b/sys/base/mmap/mmap.c @@ -0,0 +1,39 @@ +#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; +} |