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__ */