Merge svn changes up to r30185
[mplayer/glamo.git] / osdep / mmap_anon.c
blobd5b3a3dd2f2229ec86c53d53a1644f469f5e8fa8
1 /*
2 * This file is part of MPlayer.
4 * MPlayer is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * MPlayer is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 /**
20 * \file mmap_anon.c
21 * \brief Provide a compatible anonymous space mapping function
23 #include "config.h"
25 #include <stdio.h>
26 #include <unistd.h>
27 #include <fcntl.h>
28 #include <sys/mman.h>
30 #include "mmap_anon.h"
32 #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
33 #define MAP_ANONYMOUS MAP_ANON
34 #endif
37 * mmap() anonymous space, depending on the system's mmap() style. On systems
38 * that use the /dev/zero mapping idiom, zerofd will be set to the file descriptor
39 * of the opened /dev/zero.
42 /**
43 * \brief mmap() anonymous space, depending on the system's mmap() style. On systems
44 * that use the /dev/zero mapping idiom, zerofd will be set to the file descriptor
45 * of the opened /dev/zero.
47 * \param addr address to map at.
48 * \param len number of bytes from addr to be mapped.
49 * \param prot protections (region accessibility).
50 * \param flags specifies the type of the mapped object.
51 * \param offset start mapping at byte offset.
52 * \param zerofd
53 * \return a pointer to the mapped region upon successful completion, -1 otherwise.
55 void *mmap_anon(void *addr, size_t len, int prot, int flags, off_t offset)
57 void *result;
59 /* From loader/ext.c:
60 * "Linux EINVAL's on us if we don't pass MAP_PRIVATE to an anon mmap"
61 * Therefore we preserve the same behavior on all platforms, ie. no
62 * shared mappings of anon space (if the concepts are supported). */
63 #if defined(MAP_SHARED) && defined(MAP_PRIVATE)
64 flags = (flags & ~MAP_SHARED) | MAP_PRIVATE;
65 #endif /* defined(MAP_SHARED) && defined(MAP_PRIVATE) */
67 #ifdef MAP_ANONYMOUS
68 /* BSD-style anonymous mapping */
69 result = mmap(addr, len, prot, flags | MAP_ANONYMOUS, -1, offset);
70 #else
71 /* SysV-style anonymous mapping */
72 int fd;
73 fd = open("/dev/zero", O_RDWR);
74 if(fd < 0){
75 perror( "Cannot open /dev/zero for READ+WRITE. Check permissions! error: ");
76 return NULL;
79 result = mmap(addr, len, prot, flags, fd, offset);
80 close(fd);
81 #endif /* MAP_ANONYMOUS */
83 return result;