From ce05175372a9ddca1a225db0765ace1127a39293 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Fri, 12 Nov 2021 09:22:01 -0800 Subject: chore: simplified organizational structure --- src/base/mmap/internal.h | 5 +++++ src/base/mmap/mmap.c | 39 +++++++++++++++++++++++++++++++++++++++ src/base/mmap/rules.mk | 2 ++ 3 files changed, 46 insertions(+) create mode 100644 src/base/mmap/internal.h create mode 100644 src/base/mmap/mmap.c create mode 100644 src/base/mmap/rules.mk (limited to 'src/base/mmap') diff --git a/src/base/mmap/internal.h b/src/base/mmap/internal.h new file mode 100644 index 0000000..7606c7e --- /dev/null +++ b/src/base/mmap/internal.h @@ -0,0 +1,5 @@ +#pragma once + +#include +#include +#include diff --git a/src/base/mmap/mmap.c b/src/base/mmap/mmap.c new file mode 100644 index 0000000..ce3011c --- /dev/null +++ b/src/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; +} diff --git a/src/base/mmap/rules.mk b/src/base/mmap/rules.mk new file mode 100644 index 0000000..fb3cab5 --- /dev/null +++ b/src/base/mmap/rules.mk @@ -0,0 +1,2 @@ +SRCS_$(d)+=\ + $(d)/mmap/mmap.c\ -- cgit v1.2.1