You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gn...@apache.org on 2020/05/05 14:28:09 UTC

[incubator-nuttx] 01/02: fs: Remove all LIBC_IOCTL_VARIADIC related stuff

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 6604cdb3f28999b2a1090b4eaf9b92b2fd4f1b8e
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Mon May 4 17:00:51 2020 +0800

    fs: Remove all LIBC_IOCTL_VARIADIC related stuff
    
    Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
 Documentation/NuttxUserGuide.html |   4 --
 fs/vfs/fs_ioctl.c                 |  87 ++++++++++++++++++----------
 include/nuttx/fs/fs.h             |  45 +++------------
 include/nuttx/net/net.h           |  13 +++--
 include/sys/ioctl.h               |   4 --
 include/sys/syscall.h             |   8 +--
 libs/libc/libc.csv                |   1 -
 libs/libc/misc/Kconfig            |  43 --------------
 libs/libc/misc/Make.defs          |   4 --
 libs/libc/misc/lib_ioctl.c        | 117 --------------------------------------
 net/netdev/netdev_ioctl.c         |  32 +++++++++--
 syscall/syscall.csv               |   3 +-
 syscall/syscall_lookup.h          |   6 +-
 syscall/syscall_stublookup.c      |   8 +--
 14 files changed, 103 insertions(+), 272 deletions(-)

diff --git a/Documentation/NuttxUserGuide.html b/Documentation/NuttxUserGuide.html
index 701398f..61a5521 100644
--- a/Documentation/NuttxUserGuide.html
+++ b/Documentation/NuttxUserGuide.html
@@ -8598,11 +8598,7 @@ interface of the same name.
 
 <ul><pre>
   #include &lt;sys/ioctl.h&gt;
-  #ifdef CONFIG_LIBC_IOCTL_VARIADIC
   int ioctl(int fd, int req, ...);
-  #else
-  int ioctl(int fd, int req, unsigned long arg);
-  #endif
 </pre></ul>
 
 <h4><a name="drvrpollops">2.10.2.4 poll.h</a></h4>
diff --git a/fs/vfs/fs_ioctl.c b/fs/vfs/fs_ioctl.c
index 3ea13d9..b55c9ed 100644
--- a/fs/vfs/fs_ioctl.c
+++ b/fs/vfs/fs_ioctl.c
@@ -59,7 +59,7 @@
  ****************************************************************************/
 
 /****************************************************************************
- * Name: file_ioctl
+ * Name: file_ioctl and file_vioctl
  *
  * Description:
  *   Perform device specific operations.
@@ -67,7 +67,7 @@
  * Input Parameters:
  *   file     File structure instance
  *   req      The ioctl command
- *   arg      The argument of the ioctl cmd
+ *   ap       The argument of the ioctl cmd
  *
  * Returned Value:
  *   Returns a non-negative number on success;  A negated errno value is
@@ -76,7 +76,7 @@
  *
  ****************************************************************************/
 
-int file_ioctl(FAR struct file *filep, int req, unsigned long arg)
+int file_vioctl(FAR struct file *filep, int req, va_list ap)
 {
   FAR struct inode *inode;
 
@@ -99,11 +99,25 @@ int file_ioctl(FAR struct file *filep, int req, unsigned long arg)
 
   /* Yes on both accounts.  Let the driver perform the ioctl command */
 
-  return (int)inode->u.i_ops->ioctl(filep, req, arg);
+  return inode->u.i_ops->ioctl(filep, req, va_arg(ap, unsigned long));
+}
+
+int file_ioctl(FAR struct file *filep, int req, ...)
+{
+  va_list ap;
+  int ret;
+
+  /* Let file_vioctl() do the real work. */
+
+  va_start(ap, req);
+  ret = file_vioctl(filep, req, ap);
+  va_end(ap);
+
+  return ret;
 }
 
 /****************************************************************************
- * Name: nx_ioctl
+ * Name: nx_ioctl and nx_vioctl
  *
  * Description:
  *   nx_ioctl() is similar to the standard 'ioctl' interface except that is
@@ -119,9 +133,10 @@ int file_ioctl(FAR struct file *filep, int req, unsigned long arg)
  *
  ****************************************************************************/
 
