libcamera/src/v4l2/v4l2_compat.cpp
Laurent Pinchart abce49655a v4l2: Fix compilation of __open_2() and __openat_2() with gcc
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: 0ce8f2390b ("v4l2: v4l2_compat: Add V4L2 compatibility layer")
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2020-01-04 16:07:17 +02:00

91 lines
1.9 KiB
C++

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* v4l2_compat.cpp - V4L2 compatibility layer
*/
#include "v4l2_compat_manager.h"
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#define LIBCAMERA_PUBLIC __attribute__((visibility("default")))
using namespace libcamera;
#define extract_va_arg(type, arg, last) \
{ \
va_list ap; \
va_start(ap, last); \
arg = va_arg(ap, type); \
va_end(ap); \
}
extern "C" {
LIBCAMERA_PUBLIC int open(const char *path, int oflag, ...)
{
mode_t mode = 0;
if (oflag & O_CREAT || oflag & O_TMPFILE)
extract_va_arg(mode_t, mode, oflag);
return V4L2CompatManager::instance()->openat(AT_FDCWD, path,
oflag, mode);
}
/* _FORTIFY_SOURCE redirects open to __open_2 */
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, ...)
{
mode_t mode = 0;
if (oflag & O_CREAT || oflag & O_TMPFILE)
extract_va_arg(mode_t, mode, oflag);
return V4L2CompatManager::instance()->openat(dirfd, path, oflag, mode);
}
LIBCAMERA_PUBLIC int __openat_2(int dirfd, const char *path, int oflag)
{
return openat(dirfd, path, oflag);
}
LIBCAMERA_PUBLIC int dup(int oldfd)
{
return V4L2CompatManager::instance()->dup(oldfd);
}
LIBCAMERA_PUBLIC int close(int fd)
{
return V4L2CompatManager::instance()->close(fd);
}
LIBCAMERA_PUBLIC void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset)
{
return V4L2CompatManager::instance()->mmap(addr, length, prot, flags,
fd, offset);
}
LIBCAMERA_PUBLIC int munmap(void *addr, size_t length)
{
return V4L2CompatManager::instance()->munmap(addr, length);
}
LIBCAMERA_PUBLIC int ioctl(int fd, unsigned long request, ...)
{
void *arg;
extract_va_arg(void *, arg, request);
return V4L2CompatManager::instance()->ioctl(fd, request, arg);
}
}