about summary refs log tree commit diff
path: root/fakefbdev/FakeFBDev.cpp
diff options
context:
space:
mode:
authorMalte Voos <git@mal.tc>2024-04-03 18:12:50 +0200
committerMalte Voos <git@mal.tc>2024-04-03 18:12:50 +0200
commit6eaea5ca33cfaeea7a7fc9434e082ce1a9e0c6c5 (patch)
tree0f65ca7bb4c5a951f132b6ad53582dc7b5dcc12a /fakefbdev/FakeFBDev.cpp
downloadreMder-6eaea5ca33cfaeea7a7fc9434e082ce1a9e0c6c5.tar.gz
reMder-6eaea5ca33cfaeea7a7fc9434e082ce1a9e0c6c5.zip
init
Diffstat (limited to 'fakefbdev/FakeFBDev.cpp')
-rw-r--r--fakefbdev/FakeFBDev.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/fakefbdev/FakeFBDev.cpp b/fakefbdev/FakeFBDev.cpp
new file mode 100644
index 0000000..a37b0a0
--- /dev/null
+++ b/fakefbdev/FakeFBDev.cpp
@@ -0,0 +1,59 @@
+#include "IOCTL.h"
+#include "SharedBuffer.h"
+
+#include <cstring>
+#include <dlfcn.h>
+#include <string>
+#include <sys/types.h>
+#include <unistd.h>
+
+SharedFB fb(default_fb_name);
+
+extern "C" {
+
+int
+open64(const char* pathname, int flags, mode_t mode = 0) {
+  if (pathname == std::string("/dev/fb0")) {
+    return fb.fd;
+  }
+
+  static const auto func_open =
+    (int (*)(const char*, int, mode_t))dlsym(RTLD_NEXT, "open64");
+
+  return func_open(pathname, flags, mode);
+}
+
+int
+open(const char* pathname, int flags, mode_t mode = 0) {
+  if (pathname == std::string("/dev/fb0")) {
+    return fb.fd;
+  }
+
+  static const auto func_open =
+    (int (*)(const char*, int, mode_t))dlsym(RTLD_NEXT, "open");
+
+  return func_open(pathname, flags, mode);
+}
+
+int
+close(int fd) {
+  if (fd == fb.fd) {
+    return 0;
+  }
+
+  static const auto func_close = (int (*)(int))dlsym(RTLD_NEXT, "close");
+  return func_close(fd);
+}
+
+int
+ioctl(int fd, unsigned long request, char* ptr) {
+  if (fd == fb.fd) {
+    return handleIOCTL(request, ptr);
+  }
+
+  static auto func_ioctl =
+    (int (*)(int, unsigned long request, ...))dlsym(RTLD_NEXT, "ioctl");
+
+  return func_ioctl(fd, request, ptr);
+}
+}