libcamera: base: memfd: Handle uClibc compatibility with function wrapper

uClibc doesn't provide memfd_create(), which led libcamera to open-code
the call using syscall(). Sprinkling the code with #ifdef's isn't the
most readable option, so improve it by providing a local implementation
of memfd_create(), and call the function unconditionally from
MemFd::create(). This makes the main code path more readable.

Suggested-by: Nicolas Dufresne <nicolas@ndufresne.ca>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Tested-by: Milan Zamazal <mzamazal@redhat.com>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
This commit is contained in:
Laurent Pinchart
2024-07-31 16:52:18 +03:00
parent a7a589df15
commit 93d9751945
+12 -5
View File
@@ -20,15 +20,26 @@
* \brief Anonymous file creation
*/
/* uClibc doesn't provide the file sealing API. */
#ifndef __DOXYGEN__
namespace {
/* uClibc doesn't provide the file sealing API. */
#if not HAVE_FILE_SEALS
#define F_ADD_SEALS 1033
#define F_SEAL_SHRINK 0x0002
#define F_SEAL_GROW 0x0004
#endif
#if not HAVE_MEMFD_CREATE
int memfd_create(const char *name, unsigned int flags)
{
return syscall(SYS_memfd_create, name, flags);
}
#endif
} /* namespace */
#endif /* __DOXYGEN__ */
namespace libcamera {
LOG_DECLARE_CATEGORY(File)
@@ -72,11 +83,7 @@ LOG_DECLARE_CATEGORY(File)
*/
UniqueFD MemFd::create(const char *name, std::size_t size, Seals seals)
{
#if HAVE_MEMFD_CREATE
int ret = memfd_create(name, MFD_ALLOW_SEALING | MFD_CLOEXEC);
#else
int ret = syscall(SYS_memfd_create, name, MFD_ALLOW_SEALING | MFD_CLOEXEC);
#endif
if (ret < 0) {
ret = errno;
LOG(File, Error)