]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
tools/nolibc: make signature of ioctl() more flexible
authorThomas Weißschuh <linux@weissschuh.net>
Tue, 28 Jan 2025 21:22:46 +0000 (22:22 +0100)
committerThomas Weißschuh <linux@weissschuh.net>
Mon, 3 Feb 2025 19:57:39 +0000 (20:57 +0100)
POSIX defines the signature of ioctl() as follows,
to allow passing a pointer or integer without casting:
int ioctl(int fildes, int request, ... /* arg */);

Nolibc ioctl() expects a pointer, forcing the user to manually cast.
Using va_arg to make the signature more flexible would work but seems to
prevent inlining of the function. Instead use a macro. "fd" and "req"
will still be typechecked through sys_ioctl().

Acked-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
tools/include/nolibc/sys.h

index d4a5c2399a66b200ebf7ab249569cce2285481a5..8c0a55bc9dc3aacd110db0195975fe4f85480fc5 100644 (file)
@@ -532,20 +532,16 @@ uid_t getuid(void)
 
 
 /*
- * int ioctl(int fd, unsigned long req, void *value);
+ * int ioctl(int fd, unsigned long cmd, ... arg);
  */
 
 static __attribute__((unused))
-int sys_ioctl(int fd, unsigned long req, void *value)
+long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
-       return my_syscall3(__NR_ioctl, fd, req, value);
+       return my_syscall3(__NR_ioctl, fd, cmd, arg);
 }
 
-static __attribute__((unused))
-int ioctl(int fd, unsigned long req, void *value)
-{
-       return __sysret(sys_ioctl(fd, req, value));
-}
+#define ioctl(fd, cmd, arg) __sysret(sys_ioctl(fd, cmd, (unsigned long)(arg)))
 
 /*
  * int kill(pid_t pid, int signal);