-int nx_ioctl(int fd, int req, unsigned long arg)
+int nx_vioctl(int fd, int req, va_list ap)
 {
   FAR struct file *filep;
+  FAR int *arg;
   int ret;
 
   /* Did we get a valid file descriptor? */
@@ -133,7 +148,7 @@ int nx_ioctl(int fd, int req, unsigned long arg)
 #ifdef CONFIG_NET
       if (fd < (CONFIG_NFILE_DESCRIPTORS + CONFIG_NSOCKET_DESCRIPTORS))
         {
-          ret = netdev_ioctl(fd, req, arg);
+          ret = netdev_vioctl(fd, req, ap);
         }
       else
 #endif
@@ -155,7 +170,7 @@ int nx_ioctl(int fd, int req, unsigned long arg)
 
       /* Perform the file ioctl. */
 
-      ret = file_ioctl(filep, req, arg);
+      ret = file_vioctl(filep, req, ap);
     }
 
   /* Check for File system IOCTL commands that can be implemented via
@@ -167,20 +182,17 @@ int nx_ioctl(int fd, int req, unsigned long arg)
       switch (req)
         {
           case FIONBIO:
-            {
-              DEBUGASSERT(arg != 0);
-
-              if (*(FAR int *)((uintptr_t)arg))
-                {
-                  ret = nx_fcntl(fd, F_SETFL,
-                                 nx_fcntl(fd, F_GETFL) | O_NONBLOCK);
-                }
-              else
-                {
-                  ret = nx_fcntl(fd, F_SETFL,
-                                 nx_fcntl(fd, F_GETFL) & ~O_NONBLOCK);
-                }
-            }
+            arg = va_arg(ap, FAR int *);
+            if (arg && *arg)
+              {
+                ret = nx_fcntl(fd, F_SETFL,
+                               nx_fcntl(fd, F_GETFL) | O_NONBLOCK);
+              }
+            else
+              {
+                ret = nx_fcntl(fd, F_SETFL,
+                               nx_fcntl(fd, F_GETFL) & ~O_NONBLOCK);
+              }
             break;
         }
     }
@@ -188,8 +200,22 @@ int nx_ioctl(int fd, int req, unsigned long arg)
   return ret;
 }
 
+int nx_ioctl(int fd, int req, ...)
+{
+  va_list ap;
+  int ret;
+
+  /* Let nx_vioctl() do the real work. */
+
+  va_start(ap, req);
+  ret = nx_vioctl(fd, req, ap);
+  va_end(ap);
+
+  return ret;
+}
+
 /****************************************************************************
- * Name: ioctl/fs_ioctl
+ * Name: ioctl
  *
  * Description:
  *   Perform device specific operations.
@@ -197,7 +223,6 @@ int nx_ioctl(int fd, int req, unsigned long arg)
  * Input Parameters:
  *   fd       File/socket descriptor of device
  *   req      The ioctl command
- *   arg      The argument of the ioctl cmd
  *
  * Returned Value:
  *   >=0 on success (positive non-zero values are cmd-specific)
@@ -217,15 +242,17 @@ int nx_ioctl(int fd, int req, unsigned long arg)
  *
  ****************************************************************************/
 
