From 8894d5900746e26416371109812a9fc935f0dfe5 Mon Sep 17 00:00:00 2001
From: schneider <schneider@blinkenlichts.net>
Date: Mon, 20 Jan 2020 13:18:45 +0100
Subject: [PATCH] fix(fs_util): correctly lock fs when reading ble config

---
 epicardium/ble/ble.c                       |   2 +-
 epicardium/ble/ble_main.c                  |   2 +-
 epicardium/fs/fs_util.c                    |  92 ++++++++++++++++++
 {lib/ff13/util => epicardium/fs}/fs_util.h |   0
 epicardium/meson.build                     |   1 +
 epicardium/modules/config.c                |   6 +-
 lib/ff13/meson.build                       |   2 -
 lib/ff13/util/fs_util.c                    | 106 ---------------------
 8 files changed, 98 insertions(+), 113 deletions(-)
 create mode 100644 epicardium/fs/fs_util.c
 rename {lib/ff13/util => epicardium/fs}/fs_util.h (100%)
 delete mode 100644 lib/ff13/util/fs_util.c

diff --git a/epicardium/ble/ble.c b/epicardium/ble/ble.c
index a7f10ea5..dbf52946 100644
--- a/epicardium/ble/ble.c
+++ b/epicardium/ble/ble.c
@@ -1,7 +1,7 @@
 #include "epicardium.h"
 #include "modules/log.h"
 
-#include "fs_util.h"
+#include "fs/fs_util.h"
 #include "wsf_types.h"
 #include "wsf_buf.h"
 #include "wsf_trace.h"
diff --git a/epicardium/ble/ble_main.c b/epicardium/ble/ble_main.c
index 4336624d..17da918f 100644
--- a/epicardium/ble/ble_main.c
+++ b/epicardium/ble/ble_main.c
@@ -17,7 +17,7 @@
 #include <string.h>
 #include "wsf_types.h"
 #include "util/bstream.h"
-#include "fs_util.h"
+#include "fs/fs_util.h"
 #include "wsf_msg.h"
 #include "wsf_trace.h"
 #include "hci_api.h"
