v4l2: v4l2_compat: Fix ioctl() prototype with musl C library

The musl C library, as well as the POSIX standard, define the ioctl()
function's request argument as an int. glibc and uclibc, on the other
hand, define it as an unsigned long.

This difference between the function prototype and the implementation in
the V4L2 adaptation layer causes a compilation error with musl. Fix it
by detecting the function prototype and declaring the libcamera ioctl()
handler accordingly.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2024-07-22 00:31:11 +03:00 committed by Kieran Bingham
parent 0c9862d6e3
commit 83b3141178
2 changed files with 13 additions and 0 deletions

View file

@ -90,6 +90,15 @@ if cc.has_header_symbol('sys/mman.h', 'memfd_create', prefix : '#define _GNU_SOU
config_h.set('HAVE_MEMFD_CREATE', 1)
endif
ioctl_posix_test = '''
#include <sys/ioctl.h>
int ioctl (int, int, ...);
'''
if cc.compiles(ioctl_posix_test)
config_h.set('HAVE_POSIX_IOCTL', 1)
endif
if cc.has_header_symbol('stdlib.h', 'secure_getenv', prefix : '#define _GNU_SOURCE')
config_h.set('HAVE_SECURE_GETENV', 1)
endif

View file

@ -154,7 +154,11 @@ LIBCAMERA_PUBLIC int munmap(void *addr, size_t length)
return V4L2CompatManager::instance()->munmap(addr, length);
}
#if HAVE_POSIX_IOCTL
LIBCAMERA_PUBLIC int ioctl(int fd, int request, ...)
#else
LIBCAMERA_PUBLIC int ioctl(int fd, unsigned long request, ...)
#endif
{
void *arg;
extract_va_arg(void *, arg, request);