-#ifdef CONFIG_LIBC_IOCTL_VARIADIC
-int fs_ioctl(int fd, int req, unsigned long arg)
-#else
-int ioctl(int fd, int req, unsigned long arg)
-#endif
+int ioctl(int fd, int req, ...)
 {
+  va_list ap;
   int ret;
 
-  ret = nx_ioctl(fd, req, arg);
+  /* Let nx_vioctl() do the real work. */
+
+  va_start(ap, req);
+  ret = nx_vioctl(fd, req, ap);
+  va_end(ap);
+
   if (ret < 0)
     {
       set_errno(-ret);
diff --git a/include/nuttx/fs/fs.h b/include/nuttx/fs/fs.h
index 9f866f2..04bdd19 100644
--- a/include/nuttx/fs/fs.h
+++ b/include/nuttx/fs/fs.h
@@ -1220,7 +1220,7 @@ int file_truncate(FAR struct file *filep, off_t length);
 #endif
 
 /****************************************************************************
- * Name: file_ioctl
+ * Name: file_ioctl and file_vioctl
  *
  * Description:
  *   Perform device specific operations.
@@ -1228,7 +1228,7 @@ int file_truncate(FAR struct file *filep, off_t length);
  * Input Parameters:
  *   file     File structure instance
  *   req      The ioctl command
- *   arg      The argument of the ioctl cmd
+ *   ap       The argument of the ioctl cmd
  *
  * Returned Value:
  *   Returns a non-negative number on success;  A negated errno value is
@@ -1237,10 +1237,11 @@ int file_truncate(FAR struct file *filep, off_t length);
  *
  ****************************************************************************/
 
-int file_ioctl(FAR struct file *filep, int req, unsigned long arg);
+int file_vioctl(FAR struct file *filep, int req, va_list ap);
+int file_ioctl(FAR struct file *filep, int req, ...);
 
 /****************************************************************************
- * Name: nx_ioctl
+ * Name: nx_ioctl and nx_vioctl
  *
  * Description:
  *   nx_ioctl() is similar to the standard 'ioctl' interface except that is
@@ -1256,40 +1257,8 @@ int file_ioctl(FAR struct file *filep, int req, unsigned long arg);
  *
  ****************************************************************************/
 
-int nx_ioctl(int fd, int req, unsigned long arg);
-
-/****************************************************************************
- * Name: fs_ioctl
- *
- * Description:
- *   Perform device specific operations.
- *
- * Input Parameters:
- *   fd       File/socket descriptor of device
- *   req      The ioctl command
- *   arg      The argument of the ioctl cmd
- *
- * Returned Value:
- *   >=0 on success (positive non-zero values are cmd-specific)
- *   -1 on failure with errno set properly:
- *
- *   EBADF
- *     'fd' is not a valid descriptor.
- *   EFAULT
- *     'arg' references an inaccessible memory area.
- *   EINVAL
- *     'cmd' or 'arg' is not valid.
- *   ENOTTY
- *     'fd' is not associated with a character special device.
- *   ENOTTY
- *      The specified request does not apply to the kind of object that the
- *      descriptor 'fd' references.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_LIBC_IOCTL_VARIADIC
-int fs_ioctl(int fd, int req, unsigned long arg);
-#endif
+int nx_vioctl(int fd, int req, va_list ap);
+int nx_ioctl(int fd, int req, ...);
 
 /****************************************************************************
  * Name: file_vfcntl
diff --git a/include/nuttx/net/net.h b/include/nuttx/net/net.h
index 871236f..8218c0c 100644
--- a/include/nuttx/net/net.h
+++ b/include/nuttx/net/net.h
@@ -1228,7 +1228,7 @@ int psock_getpeername(FAR struct socket *psock, FAR struct sockaddr *addr,
                       FAR socklen_t *addrlen);
 
 /****************************************************************************
- * Name: psock_ioctl
+ * Name: psock_ioctl and psock_vioctl
  *
  * Description:
  *   Perform network device specific operations.
@@ -1236,7 +1236,7 @@ int psock_getpeername(FAR struct socket *psock, FAR struct sockaddr *addr,
  * Input Parameters:
  *   psock    A pointer to a NuttX-specific, internal socket structure
  *   cmd      The ioctl command
- *   arg      The argument of the ioctl cmd
+ *   ap      The argument of the ioctl cmd
  *
  * Returned Value:
  *   A non-negative value is returned on success; a negated errno value is
@@ -1258,10 +1258,11 @@ int psock_getpeername(FAR struct socket *psock, FAR struct sockaddr *addr,
  *
  ****************************************************************************/
 
-int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg);
+int psock_vioctl(FAR struct socket *psock, int cmd, va_list ap);
+int psock_ioctl(FAR struct socket *psock, int cmd, ...);
 
 /****************************************************************************
- * Name: netdev_ioctl
+ * Name: netdev_vioctl
  *
  * Description:
  *   Perform network device specific operations.
@@ -1269,7 +1270,7 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg);
  * Input Parameters:
  *   sockfd   Socket descriptor of device
  *   cmd      The ioctl command
- *   arg      The argument of the ioctl cmd
+ *   ap       The argument of the ioctl cmd
  *
  * Returned Value:
  *   A non-negative value is returned on success; a negated errno value is
@@ -1291,7 +1292,7 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg);
  *
  ****************************************************************************/
 
-int netdev_ioctl(int sockfd, int cmd, unsigned long arg);
+int netdev_vioctl(int sockfd, int cmd, va_list ap);
 
 /****************************************************************************
  * Name: psock_poll
diff --git a/include/sys/ioctl.h b/include/sys/ioctl.h
index 6672abe..26ab371 100644
--- a/include/sys/ioctl.h
+++ b/include/sys/ioctl.h
@@ -126,11 +126,7 @@ extern "C"
  *
  ****************************************************************************/
 
-#ifdef CONFIG_LIBC_IOCTL_VARIADIC
 int ioctl(int fd, int req, ...);
-#else
-int ioctl(int fd, int req, unsigned long arg);
-#endif
 
 #undef EXTERN
 #if defined(__cplusplus)
diff --git a/include/sys/syscall.h b/include/sys/syscall.h
index 6ee8655..88c7d4c 100644
--- a/include/sys/syscall.h
+++ b/include/sys/syscall.h
@@ -284,13 +284,7 @@
  */
 
 #define SYS_close                    (__SYS_descriptors + 0)
-
-#ifdef CONFIG_LIBC_IOCTL_VARIADIC
-#  define SYS_fs_ioctl               (__SYS_descriptors + 1)
-#else
-#  define SYS_ioctl                  (__SYS_descriptors + 1)
-#endif
-
+#define SYS_ioctl                    (__SYS_descriptors + 1)
 #define SYS_read                     (__SYS_descriptors + 2)
 #define SYS_write                    (__SYS_descriptors + 3)
 #define SYS_pread                    (__SYS_descriptors + 4)
diff --git a/libs/libc/libc.csv b/libs/libc/libc.csv
index 2eafa1e..d20d28c 100644
--- a/libs/libc/libc.csv
+++ b/libs/libc/libc.csv
@@ -64,7 +64,6 @@
 "inet_ntoa","arpa/inet.h","defined(CONFIG_NET_IPv4)","FAR char","struct in_addr"
 "inet_ntop","arpa/inet.h","","FAR const char","int","FAR const void *","FAR char *","socklen_t"
 "inet_pton","arpa/inet.h","","int","int","FAR const char *","FAR void *"
-"ioctl","sys/ioctl.h","defined(CONFIG_LIBC_IOCTL_VARIADIC)","int","int","int","..."
 "iswalnum","wctype.h","defined(CONFIG_LIBC_WCHAR)","int","wint_t"
 "iswalpha","wctype.h","defined(CONFIG_LIBC_WCHAR)","int","wint_t"
 "iswblank","wctype.h","defined(CONFIG_LIBC_WCHAR)","int","wint_t"
diff --git a/libs/libc/misc/Kconfig b/libs/libc/misc/Kconfig
index 7247e91..c36b785 100644
--- a/libs/libc/misc/Kconfig
+++ b/libs/libc/misc/Kconfig
@@ -3,49 +3,6 @@
 # see the file kconfig-language.txt in the NuttX tools repository.
 #
 
-config LIBC_IOCTL_VARIADIC
-	bool "Enable variadic ioctl()"
-	default y
-	---help---
-		By default, NuttX implements the "old style," three-parameter,
-		ioctl() interface with this function prototype:
-
-			int ioctl(int fd, int req, unsigned long arg);
-
-		That function is implemented as part of the VFS.  If
-		LIBC_IOCTL_VARIADIC is selected, then an additional compatibility
-		layer will be provided in the C library.  The enabled, then function
-		prototype will become:
-
-			int ioctl(int fd, int req, ...);
-
-		The ioctl() is not controlled by any standard so it is really
-		arbitrary which format you used.  You may select the variadic
-		function prototype with this option.  That will slightly increase
-		code size and ioctl() processing time.  It will not support a
-		variable number of arguments and it still always expects to see a
-		third argument of type 'unsigned long'.  The only benefit of this
-		alternative function signature is that it may provide greater
-		compatibility if you are porting code from other platforms that use
-		the variadic ioctl() function.
-
-		WARNING:  Use of this option could cause subtle system errors is
-		the third argument is omitted or if the sizeof the thread argument
-		is anything other than sizeof (unsigned long).  Most small integers
-		will be promoted to 'int'.  The following assertion appears in ioctl():
-
-			DEBUGASSERT(sizeof(int)        == sizeof(unsigned long) &&
-			            sizeof(FAR void *) == sizeof(unsigned long));
-
-		Do not enable this option if the above is not true.  32-bit ARM
-		should pass this test with all three types having sizeof(type) == 4
-		bytes.  'float' should also be tested.  But 'long long' and 'double'
-		are out of the question!  Don't event try to pass them.
-
-		And what will happen if no third argument is passed?  In most cases,
-		this should just result in a garbage value for arg.  But you may
-		discover cases where something worse happens!
-
 config LIB_SENDFILE_BUFSIZE
 	int "sendfile() buffer size"
 	default 512
diff --git a/libs/libc/misc/Make.defs b/libs/libc/misc/Make.defs
index 02e60fd..4edbdc4 100644
--- a/libs/libc/misc/Make.defs
+++ b/libs/libc/misc/Make.defs
@@ -56,10 +56,6 @@ ifneq ($(CONFIG_NFILE_STREAMS),0)
 CSRCS += lib_streamsem.c
 endif
 
-ifeq ($(CONFIG_LIBC_IOCTL_VARIADIC),y)
-CSRCS += lib_ioctl.c
-endif
-
 ifeq ($(CONFIG_PIPES),y)
 CSRCS += lib_mkfifo.c
 endif
diff --git a/libs/libc/misc/lib_ioctl.c b/libs/libc/misc/lib_ioctl.c
deleted file mode 100644
index af91bca..0000000
--- a/libs/libc/misc/lib_ioctl.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/****************************************************************************
- * libs/libc/misc/lib_ioctl.c
- *
- *   Copyright (C) 2014 Gregory Nutt. All rights reserved.
- *   Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- * 3. Neither the name NuttX nor the names of its contributors may be
- *    used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <sys/ioctl.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <assert.h>
-
-#include <nuttx/fs/fs.h>
-
-#include "libc.h"
-
-#ifdef CONFIG_LIBC_IOCTL_VARIADIC
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: ioctl
- *
- * Description:
- *   Perform device specific operations.
- *
- * Input Parameters:
- *   fd       File/socket descriptor of device
- *   req      The ioctl command
- *   ...      A third argument of type unsigned long is expected
- *
- * Returned Value:
- *   >=0 on success (positive non-zero values are cmd-specific)
- *   -1 on failure with errno set properly:
- *
- *   EBADF
- *     'fd' is not a valid descriptor.
- *   EFAULT
- *     'arg' references an inaccessible memory area.
- *   EINVAL
- *     'cmd' or 'arg' is not valid.
- *   ENOTTY
- *     'fd' is not associated with a character special device.
- *   ENOTTY
- *      The specified request does not apply to the kind of object that the
- *      descriptor 'fd' references.
- *
- ****************************************************************************/
-
-int ioctl(int fd, int req, ...)
-{
-  unsigned long arg;
-  va_list ap;
-
-  /* Get the unsigned long argument.
-   *
-   * REVISIT:  This could be the cause of the crash down the road if the
-   * actual size of the argument is not sizeof(unsigned long).
-   * Most small integers will be promoted to 'int'.  ARM should pass the
-   * following test with all three types having sizeof(type) == 4 bytes.
-   * 'float' should also be tested.  But 'long long' and 'double' are out of
-   * the question!  Don't try to pass them.
-   *
-   * And what will happen if no third argument is passed?  In most cases,
-   * this should just result in a garbage value for arg.  But you may
-   * discover cases where something worse happens!
-   */
-
-  DEBUGASSERT(sizeof(int)        <= sizeof(unsigned long) &&
-              sizeof(FAR void *) == sizeof(unsigned long));
-
-  va_start(ap, req);
-  arg = va_arg(ap, unsigned long);
-  va_end(ap);
-
-  /* Then let fs_ioctl() to the real work */
-
-  return fs_ioctl(fd, req, arg);
-}
-
-#endif /* CONFIG_LIBC_IOCTL_VARIADIC */
diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c
index 4e27251..1844b15 100644
--- a/net/netdev/netdev_ioctl.c
+++ b/net/netdev/netdev_ioctl.c
@@ -1577,7 +1577,7 @@ ssize_t net_ioctl_arglen(int cmd)
 #endif
 
 /****************************************************************************
- * Name: psock_ioctl
+ * Name: psock_ioctl and psock_vioctl
  *
  * Description:
  *   Perform network device specific operations.
@@ -1607,8 +1607,9 @@ ssize_t net_ioctl_arglen(int cmd)
  *
  ****************************************************************************/
 
-int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg)
+int psock_vioctl(FAR struct socket *psock, int cmd, va_list ap)
 {
+  unsigned long arg;
   int ret;
 
   /* Verify that the psock corresponds to valid, allocated socket */
@@ -1618,6 +1619,8 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg)
       return -EBADF;
     }
 
