Contiki file system service interface
diff --git a/contiki/lib/cfs-service.h b/contiki/lib/cfs-service.h
new file mode 100644
index 0000000..4f61532
--- /dev/null
+++ b/contiki/lib/cfs-service.h
@@ -0,0 +1,20 @@
+#ifndef __CFS_SERVICE_H__
+#define __CFS_SERVICE_H__
+
+#include "ek-service.h"
+
+#define CFS_SERVICE_VERSION 0x01
+#define CFS_SERVICE_NAME "Filesystem"
+
+struct cfs_service_interface {
+  u8_t version;
+  int  (* open)(char *name, int flags);
+  void (* close)(int fd);
+  int  (* read)(int fd, char *buf, int len);
+  int  (* write)(int fd, char *buf, int len);
+
+  int  (* dio_read)(char *buf, int track, int sector);
+  int  (* dio_write)(char *buf, int track, int sector);
+};
+
+#endif /* __CFS_SERVICE_H__ */
diff --git a/contiki/lib/cfs.c b/contiki/lib/cfs.c
new file mode 100644
index 0000000..f486896
--- /dev/null
+++ b/contiki/lib/cfs.c
@@ -0,0 +1,76 @@
+#include "contiki.h"
+
+#include "cfs.h"
+#include "cfs-service.h"
+
+
+static int  null_open(char *n, int f)             {return -1;}
+static void null_close(int f)                     {return;}
+static int  null_read(int f, char *b, int l)      {return -1;}
+static int  null_write(int f, char *b, int l)     {return -1;}
+static int  null_dio_read(char *b, int t, int s)  {return -1;}
+static int  null_dio_write(char *b, int t, int s) {return -1;}
+
+static const struct cfs_service_interface nullinterface =
+  {
+    CFS_SERVICE_VERSION,
+    null_open,
+    null_close,
+    null_read,
+    null_write,
+    null_dio_read,
+    null_dio_write
+  };
+
+EK_SERVICE(service, CFS_SERVICE_NAME);
+
+/*---------------------------------------------------------------------------*/
+static struct cfs_service_interface *
+find_service(void)
+{
+  struct cfs_service_interface *interface;
+  interface = (struct cfs_service_interface *)ek_service_state(&service);
+  if(interface != NULL &&
+     interface->version == CFS_SERVICE_VERSION) {
+    return interface;
+  } else {
+    return (struct cfs_service_interface *)&nullinterface;
+  }
+}
+/*---------------------------------------------------------------------------*/
+int
+cfs_open(char *name, int flags)
+{
+  find_service()->open(name, flags);
+}
+/*---------------------------------------------------------------------------*/
+void
+cfs_close(int fd)
+{
+  find_service()->close(fd);
+}
+/*---------------------------------------------------------------------------*/
+int
+cfs_read(int fd, char *buf, int len)
+{
+  find_service()->read(fd, buf, len);
+}
+/*---------------------------------------------------------------------------*/
+int
+cfs_write(int fd, char *buf, int len)
+{
+  find_service()->write(fd, buf, len);
+}
+/*---------------------------------------------------------------------------*/
+int
+cfs_dio_read(char *buf, int track, int sector)
+{
+  find_service()->dio_read(buf, track, sector);
+}
+/*---------------------------------------------------------------------------*/
+int
+cfs_dio_write(char *buf, int track, int sector)
+{
+  find_service()->dio_write(buf, track, sector);
+}
+/*---------------------------------------------------------------------------*/
diff --git a/contiki/lib/cfs.h b/contiki/lib/cfs.h
new file mode 100644
index 0000000..3458353
--- /dev/null
+++ b/contiki/lib/cfs.h
@@ -0,0 +1,14 @@
+#ifndef __CFS_H__
+#define __CFS_H__
+
+#include "cfs-service.h"
+
+int cfs_open(char *name, int flags);
+void cfs_close(int fd);
+int cfs_read(int fd, char *buf, int len);
+int cfs_write(int fd, char *buf, int len);
+
+int cfs_dio_read(char *buf, int track, int sector);
+int cfs_dio_write(char *buf, int track, int sector);
+
+#endif /* __CFS_H__ */