summaryrefslogtreecommitdiff
path: root/nuttx/libc
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-11-29 10:53:22 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-11-29 10:53:22 -0600
commit6fa66b5a77300b73f40dbaae2bb831d92eaa8fe6 (patch)
tree64046c058f5f6e86d9f59dee44f9b6faba15d4cf /nuttx/libc
parent7773304d911066ca3345eb295a944d949fd220c4 (diff)
downloadnuttx-6fa66b5a77300b73f40dbaae2bb831d92eaa8fe6.tar.gz
nuttx-6fa66b5a77300b73f40dbaae2bb831d92eaa8fe6.tar.bz2
nuttx-6fa66b5a77300b73f40dbaae2bb831d92eaa8fe6.zip
Add support for a variadic ioctl() function. The ioctl() interface is a non-standard, Unix interface. NuttX has always used the older, three-parameter version. Most contemporary systems now, however, use a variadic form of the ioctl() function. Added an option to insert a shim layer to adapt the three-parameter ioctl() to use the variadic interface form. Internally, the ioctl handling is the same three-parameter logic. The only real complexity to the shim is in how the system calls must be handled.
Diffstat (limited to 'nuttx/libc')
-rw-r--r--nuttx/libc/Kconfig26
-rw-r--r--nuttx/libc/misc/Make.defs10
-rw-r--r--nuttx/libc/misc/lib_ioctl.c101
3 files changed, 137 insertions, 0 deletions
diff --git a/nuttx/libc/Kconfig b/nuttx/libc/Kconfig
index 138793aad..2c31a1983 100644
--- a/nuttx/libc/Kconfig
+++ b/nuttx/libc/Kconfig
@@ -48,6 +48,32 @@ config LIBC_FLOATINGPOINT
By default, floating point
support in printf, sscanf, etc. is disabled.
+config LIBC_IOCTL_VARIADIC
+ bool "Enable variadic ioctl()"
+ default n
+ ---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.
+
config LIB_RAND_ORDER
int "Order of the random number generate"
default 1
diff --git a/nuttx/libc/misc/Make.defs b/nuttx/libc/misc/Make.defs
index c09e78331..1e7a6ae05 100644
--- a/nuttx/libc/misc/Make.defs
+++ b/nuttx/libc/misc/Make.defs
@@ -42,18 +42,28 @@ CSRCS += lib_stream.c lib_filesem.c
ifneq ($(CONFIG_NFILE_DESCRIPTORS),0)
CSRCS += lib_sendfile.c
+
ifneq ($(CONFIG_NFILE_STREAMS),0)
CSRCS += lib_streamsem.c
endif
+ifeq ($(CONFIG_LIBC_IOCTL_VARIADIC),y)
+CSRCS += lib_ioctl.c
+endif
+
else
ifneq ($(CONFIG_NSOCKET_DESCRIPTORS),0)
CSRCS += lib_sendfile.c
+
ifneq ($(CONFIG_NFILE_STREAMS),0)
CSRCS += lib_streamsem.c
endif
+ifeq ($(CONFIG_LIBC_IOCTL_VARIADIC),y)
+CSRCS += lib_ioctl.c
+endif
+
endif
endif
diff --git a/nuttx/libc/misc/lib_ioctl.c b/nuttx/libc/misc/lib_ioctl.c
new file mode 100644
index 000000000..9ef09fcd9
--- /dev/null
+++ b/nuttx/libc/misc/lib_ioctl.c
@@ -0,0 +1,101 @@
+/****************************************************************************
+ * libc/misc/lib_ioctl.c
+ *
+ * Copyright (C) 2014 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@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 <nuttx/fs/fs.h>
+
+#include "lib_internal.h"
+
+#if defined(CONFIG_LIBC_IOCTL_VARIADIC) && CONFIG_NFILE_DESCRIPTORS > 0
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: ioctl/fs_ioctl
+ *
+ * Description:
+ * Perform device specific operations.
+ *
+ * Parameters:
+ * fd File/socket descriptor of device
+ * req The ioctl command
+ * ... One argument of type unsigned long is expected
+ *
+ * Return:
+ * >=0 on success (positive non-zero values are cmd-specific)
+ * -1 on failure withi 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, ...)
+{
+ va_list ap;
+ unsigned long arg;
+
+ /* Get the unsigned long argument */
+
+ 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 && CONFIG_NFILE_DESCRIPTORS > 0 */