From 2e0901fcaa684d7a1805638437a1ec895d616267 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Sat, 10 Jul 2021 23:19:30 +0800 Subject: [PATCH] net: Add file_socket function and move the socket special process from fstat/nx_vfcntl/ to file_fstat/file_vfcntl Signed-off-by: Xiang Xiao Change-Id: Ia10341538488ba3a8444df8e73fb5257b2a1f512 --- fs/socket/socket.c | 17 +++++++++++------ fs/vfs/fs_fcntl.c | 38 ++++++++++++++++++-------------------- fs/vfs/fs_fstat.c | 24 +++++++++--------------- include/nuttx/net/net.h | 5 ++--- 4 files changed, 40 insertions(+), 44 deletions(-) diff --git a/fs/socket/socket.c b/fs/socket/socket.c index 69718cb545..a07c11c41e 100644 --- a/fs/socket/socket.c +++ b/fs/socket/socket.c @@ -187,6 +187,16 @@ int sockfd_allocate(FAR struct socket *psock, int oflags) * ****************************************************************************/ +FAR struct socket *file_socket(FAR struct file *filep) +{ + if (filep != NULL && INODE_IS_SOCKET(filep->f_inode)) + { + return filep->f_priv; + } + + return NULL; +} + FAR struct socket *sockfd_socket(int sockfd) { FAR struct file *filep; @@ -196,12 +206,7 @@ FAR struct socket *sockfd_socket(int sockfd) return NULL; } - if (INODE_IS_SOCKET(filep->f_inode)) - { - return filep->f_priv; - } - - return NULL; + return file_socket(filep); } /**************************************************************************** diff --git a/fs/vfs/fs_fcntl.c b/fs/vfs/fs_fcntl.c index 657742286f..e38eef6e83 100644 --- a/fs/vfs/fs_fcntl.c +++ b/fs/vfs/fs_fcntl.c @@ -56,6 +56,20 @@ static int file_vfcntl(FAR struct file *filep, int cmd, va_list ap) return -EBADF; } + /* check for operations on a socket descriptor */ + +#ifdef CONFIG_NET + if (INODE_IS_SOCKET(filep->f_inode) && + cmd != F_DUPFD && cmd != F_GETFD && cmd != F_SETFD) + { + /* Yes.. defer socket descriptor operations to + * psock_vfcntl(). The errno is not set on failures. + */ + + return psock_vfcntl(file_socket(filep), cmd, ap); + } +#endif + switch (cmd) { case F_DUPFD: @@ -239,27 +253,11 @@ static int nx_vfcntl(int fd, int cmd, va_list ap) { DEBUGASSERT(filep != NULL); - /* check for operations on a socket descriptor */ + /* Let file_vfcntl() do the real work. The errno is not set on + * failures. + */ -#ifdef CONFIG_NET - if (INODE_IS_SOCKET(filep->f_inode) && - cmd != F_DUPFD && cmd != F_GETFD && cmd != F_SETFD) - { - /* Yes.. defer socket descriptor operations to - * psock_vfcntl(). The errno is not set on failures. - */ - - ret = psock_vfcntl(sockfd_socket(fd), cmd, ap); - } - else -#endif - { - /* Let file_vfcntl() do the real work. The errno is not set on - * failures. - */ - - ret = file_vfcntl(filep, cmd, ap); - } + ret = file_vfcntl(filep, cmd, ap); } return ret; diff --git a/fs/vfs/fs_fstat.c b/fs/vfs/fs_fstat.c index a3e858e26c..dbf4cbc64f 100644 --- a/fs/vfs/fs_fstat.c +++ b/fs/vfs/fs_fstat.c @@ -191,6 +191,15 @@ int file_fstat(FAR struct file *filep, FAR struct stat *buf) } } else +#endif +#ifdef CONFIG_NET + if (INODE_IS_SOCKET(inode)) + { + /* Let the networking logic handle the fstat() */ + + ret = psock_fstat(file_socket(filep), buf); + } + else #endif { /* Check if the inode is a proxy for a block or MTD driver */ @@ -244,21 +253,6 @@ int fstat(int fd, FAR struct stat *buf) goto errout; } -#ifdef CONFIG_NET - if (INODE_IS_SOCKET(filep->f_inode)) - { - /* Let the networking logic handle the fstat() */ - - ret = psock_fstat(sockfd_socket(fd), buf); - if (ret < 0) - { - goto errout; - } - - return OK; - } -#endif - /* Perform the fstat operation */ ret = file_fstat(filep, buf); diff --git a/include/nuttx/net/net.h b/include/nuttx/net/net.h index fb31d93158..d79162ef14 100644 --- a/include/nuttx/net/net.h +++ b/include/nuttx/net/net.h @@ -168,6 +168,7 @@ typedef uint8_t sockcaps_t; */ struct file; /* Forward reference */ +struct stat; /* Forward reference */ struct socket; /* Forward reference */ struct pollfd; /* Forward reference */ @@ -521,6 +522,7 @@ int sockfd_allocate(FAR struct socket *psock, int oflags); * ****************************************************************************/ +FAR struct socket *file_socket(FAR struct file *filep); FAR struct socket *sockfd_socket(int sockfd); /**************************************************************************** @@ -1312,8 +1314,6 @@ int psock_dup2(FAR struct socket *psock1, FAR struct socket *psock2); * ****************************************************************************/ -struct stat; /* Forward reference. See sys/stat.h */ - int psock_fstat(FAR struct socket *psock, FAR struct stat *buf); /**************************************************************************** @@ -1379,7 +1379,6 @@ int psock_fstat(FAR struct socket *psock, FAR struct stat *buf); ****************************************************************************/ #ifdef CONFIG_NET_SENDFILE -struct file; ssize_t psock_sendfile(FAR struct socket *psock, FAR struct file *infile, FAR off_t *offset, size_t count); #endif