[PATCH] v4l2: v4l2_compat: Fix ioctl() prototype with musl C library
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon Jul 22 10:16:12 CEST 2024
Quoting Laurent Pinchart (2024-07-21 22:31:11)
> 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.
I love how standards make things ... all the same ...
> 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.
I guess we need an alpine linux target in our CI matrix...
> 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
> +
I think we should start thinking about how to make our top level
meson.build more modular with so much 'compatibility' checks ... but
that's a tomorrow problem.
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 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