summaryrefslogtreecommitdiffstats
path: root/testsuites/psxtests/psxshm01/init.c
diff options
context:
space:
mode:
authorGedare Bloom <gedare@rtems.org>2016-08-12 15:25:10 -0400
committerGedare Bloom <gedare@rtems.org>2017-01-13 11:17:30 -0500
commitba77628250ae7158db363fc0d7886ebd43e9cb69 (patch)
tree91a8a5b7d20399c69c5c88223a43ec681451996b /testsuites/psxtests/psxshm01/init.c
parentposix: fix typo in mmap arguments (diff)
downloadrtems-ba77628250ae7158db363fc0d7886ebd43e9cb69.tar.bz2
posix: shared memory support
Add POSIX shared memory manager (Shm). Includes a hook-based approach for the backing memory storage that defaults to the Workspace, and a test is provided using the heap. A test is also provided for the basic use of mmap'ing a shared memory object. This test currently fails at the mmap stage due to no support for mmap.
Diffstat (limited to 'testsuites/psxtests/psxshm01/init.c')
-rw-r--r--testsuites/psxtests/psxshm01/init.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/testsuites/psxtests/psxshm01/init.c b/testsuites/psxtests/psxshm01/init.c
new file mode 100644
index 0000000000..24c9b9629f
--- /dev/null
+++ b/testsuites/psxtests/psxshm01/init.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2016 Gedare Bloom.
+ *
+ * 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.
+ */
+
+/*
+ * From http://pubs.opengroup.org/onlinepubs/9699919799/functions/shm_open.html
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include "pritime.h"
+
+#include <sys/mman.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+
+const char rtems_test_name[] = "PSX SHM01";
+
+#define MAX_LEN 10000
+struct region { /* Defines "structure" of shared memory */
+ int len;
+ char buf[MAX_LEN];
+};
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ struct region *p;
+ int fd;
+ int err;
+ char *name = "/shm";
+
+ TEST_BEGIN();
+
+ puts( "Init: shm_open" );
+ fd = shm_open( name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR );
+ if ( fd == -1 ) {
+ printf ( "Error: %s\n", strerror(errno) );
+ rtems_test_assert( fd != -1 );
+ }
+
+ puts( "Init: ftruncate" );
+ err = ftruncate( fd, sizeof( struct region ) );
+ if ( err == -1 ) {
+ printf ( "Error: %s\n", strerror(errno) );
+ rtems_test_assert( err != -1 );
+ }
+
+ puts( "Init: mmap" );
+ p = mmap(
+ NULL,
+ sizeof( struct region ),
+ PROT_READ | PROT_WRITE, MAP_SHARED,
+ fd,
+ 0
+ );
+ rtems_test_assert( p != MAP_FAILED );
+
+ puts( "Init: write to mapped region" );
+ p->len = MAX_LEN;
+
+ puts( "Init: munmap" );
+ err = munmap( p, sizeof( struct region ) );
+ if ( err == -1 ) {
+ printf ( "Error: %s\n", strerror(errno) );
+ rtems_test_assert( err != -1 );
+ }
+
+ puts( "Init: close" );
+ err = close( fd );
+ if ( err == -1 ) {
+ printf ( "Error: %s\n", strerror(errno) );
+ rtems_test_assert( err != -1 );
+ }
+
+ TEST_END();
+
+ rtems_test_exit(0);
+ return 0;
+}