diff --git a/epicardium/fs/fs_util.c b/epicardium/fs/fs_util.c
new file mode 100644
index 00000000..1266df23
--- /dev/null
+++ b/epicardium/fs/fs_util.c
@@ -0,0 +1,92 @@
+#include "fs_util.h"
+
+#include "epicardium.h"
+
+#include <stdint.h>
+#include <string.h>
+
+int fs_read_file(char *filename, void *data, int len)
+{
+	int fd = epic_file_open(filename, "r");
+	if (fd < 0) {
+		return fd;
+	}
+
+	int res = epic_file_read(fd, data, len);
+	epic_file_close(fd);
+
+	return res;
+}
+
+int fs_read_text_file(char *filename, char *data, int len)
+{
+	int readbytes;
+
+	if (len < 1)
+		return -1;
+	readbytes = fs_read_file(filename, data, len - 1);
+	if (readbytes < 0) {
+		data[0] = 0;
+		return readbytes;
+	};
+	data[readbytes] = 0;
+	while (readbytes > 0 && data[readbytes - 1] < 0x20) {
+		data[--readbytes] = 0;
+	};
+	return readbytes;
+}
+
+int fs_write_file(char *filename, const void *data, int len)
+{
+	int fd = epic_file_open(filename, "w");
+	if (fd < 0) {
+		return fd;
+	}
+
+	int res = epic_file_write(fd, data, len);
+	epic_file_close(fd);
+
+	return res;
+}
+
+int fs_get_file_size(char *filename)
+{
+	struct epic_stat stat;
+	int res = epic_file_stat(filename, &stat);
+	return res < 0 ? res : (int)stat.size;
+}
+
+#if 0
+#include "ff.h"
+FATFS FatFs;          /* File system object for logical drive */
+FS_USAGE FsUsage;
+/* TODO: Port functions from r0ket/rad10 libs */
+int fs_info(FATFS *fs)
+{
+    memcpy(fs, &FatFs, sizeof(FATFS));
+    return 0;
+}
+int fs_usage(FATFS *fs, FS_USAGE *fs_usage)
+{
+    FRESULT res;
+    DWORD tot_clust, fre_clust, sec_size;
+
+    res = f_getfree("/", &fre_clust, &fs);
+    if(res != FR_OK)
+        return -res;
+
+    // sectore size = sectors per cluster *  sector size
+#if FF_MAX_SS == FF_MIN_SS
+    sec_size = fs->csize * FF_MAX_SS;
+#else
+    sec_size = fs->csize * fs.ssize;
+#endif
+
+    // total/free sectors * sectore size
+    tot_clust = fs->n_fatent - 2;
+    fs_usage->total = tot_clust * sec_size; //FatFs.ssize;
+    fs_usage->free = fre_clust * sec_size; //FatFs.ssize;
+
+    return 0;
+}
+#endif
diff --git a/lib/ff13/util/fs_util.h b/epicardium/fs/fs_util.h
similarity index 100%
rename from lib/ff13/util/fs_util.h
rename to epicardium/fs/fs_util.h
diff --git a/epicardium/meson.build b/epicardium/meson.build
index a6a6c052..0d10151a 100644
--- a/epicardium/meson.build
+++ b/epicardium/meson.build
@@ -86,6 +86,7 @@ elf = executable(
   'main.c',
   'support.c',
   'fs/filesystem_fat.c',
+  'fs/fs_util.c',
   module_sources,
   l0der_sources,
   ble_sources,
diff --git a/epicardium/modules/config.c b/epicardium/modules/config.c
index 9f3e75f4..7371f02a 100644
--- a/epicardium/modules/config.c
+++ b/epicardium/modules/config.c
@@ -272,10 +272,10 @@ void load_config(void)
 			char newline;
 			rc = epic_file_read(fd, &newline, 1);
 			if (rc < 0 || (newline != '\n' && newline != '\r')) {
-				LOG_ERR("card10.cfg", "seek failed, aborting");
+				LOG_ERR("card10.cfg", "read failed, aborting");
 				LOG_DEBUG(
 					"card10.cfg",
-					"seek failed at read-back of newline: rc: %d read: %d",
+					"read failed at read-back of newline: rc: %d read: %d",
 					rc,
 					(int)newline
 				);
@@ -305,7 +305,7 @@ static size_t read_config_offset(size_t seek_offset, char *buf, size_t buf_len)
 
 	int rc = epic_file_seek(fd, seek_offset, SEEK_SET);
 	if (rc < 0) {
-		LOG_ERR("card10.cfg", "seek failed, aborting");
+		LOG_ERR("card10.cfg", "seek2 failed (%d), aborting", rc);
 		return 0;
 	}
 
diff --git a/lib/ff13/meson.build b/lib/ff13/meson.build
index fe2b3dc8..63f069c1 100644
--- a/lib/ff13/meson.build
+++ b/lib/ff13/meson.build
@@ -1,6 +1,5 @@
 includes = include_directories(
   './Source/',
-  './util/',
 )
 
 sources = files(
@@ -8,7 +7,6 @@ sources = files(
   './Source/ff.c',
   './Source/ffsystem.c',
   './Source/ffunicode.c',
-  './util/fs_util.c',
 )
 
 lib = static_library(
diff --git a/lib/ff13/util/fs_util.c b/lib/ff13/util/fs_util.c
deleted file mode 100644
index f576de73..00000000
--- a/lib/ff13/util/fs_util.c
+++ /dev/null
@@ -1,106 +0,0 @@
-#include "fs_util.h"
-#include "ff.h"
-#include <stdint.h>
-#include <string.h>
-
-FATFS FatFs;          /* File system object for logical drive */
-FS_USAGE FsUsage;
-
-
-int fs_info(FATFS *fs)
-{
-    memcpy(fs, &FatFs, sizeof(FATFS));
-    return 0;
-}
-int fs_usage(FATFS *fs, FS_USAGE *fs_usage)
-{
-    FRESULT res;
-    DWORD tot_clust, fre_clust, sec_size;
-
-    res = f_getfree("/", &fre_clust, &fs);
-    if(res != FR_OK)
-        return -res;
-
-    // sectore size = sectors per cluster *  sector size
-#if FF_MAX_SS == FF_MIN_SS
-    sec_size = fs->csize * FF_MAX_SS;
-#else
-    sec_size = fs->csize * fs.ssize;
-#endif
-
-    // total/free sectors * sectore size
-    tot_clust = fs->n_fatent - 2;
-    fs_usage->total = tot_clust * sec_size; //FatFs.ssize;
-    fs_usage->free = fre_clust * sec_size; //FatFs.ssize;
-
-    return 0;
-}
-
-int fs_read_file(char * filename, void * data, int len){
-    FIL file;
-    UINT readbytes;
-    int res;
-
-    res=f_open(&file, filename, FA_OPEN_EXISTING|FA_READ);
-    if(res){
-        return -1;
-    };
-
-    res = f_read(&file, data, len, &readbytes);
-    if(res){
-        return -1;
-    };
-
-    f_close(&file);
-
-	return readbytes;
-}
-
-int fs_read_text_file(char * filename, char * data, int len){
-    int readbytes;
-
-    if(len<1) return -1;
-    readbytes=fs_read_file(filename,data,len-1);
-    if(readbytes<0){
-        data[0]=0;
-        return readbytes;
-    };
-    data[readbytes]=0;
-    while(readbytes>0 && data[readbytes-1]<0x20){
-        data[--readbytes]=0;
-    };
-    return readbytes;
-}
-
-
-int fs_write_file(char * filename, const void * data, int len){
-    FIL file;
-    UINT writebytes;
-    int res;
-
-	res=f_open(&file, filename, FA_CREATE_ALWAYS|FA_WRITE);
-    if(res){
-        return -res;
-    };
-
-    res = f_write(&file, data, len, &writebytes);
-    if(res){
-        return -res;
-    };
-    f_close(&file);
-
-	return writebytes;
-}
-
-int fs_get_file_size(char * filename){
-    FILINFO finfo;
-    int res;
-
-    /// XXX: Untested
-    res=f_stat(filename, &finfo);
-    if(res){
-        return -1;
-    }
-
-    return finfo.fsize;
-}
-- 
GitLab