xref: /netbsd-src/external/bsd/nvi/dist/clib/mmap.c (revision dbd550ed1a6686d6600f748306f9cc03d8cd4c94)
1*dbd550edSchristos #include "config.h"
2*dbd550edSchristos 
3*dbd550edSchristos #include <sys/types.h>
4*dbd550edSchristos 
5*dbd550edSchristos #include <stdlib.h>
6*dbd550edSchristos #include <unistd.h>
7*dbd550edSchristos 
8*dbd550edSchristos /*
9*dbd550edSchristos  * This function fakes mmap() by reading `len' bytes from the file descriptor
10*dbd550edSchristos  * `fd' and returning a pointer to that memory.  The "mapped" region can later
11*dbd550edSchristos  * be deallocated with munmap().
12*dbd550edSchristos  *
13*dbd550edSchristos  * Note: ONLY reading is supported and only reading of the exact size of the
14*dbd550edSchristos  * file will work.
15*dbd550edSchristos  *
16*dbd550edSchristos  * PUBLIC: #ifndef HAVE_MMAP
17*dbd550edSchristos  * PUBLIC: char *mmap __P((char *, size_t, int, int, int, off_t));
18*dbd550edSchristos  * PUBLIC: #endif
19*dbd550edSchristos  */
20*dbd550edSchristos char *
mmap(char * addr,size_t len,int prot,int flags,int fd,off_t off)21*dbd550edSchristos mmap(char *addr, size_t len, int prot, int flags, int fd, off_t off)
22*dbd550edSchristos {
23*dbd550edSchristos 	char *ptr;
24*dbd550edSchristos 
25*dbd550edSchristos 	if ((ptr = (char *)malloc(len)) == 0)
26*dbd550edSchristos 		return ((char *)-1);
27*dbd550edSchristos 	if (read(fd, ptr, len) < 0) {
28*dbd550edSchristos 		free(ptr);
29*dbd550edSchristos 		return ((char *)-1);
30*dbd550edSchristos 	}
31*dbd550edSchristos 	return (ptr);
32*dbd550edSchristos }
33*dbd550edSchristos 
34*dbd550edSchristos /*
35*dbd550edSchristos  * PUBLIC: #ifndef HAVE_MMAP
36*dbd550edSchristos  * PUBLIC: int munmap __P((char *, size_t));
37*dbd550edSchristos  * PUBLIC: #endif
38*dbd550edSchristos  */
39*dbd550edSchristos int
munmap(char * addr,size_t len)40*dbd550edSchristos munmap(char *addr, size_t len)
41*dbd550edSchristos {
42*dbd550edSchristos 	free(addr);
43*dbd550edSchristos 	return (0);
44*dbd550edSchristos }
45