+  arg = va_arg(ap, unsigned long);
+
 #ifdef CONFIG_NET_USRSOCK
   /* Check for a USRSOCK ioctl command */
 
@@ -1702,6 +1705,25 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg)
   return ret;
 }
 
+int psock_ioctl(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_vioctl(psock, cmd, ap);
+
+  va_end(ap);
+  return ret;
+}
+
 /****************************************************************************
  * Name: netdev_ioctl
  *
@@ -1711,7 +1733,7 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg)
  * Input Parameters:
  *   sockfd   Socket descriptor of device
  *   cmd      The ioctl command
- *   arg      The argument of the ioctl cmd
+ *   ap       The argument of the ioctl cmd
  *
  * Returned Value:
  *   A non-negative value is returned on success; a negated errno value is
@@ -1733,11 +1755,11 @@ int psock_ioctl(FAR struct socket *psock, int cmd, unsigned long arg)
  *
  ****************************************************************************/
 
-int netdev_ioctl(int sockfd, int cmd, unsigned long arg)
+int netdev_vioctl(int sockfd, int cmd, va_list ap)
 {
   FAR struct socket *psock = sockfd_socket(sockfd);
 
-  return psock_ioctl(psock, cmd, arg);
+  return psock_ioctl(psock, cmd, ap);
 }
 
 /****************************************************************************
diff --git a/syscall/syscall.csv b/syscall/syscall.csv
index 238b093..9a048da 100644
--- a/syscall/syscall.csv
+++ b/syscall/syscall.csv
@@ -24,7 +24,6 @@
 "exit","stdlib.h","","void","int"
 "fcntl","fcntl.h","","int","int","int","..."
 "fs_fdopen","nuttx/fs/fs.h","CONFIG_NFILE_STREAMS > 0","FAR struct file_struct*","int","int","FAR struct tcb_s*"
-"fs_ioctl","nuttx/fs/fs.h","defined(CONFIG_LIBC_IOCTL_VARIADIC)","int","int","int","unsigned long"
 "fstat","sys/stat.h","","int","int","FAR struct stat*"
 "fstatfs","sys/statfs.h","","int","int","FAR struct statfs*"
 "fsync","unistd.h","!defined(CONFIG_DISABLE_MOUNTPOINT)","int","int"
@@ -42,7 +41,7 @@
 "if_indextoname","net/if.h","defined(CONFIG_NETDEV_IFINDEX)","FAR char *","unsigned int","FAR char *"
 "if_nametoindex","net/if.h","defined(CONFIG_NETDEV_IFINDEX)","unsigned int","FAR const char *"
 "insmod","nuttx/module.h","defined(CONFIG_MODULE)","FAR void *","FAR const char *","FAR const char *"
-"ioctl","sys/ioctl.h","!defined(CONFIG_LIBC_IOCTL_VARIADIC)","int","int","int","unsigned long"
+"ioctl","sys/ioctl.h","","int","int","int","..."
 "kill","signal.h","","int","pid_t","int"
 "link","unistd.h","defined(CONFIG_PSEUDOFS_SOFTLINKS)","int","FAR const char *","FAR const char *"
 "listen","sys/socket.h","defined(CONFIG_NET)","int","int","int"
diff --git a/syscall/syscall_lookup.h b/syscall/syscall_lookup.h
index 17e5e6a..2f23a23 100644
--- a/syscall/syscall_lookup.h
+++ b/syscall/syscall_lookup.h
@@ -197,11 +197,7 @@ SYSCALL_LOOKUP(up_assert,                  2, STUB_up_assert)
  */
 
   SYSCALL_LOOKUP(close,                    1, STUB_close)
