File: xmap.c

package info (click to toggle)
diablo 1.13-1
  • links: PTS
  • area: non-free
  • in suites: hamm
  • size: 804 kB
  • ctags: 875
  • sloc: ansic: 8,308; perl: 1,908; sh: 186; csh: 81; makefile: 67
file content (59 lines) | stat: -rw-r--r-- 1,273 bytes parent folder | download | duplicates (2)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

/*
 * LIB/XMAP.C
 *
 * Some machines fail if mmap() is passed with odd arguments.  The xmap() calls
 * page-align everything, allowing non-aligned offsets and sizes to be 
 * requested.
 */

#include "defs.h"

Prototype void *xmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
Prototype void xunmap(void *addr, size_t len);

static int XPageMask;

void *
xmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
{
    int n;
    void *ptr;
    struct stat st;

    if (XPageMask == 0)
	XPageMask = getpagesize() - 1;
    n = offset & XPageMask;
    offset -= n;
    len += n;
    len = (len + XPageMask) & ~XPageMask;

    st.st_size = 0;
    fstat(fd, &st);
    if (offset + len > ((st.st_size + XPageMask) & ~XPageMask)) {
        ptr = NULL;
    } else {
        ptr = (void *)mmap((caddr_t)addr, len, prot, flags, fd, offset);
    }
    if (ptr == (void *)-1)
	ptr = NULL;
    if (ptr)
	return((char *)ptr + n);
    return(NULL);
}

void
xunmap(void *ptr, size_t len)
{
    long n;				/* assume sizeof(long) == sizeof(ptr)*/

    if (XPageMask == 0)
	XPageMask = getpagesize() - 1;
    n = (long)ptr & XPageMask;
    ptr = (char *)ptr - n;
    len += n;
    len = (len + XPageMask) & ~XPageMask;

    munmap((caddr_t)ptr, len);
}