[rtems commit] libio: Add rtems_libio_iop_flags_initialize()

Sebastian Huber sebh at rtems.org
Fri Sep 15 08:59:48 UTC 2017


Module:    rtems
Branch:    master
Commit:    ca90c6c1db3881ce5a44e06610a29a128e5455f2
Changeset: http://git.rtems.org/rtems/commit/?id=ca90c6c1db3881ce5a44e06610a29a128e5455f2

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Sep 13 14:00:50 2017 +0200

libio: Add rtems_libio_iop_flags_initialize()

Update #3132.

---

 cpukit/libcsupport/include/rtems/libio_.h  | 18 ++++++++++++++++++
 cpukit/libcsupport/src/fcntl.c             | 15 +++++++++------
 cpukit/libcsupport/src/libio.c             |  1 -
 cpukit/libcsupport/src/open.c              |  5 ++++-
 cpukit/libnetworking/rtems/rtems_syscall.c |  2 +-
 cpukit/posix/src/shmopen.c                 | 16 ++++++++++------
 6 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/cpukit/libcsupport/include/rtems/libio_.h b/cpukit/libcsupport/include/rtems/libio_.h
index ed5cd27..0e12803 100644
--- a/cpukit/libcsupport/include/rtems/libio_.h
+++ b/cpukit/libcsupport/include/rtems/libio_.h
@@ -90,6 +90,24 @@ extern rtems_filesystem_mount_table_entry_t rtems_filesystem_null_mt_entry;
 extern rtems_filesystem_global_location_t rtems_filesystem_global_location_null;
 
 /**
+ * @brief Sets the iop flags to the specified flags together with
+ * LIBIO_FLAGS_OPEN.
+ *
+ * Use this once a file descriptor allocated via rtems_libio_allocate() is
+ * fully initialized.
+ *
+ * @param[in] iop The iop.
+ * @param[in] flags The flags.
+ */
+static inline void rtems_libio_iop_flags_initialize(
+  rtems_libio_t *iop,
+  uint32_t       flags
+)
+{
+  iop->flags = LIBIO_FLAGS_OPEN | flags;
+}
+
+/**
  * @brief Sets the specified flags in the iop.
  *
  * @param[in] iop The iop.
diff --git a/cpukit/libcsupport/src/fcntl.c b/cpukit/libcsupport/src/fcntl.c
index 0fe734d..8205201 100644
--- a/cpukit/libcsupport/src/fcntl.c
+++ b/cpukit/libcsupport/src/fcntl.c
@@ -26,15 +26,14 @@
 
 static int duplicate_iop( rtems_libio_t *iop )
 {
-  int rv = 0;
+  int            rv;
+  int            oflag;
+  rtems_libio_t *diop;
 
-  rtems_libio_t *diop = rtems_libio_allocate();
+  oflag = rtems_libio_to_fcntl_flags( iop->flags );
+  diop = rtems_libio_allocate();
 
   if (diop != NULL) {
-    int oflag = rtems_libio_to_fcntl_flags( iop->flags );
-
-    rtems_libio_iop_flags_set( diop, rtems_libio_fcntl_flags( oflag ) );
-
     rtems_filesystem_instance_lock( &iop->pathinfo );
     rtems_filesystem_location_clone( &diop->pathinfo, &iop->pathinfo );
     rtems_filesystem_instance_unlock( &iop->pathinfo );
@@ -46,6 +45,10 @@ static int duplicate_iop( rtems_libio_t *iop )
      */
     rv = (*diop->pathinfo.handlers->open_h)( diop, NULL, oflag, 0 );
     if ( rv == 0 ) {
+      rtems_libio_iop_flags_initialize(
+        diop,
+        rtems_libio_fcntl_flags( oflag )
+      );
       rv = rtems_libio_iop_to_descriptor( diop );
     } else {
       rtems_libio_free( diop );
diff --git a/cpukit/libcsupport/src/libio.c b/cpukit/libcsupport/src/libio.c
index cd3a442..0cc2b98 100644
--- a/cpukit/libcsupport/src/libio.c
+++ b/cpukit/libcsupport/src/libio.c
@@ -116,7 +116,6 @@ rtems_libio_t *rtems_libio_allocate( void )
     iop = rtems_libio_iop_freelist;
     rtems_libio_iop_freelist = iop->data1;
     memset( iop, 0, sizeof(*iop) );
-    iop->flags = LIBIO_FLAGS_OPEN;
   }
 
   rtems_libio_unlock();
