tools/nolibc: make signature of ioctl() more flexible

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>
This commit is contained in:
Thomas Weißschuh 2025-01-28 22:22:46 +01:00
parent 4da4e35e9d
commit cfb1bfe953

View 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);