-#ifdef CONFIG_LIBC_IOCTL_VARIADIC
-  SYSCALL_LOOKUP(fs_ioctl,                 3, STUB_fs_ioctl)
-#else
-  SYSCALL_LOOKUP(ioctl,                    3, STUB_ioctl)
-#endif
+  SYSCALL_LOOKUP(ioctl,                    6, STUB_ioctl)
   SYSCALL_LOOKUP(read,                     3, STUB_read)
   SYSCALL_LOOKUP(write,                    3, STUB_write)
   SYSCALL_LOOKUP(pread,                    4, STUB_pread)
diff --git a/syscall/syscall_stublookup.c b/syscall/syscall_stublookup.c
index 493f8e6..1a6a47f 100644
--- a/syscall/syscall_stublookup.c
+++ b/syscall/syscall_stublookup.c
@@ -189,13 +189,9 @@ uintptr_t STUB_nx_vsyslog(int nbr, uintptr_t parm1, uintptr_t parm2,
  */
 
 uintptr_t STUB_close(int nbr, uintptr_t parm1);
-#ifdef CONFIG_LIBC_IOCTL_VARIADIC
-uintptr_t STUB_fs_ioctl(int nbr, uintptr_t parm1, uintptr_t parm2,
-            uintptr_t parm3);
-#else
 uintptr_t STUB_ioctl(int nbr, uintptr_t parm1, uintptr_t parm2,
-            uintptr_t parm3);
-#endif
+            uintptr_t parm3, uintptr_t parm4, uintptr_t parm5,
+            uintptr_t parm6);
 uintptr_t STUB_read(int nbr, uintptr_t parm1, uintptr_t parm2,
             uintptr_t parm3);
 uintptr_t STUB_write(int nbr, uintptr_t parm1, uintptr_t parm2,