[rtems commit] libio: LIBIO_GET_IOP() LIBIO_GET_IOP_WITH_ACCESS()
Sebastian Huber
sebh at rtems.org
Fri Sep 15 09:01:01 UTC 2017
Module: rtems
Branch: master
Commit: 9012db84f611d5c394683ddcca95354928a8b505
Changeset: http://git.rtems.org/rtems/commit/?id=9012db84f611d5c394683ddcca95354928a8b505
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Wed Sep 13 11:33:25 2017 +0200
libio: LIBIO_GET_IOP() LIBIO_GET_IOP_WITH_ACCESS()
Replace rtems_libio_check_fd(), rtems_libio_iop(),
rtems_libio_check_open() and rtems_libio_check_permissions()
combinations with new LIBIO_GET_IOP() and LIBIO_GET_IOP_WITH_ACCESS()
macros.
Update #3132.
---
cpukit/libcsupport/include/rtems/libio_.h | 78 +++++++++++++++++-------------
cpukit/libcsupport/src/close.c | 4 +-
cpukit/libcsupport/src/fchdir.c | 4 +-
cpukit/libcsupport/src/fchmod.c | 4 +-
cpukit/libcsupport/src/fchown.c | 4 +-
cpukit/libcsupport/src/fcntl.c | 9 ++--
cpukit/libcsupport/src/fdatasync.c | 5 +-
cpukit/libcsupport/src/fpathconf.c | 4 +-
cpukit/libcsupport/src/fstat.c | 4 +-
cpukit/libcsupport/src/fsync.c | 4 +-
cpukit/libcsupport/src/ftruncate.c | 5 +-
cpukit/libcsupport/src/ioctl.c | 4 +-
cpukit/libcsupport/src/lseek.c | 4 +-
cpukit/libcsupport/src/read.c | 5 +-
cpukit/libcsupport/src/write.c | 5 +-
cpukit/libnetworking/rtems/rtems_syscall.c | 3 +-
16 files changed, 63 insertions(+), 83 deletions(-)
diff --git a/cpukit/libcsupport/include/rtems/libio_.h b/cpukit/libcsupport/include/rtems/libio_.h
index 0e12803..9bf8320 100644
--- a/cpukit/libcsupport/include/rtems/libio_.h
+++ b/cpukit/libcsupport/include/rtems/libio_.h
@@ -155,8 +155,6 @@ static inline uint32_t rtems_libio_iop_flags_clear(
* @param[in] fd The file descriptor.
*
* @return The iop corresponding to the specified file descriptor.
- *
- * @see rtems_libio_check_fd().
*/
static inline rtems_libio_t *rtems_libio_iop( int fd )
{
@@ -187,19 +185,50 @@ static inline rtems_libio_t *rtems_libio_iop( int fd )
} \
} while (0)
-/*
- * rtems_libio_check_fd
- *
- * Macro to check if a file descriptor number is valid.
- */
+/**
+ * @brief Macro to get the iop for the specified file descriptor.
+ *
+ * Checks that the file descriptor is in the valid range and open.
+ */
+#define LIBIO_GET_IOP( _fd, _iop ) \
+ do { \
+ uint32_t _flags; \
+ if ( (uint32_t) ( _fd ) >= rtems_libio_number_iops ) { \
+ rtems_set_errno_and_return_minus_one( EBADF ); \
+ } \
+ _iop = rtems_libio_iop( _fd ); \
+ _flags = _iop->flags; \
+ if ( ( _flags & LIBIO_FLAGS_OPEN ) == 0 ) { \
+ rtems_set_errno_and_return_minus_one( EBADF ); \
+ } \
+ } while ( 0 )
-#define rtems_libio_check_fd(_fd) \
- do { \
- if ((uint32_t) (_fd) >= rtems_libio_number_iops) { \
- errno = EBADF; \
- return -1; \
- } \
- } while (0)
+/**
+ * @brief Macro to get the iop for the specified file descriptor with access
+ * flags and error.
+ *
+ * Checks that the file descriptor is in the valid range and open.
+ */
+#define LIBIO_GET_IOP_WITH_ACCESS( _fd, _iop, _access_flags, _access_error ) \
+ do { \
+ uint32_t _flags; \
+ uint32_t _mandatory; \
+ if ( (uint32_t) ( _fd ) >= rtems_libio_number_iops ) { \
+ rtems_set_errno_and_return_minus_one( EBADF ); \
+ } \
+ _iop = rtems_libio_iop( _fd ); \
+ _flags = _iop->flags; \
+ _mandatory = LIBIO_FLAGS_OPEN | ( _access_flags ); \
+ if ( ( _flags & _mandatory ) != _mandatory ) { \
+ int _error; \
+ if ( ( _flags & LIBIO_FLAGS_OPEN ) == 0 ) { \
+ _error = EBADF; \
+ } else { \
+ _error = _access_error; \
+ } \
+ rtems_set_errno_and_return_minus_one( _error ); \
+ } \
+ } while ( 0 )
/*
* rtems_libio_check_buffer
@@ -228,21 +257,6 @@ static inline rtems_libio_t *rtems_libio_iop( int fd )
} \
} while (0)
-/*
- * rtems_libio_check_permissions
- *
- * Macro to check if a file descriptor is open for this operation.
- * On failure, return the user specified error.
- */
-
-#define rtems_libio_check_permissions(_iop, _flag, _errno) \
- do { \
- if (((_iop)->flags & (_flag)) == 0) { \
- rtems_set_errno_and_return_minus_one( _errno ); \
- return -1; \
- } \
- } while (0)
-
/**
* @brief Clones a node.
*
@@ -951,11 +965,7 @@ static inline ssize_t rtems_libio_iovec_eval(
}
}
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open( iop );
- rtems_libio_check_permissions( iop, flags, EBADF );
-
+ LIBIO_GET_IOP_WITH_ACCESS( fd, iop, flags, EBADF );
*iopp = iop;
return total;
diff --git a/cpukit/libcsupport/src/close.c b/cpukit/libcsupport/src/close.c
index 649107d..7eaeb64 100644
--- a/cpukit/libcsupport/src/close.c
+++ b/cpukit/libcsupport/src/close.c
@@ -27,9 +27,7 @@ int close(
rtems_libio_t *iop;
int rc;
- rtems_libio_check_fd(fd);
- iop = rtems_libio_iop(fd);
- rtems_libio_check_is_open(iop);
+ LIBIO_GET_IOP( fd, iop );
rtems_libio_iop_flags_clear( iop, LIBIO_FLAGS_OPEN );
diff --git a/cpukit/libcsupport/src/fchdir.c b/cpukit/libcsupport/src/fchdir.c
index 6988cca..ece73ab 100644
--- a/cpukit/libcsupport/src/fchdir.c
+++ b/cpukit/libcsupport/src/fchdir.c
@@ -39,9 +39,7 @@ int fchdir( int fd )
st.st_uid = 0;
st.st_gid = 0;
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open( iop );
+ LIBIO_GET_IOP( fd, iop );
rtems_filesystem_instance_lock( &iop->pathinfo );
rv = (*iop->pathinfo.handlers->fstat_h)( &iop->pathinfo, &st );
diff --git a/cpukit/libcsupport/src/fchmod.c b/cpukit/libcsupport/src/fchmod.c
index 1a9122c..126b015 100644
--- a/cpukit/libcsupport/src/fchmod.c
+++ b/cpukit/libcsupport/src/fchmod.c
@@ -67,9 +67,7 @@ int fchmod( int fd, mode_t mode )
int rv;
rtems_libio_t *iop;
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open(iop);
+ LIBIO_GET_IOP( fd, iop );
rtems_filesystem_instance_lock( &iop->pathinfo );
diff --git a/cpukit/libcsupport/src/fchown.c b/cpukit/libcsupport/src/fchown.c
index 10cd4bc..bd787d8 100644
--- a/cpukit/libcsupport/src/fchown.c
+++ b/cpukit/libcsupport/src/fchown.c
@@ -64,9 +64,7 @@ int fchown( int fd, uid_t owner, gid_t group )
int rv;
rtems_libio_t *iop;
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open(iop);
+ LIBIO_GET_IOP( fd, iop );
rtems_filesystem_instance_lock( &iop->pathinfo );
diff --git a/cpukit/libcsupport/src/fcntl.c b/cpukit/libcsupport/src/fcntl.c
index d44d4a0..a7fcfbc 100644
--- a/cpukit/libcsupport/src/fcntl.c
+++ b/cpukit/libcsupport/src/fcntl.c
@@ -65,7 +65,10 @@ static int duplicate2_iop( rtems_libio_t *iop, int fd2 )
rtems_libio_t *iop2;
int rv = 0;
- rtems_libio_check_fd( fd2 );
+ if ( (uint32_t) fd2 >= rtems_libio_number_iops ) {
+ rtems_set_errno_and_return_minus_one( EBADF );
+ }
+
iop2 = rtems_libio_iop( fd2 );
if (iop != iop2)
@@ -112,9 +115,7 @@ static int vfcntl(
int mask;
int ret = 0;
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open(iop);
+ LIBIO_GET_IOP( fd, iop );
/*
* Now process the fcntl().
diff --git a/cpukit/libcsupport/src/fdatasync.c b/cpukit/libcsupport/src/fdatasync.c
index a5191c3..14e6672 100644
--- a/cpukit/libcsupport/src/fdatasync.c
+++ b/cpukit/libcsupport/src/fdatasync.c
@@ -29,10 +29,7 @@ int fdatasync(
{
rtems_libio_t *iop;
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open(iop);
- rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE, EBADF );
+ LIBIO_GET_IOP_WITH_ACCESS( fd, iop, LIBIO_FLAGS_WRITE, EBADF );
/*
* Now process the fdatasync().
diff --git a/cpukit/libcsupport/src/fpathconf.c b/cpukit/libcsupport/src/fpathconf.c
index 3cab402..db32313 100644
--- a/cpukit/libcsupport/src/fpathconf.c
+++ b/cpukit/libcsupport/src/fpathconf.c
@@ -36,9 +36,7 @@ long fpathconf(
rtems_libio_t *iop;
const rtems_filesystem_limits_and_options_t *the_limits;
- rtems_libio_check_fd(fd);
- iop = rtems_libio_iop(fd);
- rtems_libio_check_is_open(iop);
+ LIBIO_GET_IOP( fd, iop );
/*
* Now process the information request.
diff --git a/cpukit/libcsupport/src/fstat.c b/cpukit/libcsupport/src/fstat.c
index 4c284bd..4a10d16 100644
--- a/cpukit/libcsupport/src/fstat.c
+++ b/cpukit/libcsupport/src/fstat.c
@@ -36,9 +36,7 @@ int fstat(
/*
* Now process the stat() request.
*/
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open(iop);
+ LIBIO_GET_IOP( fd, iop );
/*
* Zero out the stat structure so the various support
diff --git a/cpukit/libcsupport/src/fsync.c b/cpukit/libcsupport/src/fsync.c
index 19c04b9..6332180 100644
--- a/cpukit/libcsupport/src/fsync.c
+++ b/cpukit/libcsupport/src/fsync.c
@@ -32,9 +32,7 @@ int fsync(
{
rtems_libio_t *iop;
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open(iop);
+ LIBIO_GET_IOP( fd, iop );
/*
* Now process the fsync().
diff --git a/cpukit/libcsupport/src/ftruncate.c b/cpukit/libcsupport/src/ftruncate.c
index 64c2dc0..401510b 100644
--- a/cpukit/libcsupport/src/ftruncate.c
+++ b/cpukit/libcsupport/src/ftruncate.c
@@ -29,10 +29,7 @@ int ftruncate( int fd, off_t length )
if ( length >= 0 ) {
rtems_libio_t *iop;
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open( iop );
- rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE, EINVAL );
+ LIBIO_GET_IOP_WITH_ACCESS( fd, iop, LIBIO_FLAGS_WRITE, EINVAL );
rv = (*iop->pathinfo.handlers->ftruncate_h)( iop, length );
} else {
diff --git a/cpukit/libcsupport/src/ioctl.c b/cpukit/libcsupport/src/ioctl.c
index e121cd0..9fa7fa1 100644
--- a/cpukit/libcsupport/src/ioctl.c
+++ b/cpukit/libcsupport/src/ioctl.c
@@ -39,9 +39,7 @@ int ioctl(
rtems_libio_t *iop;
void *buffer;
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open(iop);
+ LIBIO_GET_IOP( fd, iop );
va_start(ap, command);
diff --git a/cpukit/libcsupport/src/lseek.c b/cpukit/libcsupport/src/lseek.c
index f5c6fa6..16271eb 100644
--- a/cpukit/libcsupport/src/lseek.c
+++ b/cpukit/libcsupport/src/lseek.c
@@ -21,9 +21,7 @@ off_t lseek( int fd, off_t offset, int whence )
{
rtems_libio_t *iop;
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open(iop);
+ LIBIO_GET_IOP( fd, iop );
return (*iop->pathinfo.handlers->lseek_h)( iop, offset, whence );
}
diff --git a/cpukit/libcsupport/src/read.c b/cpukit/libcsupport/src/read.c
index 60c50eb..d55ff18 100644
--- a/cpukit/libcsupport/src/read.c
+++ b/cpukit/libcsupport/src/read.c
@@ -35,10 +35,7 @@ ssize_t read(
rtems_libio_check_buffer( buffer );
rtems_libio_check_count( count );
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open( iop );
- rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ, EBADF );
+ LIBIO_GET_IOP_WITH_ACCESS( fd, iop, LIBIO_FLAGS_READ, EBADF );
/*
* Now process the read().
diff --git a/cpukit/libcsupport/src/write.c b/cpukit/libcsupport/src/write.c
index e98fb18..f44962a 100644
--- a/cpukit/libcsupport/src/write.c
+++ b/cpukit/libcsupport/src/write.c
@@ -38,10 +38,7 @@ ssize_t write(
rtems_libio_check_buffer( buffer );
rtems_libio_check_count( count );
- rtems_libio_check_fd( fd );
- iop = rtems_libio_iop( fd );
- rtems_libio_check_is_open( iop );
- rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE, EBADF );
+ LIBIO_GET_IOP_WITH_ACCESS( fd, iop, LIBIO_FLAGS_WRITE, EBADF );
/*
* Now process the write() request.
diff --git a/cpukit/libnetworking/rtems/rtems_syscall.c b/cpukit/libnetworking/rtems/rtems_syscall.c
index 2d468dc..c7ff724 100644
--- a/cpukit/libnetworking/rtems/rtems_syscall.c
+++ b/cpukit/libnetworking/rtems/rtems_syscall.c
@@ -44,14 +44,13 @@ rtems_bsdnet_fdToSocket (int fd)
{
rtems_libio_t *iop;
- /* same as rtems_libio_check_fd(_fd) but different return */
if ((uint32_t)fd >= rtems_libio_number_iops) {
errno = EBADF;
return NULL;
}
+
iop = rtems_libio_iop(fd);
- /* same as rtems_libio_check_is_open(iop) but different return */
if ((rtems_libio_iop_flags(iop) & LIBIO_FLAGS_OPEN) == 0) {
errno = EBADF;
return NULL;
More information about the vc
mailing list