From 856ede4f91a76a1a681ceac24ddb18d3a438dffb Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 13 Sep 2017 10:11:46 +0200 Subject: libio: Add iop set/clear flags Update #3132. --- cpukit/libcsupport/include/rtems/libio_.h | 40 ++++++++++++++++++++++++++++++ cpukit/libcsupport/src/close.c | 2 +- cpukit/libcsupport/src/fcntl.c | 11 ++++---- cpukit/libcsupport/src/open.c | 2 +- cpukit/libfs/src/imfs/imfs_fifo.c | 4 +-- cpukit/libfs/src/pipe/fifo.c | 2 +- cpukit/libfs/src/pipe/pipe.c | 2 +- cpukit/libnetworking/rtems/rtems_syscall.c | 2 +- cpukit/posix/src/shmopen.c | 6 ++--- 9 files changed, 56 insertions(+), 15 deletions(-) (limited to 'cpukit') diff --git a/cpukit/libcsupport/include/rtems/libio_.h b/cpukit/libcsupport/include/rtems/libio_.h index ba6866e5a4..ed5cd27c31 100644 --- a/cpukit/libcsupport/include/rtems/libio_.h +++ b/cpukit/libcsupport/include/rtems/libio_.h @@ -89,6 +89,46 @@ 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 specified flags in the iop. + * + * @param[in] iop The iop. + * @param[in] set The flags to set. + * + * @return The previous flags. + */ +static inline uint32_t rtems_libio_iop_flags_set( + rtems_libio_t *iop, + uint32_t set +) +{ + uint32_t flags; + + flags = iop->flags; + iop->flags = flags | set; + return flags; +} + +/** + * @brief Clears the specified flags in the iop. + * + * @param[in] iop The iop. + * @param[in] clear The flags to clear. + * + * @return The previous flags. + */ +static inline uint32_t rtems_libio_iop_flags_clear( + rtems_libio_t *iop, + uint32_t clear +) +{ + uint32_t flags; + + flags = iop->flags; + iop->flags = flags & ~clear; + return flags; +} + /** * @brief Maps a file descriptor to the iop. * diff --git a/cpukit/libcsupport/src/close.c b/cpukit/libcsupport/src/close.c index 139ffd266a..649107dff0 100644 --- a/cpukit/libcsupport/src/close.c +++ b/cpukit/libcsupport/src/close.c @@ -31,7 +31,7 @@ int close( iop = rtems_libio_iop(fd); rtems_libio_check_is_open(iop); - iop->flags &= ~LIBIO_FLAGS_OPEN; + rtems_libio_iop_flags_clear( iop, LIBIO_FLAGS_OPEN ); rc = (*iop->pathinfo.handlers->close_h)( iop ); diff --git a/cpukit/libcsupport/src/fcntl.c b/cpukit/libcsupport/src/fcntl.c index e7a9868980..0fe734d61c 100644 --- a/cpukit/libcsupport/src/fcntl.c +++ b/cpukit/libcsupport/src/fcntl.c @@ -33,7 +33,7 @@ static int duplicate_iop( rtems_libio_t *iop ) if (diop != NULL) { int oflag = rtems_libio_to_fcntl_flags( iop->flags ); - diop->flags |= rtems_libio_fcntl_flags( oflag ); + 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 ); @@ -75,7 +75,7 @@ static int duplicate2_iop( rtems_libio_t *iop, int fd2 ) if (rv == 0) { oflag = rtems_libio_to_fcntl_flags( iop->flags ); - iop2->flags |= rtems_libio_fcntl_flags( oflag ); + rtems_libio_iop_flags_set( iop2, rtems_libio_fcntl_flags( oflag ) ); rtems_filesystem_instance_lock( &iop->pathinfo ); rtems_filesystem_location_clone( &iop2->pathinfo, &iop->pathinfo ); @@ -145,9 +145,9 @@ static int vfcntl( */ if ( va_arg( ap, int ) ) - iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC; + rtems_libio_iop_flags_set( iop, LIBIO_FLAGS_CLOSE_ON_EXEC ); else - iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC; + rtems_libio_iop_flags_clear( iop, LIBIO_FLAGS_CLOSE_ON_EXEC ); break; case F_GETFL: /* more flags (cloexec) */ @@ -162,7 +162,8 @@ static int vfcntl( * XXX If we are turning on append, should we seek to the end? */ - iop->flags = (iop->flags & ~mask) | (flags & mask); + rtems_libio_iop_flags_clear( iop, mask ); + rtems_libio_iop_flags_set( iop, flags & mask ); break; case F_GETLK: diff --git a/cpukit/libcsupport/src/open.c b/cpukit/libcsupport/src/open.c index 62ce507284..2ee99f1f4c 100644 --- a/cpukit/libcsupport/src/open.c +++ b/cpukit/libcsupport/src/open.c @@ -96,7 +96,7 @@ static int do_open( } } - iop->flags |= rtems_libio_fcntl_flags( oflag ); + 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 ); diff --git a/cpukit/libfs/src/imfs/imfs_fifo.c b/cpukit/libfs/src/imfs/imfs_fifo.c index b97694e38a..d972b8b051 100644 --- a/cpukit/libfs/src/imfs/imfs_fifo.c +++ b/cpukit/libfs/src/imfs/imfs_fifo.c @@ -102,9 +102,9 @@ static int IMFS_fifo_ioctl( err = -EFAULT; else { if (*(int *)buffer) - iop->flags |= LIBIO_FLAGS_NO_DELAY; + rtems_libio_iop_flags_set( iop, LIBIO_FLAGS_NO_DELAY ); else - iop->flags &= ~LIBIO_FLAGS_NO_DELAY; + rtems_libio_iop_flags_clear( iop, LIBIO_FLAGS_NO_DELAY ); return 0; } } diff --git a/cpukit/libfs/src/pipe/fifo.c b/cpukit/libfs/src/pipe/fifo.c index 49694d9953..15fb0d58eb 100644 --- a/cpukit/libfs/src/pipe/fifo.c +++ b/cpukit/libfs/src/pipe/fifo.c @@ -265,7 +265,7 @@ void pipe_release( return; /* This is safe for IMFS, but how about other FSes? */ - iop->flags &= ~LIBIO_FLAGS_OPEN; + rtems_libio_iop_flags_clear( iop, LIBIO_FLAGS_OPEN ); if(iop->pathinfo.ops->unlink_h(&iop->pathinfo)) return; #endif diff --git a/cpukit/libfs/src/pipe/pipe.c b/cpukit/libfs/src/pipe/pipe.c index e46e8f58e7..8693bd489e 100644 --- a/cpukit/libfs/src/pipe/pipe.c +++ b/cpukit/libfs/src/pipe/pipe.c @@ -64,7 +64,7 @@ int pipe_create( else { /* Reset open file to blocking mode */ iop = rtems_libio_iop(filsdes[0]); - iop->flags &= ~LIBIO_FLAGS_NO_DELAY; + rtems_libio_iop_flags_clear( iop, LIBIO_FLAGS_NO_DELAY ); filsdes[1] = open(fifopath, O_WRONLY); diff --git a/cpukit/libnetworking/rtems/rtems_syscall.c b/cpukit/libnetworking/rtems/rtems_syscall.c index 9d9b64c423..a5418e7aaf 100644 --- a/cpukit/libnetworking/rtems/rtems_syscall.c +++ b/cpukit/libnetworking/rtems/rtems_syscall.c @@ -81,7 +81,7 @@ rtems_bsdnet_makeFdForSocket (void *so) rtems_set_errno_and_return_minus_one( ENFILE ); fd = rtems_libio_iop_to_descriptor(iop); - iop->flags |= LIBIO_FLAGS_WRITE | LIBIO_FLAGS_READ; + rtems_libio_iop_flags_set(iop, LIBIO_FLAGS_READ_WRITE); iop->data0 = fd; iop->data1 = so; iop->pathinfo.handlers = &socket_handlers; diff --git a/cpukit/posix/src/shmopen.c b/cpukit/posix/src/shmopen.c index e729f9bd4e..e00869e30d 100644 --- a/cpukit/posix/src/shmopen.c +++ b/cpukit/posix/src/shmopen.c @@ -275,11 +275,11 @@ int shm_open( const char *name, int oflag, mode_t mode ) } fd = rtems_libio_iop_to_descriptor( iop ); - iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC; + rtems_libio_iop_flags_set( iop, LIBIO_FLAGS_CLOSE_ON_EXEC ); if ( oflag & O_RDONLY ) { - iop->flags |= LIBIO_FLAGS_READ; + rtems_libio_iop_flags_set( iop, LIBIO_FLAGS_READ ); } else { - iop->flags |= LIBIO_FLAGS_READ_WRITE; + rtems_libio_iop_flags_set( iop, LIBIO_FLAGS_READ_WRITE ); } iop->data0 = fd; iop->data1 = shm; -- cgit v1.2.3