add system interface to enable testing

Add system interface to enable testing of the linux syscalls.

Change-Id: Ia135695de4ae8ed561516b8355f03c7191523780
Signed-off-by: Patrick Venture <venture@google.com>
diff --git a/internal/sys.hpp b/internal/sys.hpp
new file mode 100644
index 0000000..fb824ef
--- /dev/null
+++ b/internal/sys.hpp
@@ -0,0 +1,60 @@
+#pragma once
+
+/* NOTE: IIRC, wak@ is working on exposing some of this in stdplus, so we can
+ * transition when that's ready.
+ *
+ * Copied some from gpioplus to enable unit-testing of lpc nuvoton and later
+ * other pieces.
+ */
+
+#include <sys/mman.h>
+
+#include <cinttypes>
+#include <cstddef>
+
+namespace blobs
+{
+namespace flash
+{
+namespace internal
+{
+
+/**
+ * @class Sys
+ * @brief Overridable direct syscall interface
+ */
+class Sys
+{
+  public:
+    virtual ~Sys() = default;
+
+    virtual int open(const char* pathname, int flags) const = 0;
+    virtual int close(int fd) const = 0;
+    virtual void* mmap(void* addr, size_t length, int prot, int flags, int fd,
+                       off_t offset) const = 0;
+    virtual int munmap(void* addr, size_t length) const = 0;
+    virtual int getpagesize() const = 0;
+};
+
+/**
+ * @class SysImpl
+ * @brief syscall concrete implementation
+ * @details Passes through all calls to the normal linux syscalls
+ */
+class SysImpl : public Sys
+{
+  public:
+    int open(const char* pathname, int flags) const override;
+    int close(int fd) const override;
+    void* mmap(void* addr, size_t length, int prot, int flags, int fd,
+               off_t offset) const override;
+    int munmap(void* addr, size_t length) const override;
+    int getpagesize() const override;
+};
+
+/** @brief Default instantiation of sys */
+extern SysImpl sys_impl;
+
+} // namespace internal
+} // namespace flash
+} // namespace blobs