aboutsummaryrefslogtreecommitdiff
path: root/sys/base/mmap/mmap.c
blob: ce3011c80cfd727842956cd00fd7010a3c5624f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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;
}