diff --git a/cpukit/libcsupport/src/open.c b/cpukit/libcsupport/src/open.c
index 2ee99f1..2277345 100644
--- a/cpukit/libcsupport/src/open.c
+++ b/cpukit/libcsupport/src/open.c
@@ -96,13 +96,16 @@ static int do_open(
     }
   }
 
-  rtems_libio_iop_flags_set( iop, rtems_libio_fcntl_flags( oflag ) );
   rtems_filesystem_eval_path_extract_currentloc( &ctx, &iop->pathinfo );
   rtems_filesystem_eval_path_cleanup( &ctx );
 
+  iop->flags = rtems_libio_fcntl_flags( oflag );
+
   rv = (*iop->pathinfo.handlers->open_h)( iop, path, oflag, mode );
 
   if ( rv == 0 ) {
+    rtems_libio_iop_flags_set( iop, LIBIO_FLAGS_OPEN );
+
     if ( truncate ) {
       rv = ftruncate( fd, 0 );
       if ( rv != 0 ) {
diff --git a/cpukit/libnetworking/rtems/rtems_syscall.c b/cpukit/libnetworking/rtems/rtems_syscall.c
index a5418e7..e180320 100644
--- a/cpukit/libnetworking/rtems/rtems_syscall.c
+++ b/cpukit/libnetworking/rtems/rtems_syscall.c
@@ -81,12 +81,12 @@ rtems_bsdnet_makeFdForSocket (void *so)
       rtems_set_errno_and_return_minus_one( ENFILE );
 
   fd = rtems_libio_iop_to_descriptor(iop);
-  rtems_libio_iop_flags_set(iop, LIBIO_FLAGS_READ_WRITE);
   iop->data0 = fd;
   iop->data1 = so;
   iop->pathinfo.handlers = &socket_handlers;
   iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
   rtems_filesystem_location_add_to_mt_entry(&iop->pathinfo);
+  rtems_libio_iop_flags_initialize(iop, LIBIO_FLAGS_READ_WRITE);
   return fd;
 }
 
diff --git a/cpukit/posix/src/shmopen.c b/cpukit/posix/src/shmopen.c
index e00869e..f6c9f58 100644
--- a/cpukit/posix/src/shmopen.c
+++ b/cpukit/posix/src/shmopen.c
@@ -225,6 +225,7 @@ int shm_open( const char *name, int oflag, mode_t mode )
   POSIX_Shm_Control *shm;
   size_t len;
   Objects_Get_by_name_error obj_err;
+  uint32_t flags;
 
   if ( shm_check_oflag( oflag ) != 0 ) {
     return -1;
@@ -275,12 +276,6 @@ int shm_open( const char *name, int oflag, mode_t mode )
   }
 
   fd = rtems_libio_iop_to_descriptor( iop );
-  rtems_libio_iop_flags_set( iop, LIBIO_FLAGS_CLOSE_ON_EXEC );
-  if ( oflag & O_RDONLY ) {
-    rtems_libio_iop_flags_set( iop, LIBIO_FLAGS_READ );
-  } else {
-    rtems_libio_iop_flags_set( iop, LIBIO_FLAGS_READ_WRITE );
-  }
   iop->data0 = fd;
   iop->data1 = shm;
   iop->pathinfo.node_access = shm;
@@ -288,6 +283,15 @@ int shm_open( const char *name, int oflag, mode_t mode )
   iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
   rtems_filesystem_location_add_to_mt_entry( &iop->pathinfo );
 
+  flags = LIBIO_FLAGS_CLOSE_ON_EXEC;
+  if ( oflag & O_RDONLY ) {
+    flags |= LIBIO_FLAGS_READ;
+  } else {
+    flags |= LIBIO_FLAGS_READ_WRITE;
+  }
+
+  rtems_libio_iop_flags_initialize( iop, flags );
+
   return fd;
 }
 



More information about the vc mailing list