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

Laurent Pinchart laurent.pinchart at ideasonboard.com
Sun Jul 21 23:31:11 CEST 2024


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 at ideasonboard.com>
---
 meson.build              | 9 +++++++++
 src/v4l2/v4l2_compat.cpp | 4 ++++
 2 files changed, 13 insertions(+)

diff --git a/meson.build b/meson.build
index 2acd8c3e8cfe..ccd766a1e98c 100644
--- a/meson.build
+++ b/meson.build
@@ -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
diff --git a/src/v4l2/v4l2_compat.cpp b/src/v4l2/v4l2_compat.cpp
index 66468bf38d5b..6c9dca7201a3 100644
--- a/src/v4l2/v4l2_compat.cpp
+++ b/src/v4l2/v4l2_compat.cpp
@@ -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);

base-commit: 4661a7eedf81f00212956f0d396196b3eb4a417b
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list