summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2024-07-31 16:52:18 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2024-08-01 01:21:59 +0300
commit93d975194522450894a6fe7554b28a14fbfe7214 (patch)
treec1473b5a19d414f1cab22f097dfaabab818b2da8
parenta7a589df15f4ba3d6642aa8ae031a9b3ed0f5a1f (diff)
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>
-rw-r--r--src/libcamera/base/memfd.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/libcamera/base/memfd.cpp b/src/libcamera/base/memfd.cpp
index 72474307..ed0b299b 100644
--- a/src/libcamera/base/memfd.cpp
+++ b/src/libcamera/base/memfd.cpp
@@ -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)