You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2022/03/04 20:04:04 UTC
[incubator-nuttx] 02/03: net: Remove psock_fcntl related code
This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit b2c86f808d4553336cd0fd8b669629dd2141dcd6
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Fri Mar 4 16:13:17 2022 +0800
net: Remove psock_fcntl related code
since the nonblocking mode set through psock_ioctl now
Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
fs/vfs/fs_fcntl.c | 15 ---
include/nuttx/net/net.h | 40 --------
net/netdev/netdev_ioctl.c | 79 +++++++++++++-
net/socket/Make.defs | 8 +-
net/socket/net_vfcntl.c | 256 ----------------------------------------------
5 files changed, 80 insertions(+), 318 deletions(-)
diff --git a/fs/vfs/fs_fcntl.c b/fs/vfs/fs_fcntl.c
index c6b929a..1f6f425 100644
--- a/fs/vfs/fs_fcntl.c
+++ b/fs/vfs/fs_fcntl.c
@@ -33,7 +33,6 @@
#include <nuttx/sched.h>
#include <nuttx/cancelpt.h>
#include <nuttx/fs/fs.h>
-#include <nuttx/net/net.h>
#include "inode/inode.h"
@@ -56,20 +55,6 @@ 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:
diff --git a/include/nuttx/net/net.h b/include/nuttx/net/net.h
index 8bdd503..db9a786 100644
--- a/include/nuttx/net/net.h
+++ b/include/nuttx/net/net.h
@@ -1410,46 +1410,6 @@ ssize_t psock_sendfile(FAR struct socket *psock, FAR struct file *infile,
#endif
/****************************************************************************
- * Name: psock_vfcntl
- *
- * Description:
- * Performs fcntl operations on socket.
- *
- * Input Parameters:
- * psock - An instance of the internal socket structure.
- * cmd - The fcntl command.
- * ap - Command-specific arguments.
- *
- * Returned Value:
- * Zero (OK) is returned on success; a negated errno value is returned on
- * any failure to indicate the nature of the failure.
- *
- ****************************************************************************/
-
-int psock_vfcntl(FAR struct socket *psock, int cmd, va_list ap);
-
-/****************************************************************************
- * Name: psock_fcntl
- *
- * Description:
- * Similar to the standard fcntl function except that is accepts a struct
- * struct socket instance instead of a file descriptor.
- *
- * Input Parameters:
- * psock - An instance of the internal socket structure.
- * cmd - Identifies the operation to be performed. Command specific
- * arguments may follow.
- *
- * Returned Value:
- * The nature of the return value depends on the command. Non-negative
- * values indicate success. Failures are reported as negated errno
- * values.
- *
- ****************************************************************************/
-
-int psock_fcntl(FAR struct socket *psock, int cmd, ...);
-
-/****************************************************************************
* Name: psock_socketpair
*
* Description:
diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c
index ceec5b6..e77d7b7 100644
--- a/net/netdev/netdev_ioctl.c
+++ b/net/netdev/netdev_ioctl.c
@@ -1473,6 +1473,73 @@ static int netdev_rt_ioctl(FAR struct socket *psock, int cmd,
#endif
/****************************************************************************
+ * Name: netdev_file_ioctl
+ *
+ * Description:
+ * Perform file ioctl operations.
+ *
+ * Parameters:
+ * psock Socket structure
+ * cmd The ioctl command
+ * arg The argument of the ioctl cmd
+ *
+ * Return:
+ * >=0 on success (positive non-zero values are cmd-specific)
+ * Negated errno returned on failure.
+ *
+ ****************************************************************************/
+
+static int netdev_file_ioctl(FAR struct socket *psock, int cmd,
+ unsigned long arg)
+{
+ int ret;
+
+ switch (cmd)
+ {
+ case FIONBIO:
+ {
+ FAR struct socket_conn_s *conn = psock->s_conn;
+ FAR int *nonblock = (FAR int *)(uintptr_t)arg;
+ sockcaps_t sockcaps;
+
+ /* Non-blocking is the only configurable option. And it applies
+ * only Unix domain sockets and to read operations on TCP/IP
+ * and UDP/IP sockets when read-ahead is enabled.
+ */
+
+ DEBUGASSERT(psock->s_sockif != NULL &&
+ psock->s_sockif->si_sockcaps != NULL);
+ sockcaps = psock->s_sockif->si_sockcaps(psock);
+
+ if ((sockcaps & SOCKCAP_NONBLOCKING) != 0)
+ {
+ if (nonblock && *nonblock)
+ {
+ conn->s_flags |= _SF_NONBLOCK;
+ }
+ else
+ {
+ conn->s_flags &= ~_SF_NONBLOCK;
+ }
+
+ ret = OK;
+ }
+ else
+ {
+ nerr("ERROR: Non-blocking not supported for this socket\n");
+ ret = -ENOSYS;
+ }
+ }
+
+ default:
+ ret = -ENOTTY;
+ break;
+ }
+
+ return ret;
+}
+
+/****************************************************************************
* Name: netdev_ioctl
*
* Description:
@@ -1673,13 +1740,21 @@ int psock_vioctl(FAR struct socket *psock, int cmd, va_list ap)
arg = va_arg(ap, unsigned long);
- /* Check for a USRSOCK ioctl command */
+ /* Check for socket specific ioctl command */
ret = netdev_ioctl(psock, cmd, arg);
+
+ /* Check for file ioctl command */
+
if (ret == -ENOTTY)
{
- /* Check for a standard network IOCTL command. */
+ ret = netdev_file_ioctl(psock, cmd, arg);
+ }
+
+ /* Check for a standard network IOCTL command. */
+ if (ret == -ENOTTY)
+ {
ret = netdev_ifr_ioctl(psock, cmd, (FAR struct ifreq *)(uintptr_t)arg);
}
diff --git a/net/socket/Make.defs b/net/socket/Make.defs
index 4134efa..2f0e351 100644
--- a/net/socket/Make.defs
+++ b/net/socket/Make.defs
@@ -21,11 +21,9 @@
# Include socket source files
SOCK_CSRCS += accept.c bind.c connect.c getsockname.c getpeername.c
-SOCK_CSRCS += listen.c recv.c recvfrom.c send.c sendto.c
-SOCK_CSRCS += socket.c socketpair.c net_close.c
-SOCK_CSRCS += recvmsg.c sendmsg.c
-SOCK_CSRCS += net_dup2.c net_sockif.c net_poll.c net_vfcntl.c
-SOCK_CSRCS += net_fstat.c
+SOCK_CSRCS += listen.c recv.c recvfrom.c send.c sendto.c socket.c
+SOCK_CSRCS += socketpair.c net_close.c recvmsg.c sendmsg.c
+SOCK_CSRCS += net_dup2.c net_sockif.c net_poll.c net_fstat.c
# Socket options
diff --git a/net/socket/net_vfcntl.c b/net/socket/net_vfcntl.c
deleted file mode 100644
index d8610c3..0000000
--- a/net/socket/net_vfcntl.c
+++ /dev/null
@@ -1,256 +0,0 @@
-/****************************************************************************
- * net/socket/net_vfcntl.c
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <sys/socket.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <debug.h>
-#include <assert.h>
-
-#include <arch/irq.h>
-#include <nuttx/net/net.h>
-#include "socket/socket.h"
-#include "usrsock/usrsock.h"
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: psock_vfcntl
- *
- * Description:
- * Performs fcntl operations on socket
- *
- * Input Parameters:
- * psock - An instance of the internal socket structure.
- * cmd - The fcntl command.
- * ap - Command-specific arguments
- *
- * Returned Value:
- * Zero (OK) is returned on success; a negated errno value is returned on
- * any failure to indicate the nature of the failure.
- *
- ****************************************************************************/
-
-int psock_vfcntl(FAR struct socket *psock, int cmd, va_list ap)
-{
- FAR struct socket_conn_s *conn;
- int ret = -EINVAL;
-
- ninfo("sockfd=%p cmd=%d\n", psock, cmd);
-
- /* Verify that the sockfd corresponds to valid, allocated socket */
-
- if (psock == NULL || psock->s_conn == NULL)
- {
- return -EBADF;
- }
-
- conn = psock->s_conn;
-
- /* Interrupts must be disabled in order to perform operations on socket
- * structures
- */
-
- net_lock();
- switch (cmd)
- {
- case F_GETFL:
- /* Get the file status flags and file access modes, defined in
- * <fcntl.h>, for the file description associated with fd. The file
- * access modes can be extracted from the return value using the
- * mask O_ACCMODE, which is defined in <fcntl.h>. File status flags
- * and file access modes are associated with the file description
- * and do not affect other file descriptors that refer to the same
- * file with different open file descriptions.
- */
-
- {
- sockcaps_t sockcaps;
-
- /* This summarizes the behavior of all NuttX sockets */
-
- ret = O_RDWR | O_SYNC | O_RSYNC;
-
- /* Unix domain sockets may be non-blocking. TCP/IP and UDP/IP
- * sockets may also be non-blocking if read-ahead is enabled
- */
-
- DEBUGASSERT(psock->s_sockif != NULL &&
- psock->s_sockif->si_sockcaps != NULL);
- sockcaps = psock->s_sockif->si_sockcaps(psock);
-
- if ((sockcaps & SOCKCAP_NONBLOCKING) != 0 &&
- _SS_ISNONBLOCK(conn->s_flags))
- {
- ret |= O_NONBLOCK;
- }
- }
- break;
-
- case F_SETFL:
- /* Set the file status flags, defined in <fcntl.h>, for the file
- * description associated with fd from the corresponding bits in
- * the third argument, arg, taken as type int. Bits corresponding
- * to the file access mode and the file creation flags, as defined
- * in <fcntl.h>, that are set in arg will be ignored. If any bits
- * in arg other than those mentioned here are changed by the
- * application, the result is unspecified.
- */
-
- {
- /* Non-blocking is the only configurable option. And it applies
- * only Unix domain sockets and to read operations on TCP/IP
- * and UDP/IP sockets when read-ahead is enabled.
- */
-
- int mode = va_arg(ap, int);
- sockcaps_t sockcaps;
-
- DEBUGASSERT(psock->s_sockif != NULL &&
- psock->s_sockif->si_sockcaps != NULL);
- sockcaps = psock->s_sockif->si_sockcaps(psock);
-
- if ((sockcaps & SOCKCAP_NONBLOCKING) != 0)
- {
- if ((mode & O_NONBLOCK) != 0)
- {
- conn->s_flags |= _SF_NONBLOCK;
- }
- else
- {
- conn->s_flags &= ~_SF_NONBLOCK;
- }
-
- ret = OK;
- }
- else
- {
- nerr("ERROR: Non-blocking not supported for this socket\n");
- ret = -ENOSYS;
- }
- }
- break;
-
- case F_GETOWN:
- /* If fd refers to a socket, get the process or process group ID
- * specified to receive SIGURG signals when out-of-band data is
- * available. Positive values indicate a process ID; negative
- * values, other than -1, indicate a process group ID. If fd does
- * not refer to a socket, the results are unspecified.
- */
-
- case F_SETOWN:
- /* If fd refers to a socket, set the process or process group ID
- * specified to receive SIGURG signals when out-of-band data is
- * available, using the value of the third argument, arg, taken as
- * type int. Positive values indicate a process ID; negative values,
- * other than -1, indicate a process group ID. If fd does not refer
- * to a socket, the results are unspecified.
- */
-
- case F_GETLK:
- /* Get the first lock which blocks the lock description pointed to
- * by the third argument, arg, taken as a pointer to type struct
- * flock, defined in <fcntl.h>. The information retrieved shall
- * overwrite the information passed to fcntl() in the structure
- * flock. If no lock is found that would prevent this lock from
- * being created, then the structure shall be left unchanged except
- * for the lock type which shall be set to F_UNLCK.
- */
-
- case F_SETLK:
- /* Set or clear a file segment lock according to the lock
- * description pointed to by the third argument, arg, taken as a
- * pointer to type struct flock, defined in <fcntl.h>. F_SETLK can
- * establish shared (or read) locks (F_RDLCK) or exclusive (or
- * write) locks (F_WRLCK), as well as to remove either type of
- * lock (F_UNLCK). F_RDLCK, F_WRLCK, and F_UNLCK are defined in
- * <fcntl.h>. If a shared or exclusive lock cannot be set, fcntl()
- * shall return immediately with a return value of -1.
- */
-
- case F_SETLKW:
- /* This command shall be equivalent to F_SETLK except that if a
- * shared or exclusive lock is blocked by other locks, the thread
- * shall wait until the request can be satisfied. If a signal that
- * is to be caught is received while fcntl() is waiting for a
- * region, fcntl() shall be interrupted. Upon return from the signal
- * handler, fcntl() shall return -1 with errno set to [EINTR], and
- * the lock operation shall not be done.
- */
-
- ret = -ENOSYS; /* F_GETOWN, F_SETOWN, F_GETLK, F_SETLK, F_SETLKW */
- break;
-
- default:
- break;
- }
-
- net_unlock();
- return ret;
-}
-
-/****************************************************************************
- * Name: psock_fcntl
- *
- * Description:
- * Similar to the standard fcntl function except that is accepts a struct
- * struct socket instance instead of a file descriptor.
- *
- * Input Parameters:
- * psock - An instance of the internal socket structure.
- * cmd - Identifies the operation to be performed. Command specific
- * arguments may follow.
- *
- * Returned Value:
- * The nature of the return value depends on the command. Non-negative
- * values indicate success. Failures are reported as negated errno
- * values.
- *
- ****************************************************************************/
-
-int psock_fcntl(FAR struct socket *psock, int cmd, ...)
-{
- va_list ap;
- int ret;
-
- /* Setup to access the variable argument list */
-
- va_start(ap, cmd);
-
- /* Let psock_vfcntl() do the real work. The errno is not set on
- * failures.
- */
-
- ret = psock_vfcntl(psock, cmd, ap);
-
- va_end(ap);
- return ret;
-}