This is an automated email from the ASF dual-hosted git repository. gnutt pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 6418d13b922f96dd7bc02d46fb68bf7245d0c013 Author: Xiang Xiao <xiaoxi...@xiaomi.com> AuthorDate: Sun May 3 11:33:55 2020 +0800 fs/vfs: Add nx_close function Signed-off-by: Xiang Xiao <xiaoxi...@xiaomi.com> --- fs/vfs/fs_close.c | 96 +++++++++++++++++++++++++++------------------------ include/nuttx/fs/fs.h | 20 +++++++++++ 2 files changed, 70 insertions(+), 46 deletions(-) diff --git a/fs/vfs/fs_close.c b/fs/vfs/fs_close.c index 6425a2c..f490b2e 100644 --- a/fs/vfs/fs_close.c +++ b/fs/vfs/fs_close.c @@ -57,61 +57,38 @@ ****************************************************************************/ /**************************************************************************** - * Name: close + * Name: nx_close * * Description: - * close() closes a file descriptor, so that it no longer refers to any - * file and may be reused. Any record locks (see fcntl(2)) held on the file - * it was associated with, and owned by the process, are removed (regardless - * of the file descriptor that was used to obtain the lock). - * - * If fd is the last copy of a particular file descriptor the resources - * associated with it are freed; if the descriptor was the last reference - * to a file which has been removed using unlink(2) the file is deleted. + * nx_close() is similar to the standard 'close' interface except that is + * not a cancellation point and it does not modify the errno variable. * - * Input Parameters: - * fd file descriptor to close + * nx_close() is an internal NuttX interface and should not be called from + * applications. * * Returned Value: - * 0 on success; -1 on error with errno set appropriately. - * - * Assumptions: + * The new file descriptor is returned on success; a negated errno value is + * returned on any failure. * ****************************************************************************/ -int close(int fd) +int nx_close(int fd) { - int errcode; - int ret; - - /* close() is a cancellation point */ - - enter_cancellation_point(); - /* Did we get a valid file descriptor? */ - if ((unsigned int)fd >= CONFIG_NFILE_DESCRIPTORS) + if (fd >= CONFIG_NFILE_DESCRIPTORS) { /* Close a socket descriptor */ #ifdef CONFIG_NET - if ((unsigned int)fd < (CONFIG_NFILE_DESCRIPTORS + CONFIG_NSOCKET_DESCRIPTORS)) + if (fd < (CONFIG_NFILE_DESCRIPTORS + CONFIG_NSOCKET_DESCRIPTORS)) { - ret = net_close(fd); - if (ret < 0) - { - errcode = -ret; - goto errout; - } - - leave_cancellation_point(); - return ret; + return net_close(fd); } else #endif { - errcode = EBADF; - goto errout; + return -EBADF; } } @@ -125,20 +102,47 @@ int close(int fd) * vtable. */ - ret = files_close(fd); + return files_close(fd); +} + +/**************************************************************************** + * Name: close + * + * Description: + * close() closes a file descriptor, so that it no longer refers to any + * file and may be reused. Any record locks (see fcntl(2)) held on the file + * it was associated with, and owned by the process, are removed + * (regardless of the file descriptor that was used to obtain the lock). + * + * If fd is the last copy of a particular file descriptor the resources + * associated with it are freed; if the descriptor was the last reference + * to a file which has been removed using unlink(2) the file is deleted. + * + * Input Parameters: + * fd file descriptor to close + * + * Returned Value: + * 0 on success; -1 on error with errno set appropriately. + * + * Assumptions: + * + ****************************************************************************/ + +int close(int fd) +{ + int ret; + + /* close() is a cancellation point */ + + enter_cancellation_point(); + + ret = nx_close(fd); if (ret < 0) { - /* An error occurred while closing the driver */ - - errcode = -ret; - goto errout; + set_errno(-ret); + ret = ERROR; } leave_cancellation_point(); - return OK; - -errout: - set_errno(errcode); - leave_cancellation_point(); - return ERROR; + return ret; } diff --git a/include/nuttx/fs/fs.h b/include/nuttx/fs/fs.h index 4640424..0855d95 100644 --- a/include/nuttx/fs/fs.h +++ b/include/nuttx/fs/fs.h @@ -77,6 +77,7 @@ # else # define _NX_OPEN nx_open # endif +# define _NX_CLOSE(f) nx_close(f) # define _NX_READ(f,b,s) nx_read(f,b,s) # define _NX_WRITE(f,b,s) nx_write(f,b,s) # define _NX_SEEK(f,o,w) nx_seek(f,o,w) @@ -89,6 +90,7 @@ # else # define _NX_OPEN open # endif +# define _NX_CLOSE(f) close(f) # define _NX_READ(f,b,s) read(f,b,s) # define _NX_WRITE(f,b,s) write(f,b,s) # define _NX_SEEK(f,o,w) lseek(f,o,w) @@ -861,6 +863,24 @@ int file_detach(int fd, FAR struct file *filep); int file_close(FAR struct file *filep); /**************************************************************************** + * Name: nx_close + * + * Description: + * nx_close() is similar to the standard 'close' interface except that is + * not a cancellation point and it does not modify the errno variable. + * + * nx_close() is an internal NuttX interface and should not be called from + * applications. + * + * Returned Value: + * The new file descriptor is returned on success; a negated errno value is + * returned on any failure. + * + ****************************************************************************/ + +int nx_close(int fd); + +/**************************************************************************** * Name: open_blockdriver * * Description: