[libcamera-devel] [PATCH] v4l2: Fix compilation of __open_2() and __openat_2() with gcc

Paul Elder paul.elder at ideasonboard.com
Sat Jan 4 07:03:27 CET 2020


On Sat, Jan 04, 2020 at 07:24:23AM +0200, Laurent Pinchart wrote:
> The __open_2() and __openat_2() functions are defined by glibc as taking
> 2 and 3 arguments respectively, with variadic arguments for the file
> mode as open() and openat() do. The V4L2 compatibility layer defines
> them as aliases for open() and openat(), which results in compilation
> failures with gcc:
> 
> ../../src/v4l2/v4l2_compat.cpp: In function ‘int __openat_2(int, const char*, int)’:
> ../../src/v4l2/v4l2_compat.cpp:58:14: error: invalid conversion from ‘int’ to ‘const char*’ [-fpermissive]
>    58 |  return open(dirfd, path, oflag);
>       |              ^~~~~
>       |              |
>       |              int
> ../../src/v4l2/v4l2_compat.cpp:31:39: note:   initializing argument 1 of ‘int open(const char*, int, ...)’
>    31 | LIBCAMERA_PUBLIC int open(const char *path, int oflag, ...)
>       |                           ~~~~~~~~~~~~^~~~
> ../../src/v4l2/v4l2_compat.cpp:58:21: error: invalid conversion from ‘const char*’ to ‘int’ [-fpermissive]
>    58 |  return open(dirfd, path, oflag);
>       |                     ^~~~
>       |                     |
>       |                     const char*
> ../../src/v4l2/v4l2_compat.cpp:31:49: note:   initializing argument 2 of ‘int open(const char*, int, ...)’
>    31 | LIBCAMERA_PUBLIC int open(const char *path, int oflag, ...)
>       |
> 
> Fix this by defining the two functions as wrappers around open() and
> openat() without variadic arguments.
> 
> Fixes: 0ce8f2390b52 ("v4l2: v4l2_compat: Add V4L2 compatibility layer")
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/v4l2/v4l2_compat.cpp | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/src/v4l2/v4l2_compat.cpp b/src/v4l2/v4l2_compat.cpp
> index 171ebed6f95b..a162037f6dc7 100644
> --- a/src/v4l2/v4l2_compat.cpp
> +++ b/src/v4l2/v4l2_compat.cpp
> @@ -39,7 +39,10 @@ LIBCAMERA_PUBLIC int open(const char *path, int oflag, ...)
>  }
>  
>  /* _FORTIFY_SOURCE redirects open to __open_2 */
> -LIBCAMERA_PUBLIC extern __typeof(open) __open_2 __attribute__ ((alias("open")));
> +LIBCAMERA_PUBLIC int __open_2(const char *path, int oflag)
> +{
> +	return open(path, oflag);
> +}
>  
>  LIBCAMERA_PUBLIC int openat(int dirfd, const char *path, int oflag, ...)
>  {
> @@ -50,7 +53,10 @@ LIBCAMERA_PUBLIC int openat(int dirfd, const char *path, int oflag, ...)
>  	return V4L2CompatManager::instance()->openat(dirfd, path, oflag, mode);
>  }
>  
> -LIBCAMERA_PUBLIC extern __typeof(openat) __openat_2 __attribute__ ((alias("openat")));
> +LIBCAMERA_PUBLIC int __openat_2(int dirfd, const char *path, int oflag)
> +{
> +	return openat(dirfd, path, oflag);
> +}
>  
>  LIBCAMERA_PUBLIC int dup(int oldfd)
>  {

I can't really test it as I can't reproduce the compilation problem, but
looks good to me, especially if it fixes the problem for you.

Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>


More information about the libcamera-devel mailing list