summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/munmap.c
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2017-03-13 12:00:35 -0400
committerGedare Bloom <gedare@rtems.org>2017-05-05 10:34:08 -0400
commit8290f95cbdd5129561d8a375a223055ee7941116 (patch)
tree96d25c735f662d0bed0044d5dc88976b0e8e341b /cpukit/posix/src/munmap.c
parentposix/shm: replace threadq with mutex (allocator lock) (diff)
downloadrtems-8290f95cbdd5129561d8a375a223055ee7941116.tar.bz2
posix: Add mmap/unmap support for mapping files.
This version of mmap comes from early work done on the RTL code base circa 2012. Update #2859.
Diffstat (limited to 'cpukit/posix/src/munmap.c')
-rw-r--r--cpukit/posix/src/munmap.c68
1 files changed, 54 insertions, 14 deletions
diff --git a/cpukit/posix/src/munmap.c b/cpukit/posix/src/munmap.c
index 2496c27ab3..d3687dfef4 100644
--- a/cpukit/posix/src/munmap.c
+++ b/cpukit/posix/src/munmap.c
@@ -1,28 +1,68 @@
-/**
- * @file
- */
-
/*
- * COPYRIGHT (c) 2014.
- * On-Line Applications Research Corporation (OAR).
+ * Copyright (c) 2012 Chris Johns (chrisj@rtems.org)
*
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
+#include <rtems.h>
+#include <errno.h>
+#include <stdlib.h>
#include <sys/mman.h>
+#include <rtems/posix/mmanimpl.h>
+
int munmap(
- void *addr,
- size_t length
+ void *addr, size_t len
)
{
- (void) addr;
- (void) length;
- return -1;
+ mmap_mapping* mapping;
+ rtems_chain_node* node;
+
+ /*
+ * Clear errno.
+ */
+ errno = 0;
+
+ /*
+ * Length cannot be 0.
+ */
+ if ( len == 0 ) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /*
+ * Obtain the mmap lock. Sets errno on failure.
+ */
+ if ( !mmap_mappings_lock_obtain( ))
+ return -1;
+
+ node = rtems_chain_first (&mmap_mappings);
+ while ( !rtems_chain_is_tail( &mmap_mappings, node )) {
+ /*
+ * If the map is fixed see if this address is already mapped. At this
+ * point in time if there is an overlap in the mappings we return an
+ * error.
+ */
+ mapping = (mmap_mapping*) node;
+ if ( ( addr >= mapping->addr ) &&
+ ( addr < ( mapping->addr + mapping->len )) ) {
+ rtems_chain_extract( node );
+ if (( mapping->flags & MAP_FIXED ) != MAP_FIXED ) {
+ free( mapping->addr );
+ free( mapping );
+ }
+ break;
+ }
+ node = rtems_chain_next( node );
+ }
+
+ mmap_mappings_lock_release( );
+ return 0;
}