From fcb11d092af83d0e59da0336d8652ee4a735d65a Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Wed, 21 Aug 2019 17:44:23 +0200
Subject: [PATCH] BLE: FileTrans: Create a directory if needed

When a file should be created in a non existing folder, it will now be
automatically created.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
---
 epicardium/ble/filetransfer.c | 35 ++++++++++++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/epicardium/ble/filetransfer.c b/epicardium/ble/filetransfer.c
index 03181390c..bc140f99f 100644
--- a/epicardium/ble/filetransfer.c
+++ b/epicardium/ble/filetransfer.c
@@ -40,6 +40,7 @@
 #include "FreeRTOS.h"
 #include "crc32.h"
 
+#include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdbool.h>
@@ -227,6 +228,38 @@ static void sendCrcResponse(
 	AttsHandleValueNtf(connId, FILE_TRANS_CENTRAL_RX_VAL_HDL, len, answer);
 }
 
+/*
+ * This function splits the path into the folders and the file name and 
+ * creates all the missing folders.
+ * This function modifies the given parameter!
+ */
+static int bleFileCreateOrOpen(char *filepath)
+{
+	char *path;
+	char *fileName   = NULL;
+	int ret;
+
+	while (true) {
+		path     = strtok(filepath, "/");
+		filepath = NULL;
+		if (path == NULL)
+			break;
+
+		/* ignore relative paths */
+		if (strcmp(path, "..") == 0 || strcmp(path, ".") == 0)
+			continue;
+
+		if (fileName) {
+			ret = epic_file_mkdir(fileName);
+			if (ret)
+				return ret;
+		}
+		fileName = path;
+	}
+
+	return epic_file_open(filepath, "w");
+}
+
 static uint8_t bleFileOpen(dmConnId_t connId, uint8_t *pValue, uint16_t len)
 {
 	char filepath[100];
@@ -242,7 +275,7 @@ static uint8_t bleFileOpen(dmConnId_t connId, uint8_t *pValue, uint16_t len)
 	if (file_fd != -1)
 		epic_file_close(file_fd);
 
-	file_fd = epic_file_open(filepath, "w");
+	file_fd = bleFileCreateOrOpen(filepath);
 	if (file_fd < 0) {
 		sendCrcResponse(connId, 'e', 0, NULL, "open failed");
 		return ATT_ERR_RESOURCES;
-- 
GitLab