diff --git a/epicardium/ble/filetransfer.c b/epicardium/ble/filetransfer.c index 03181390c573edb90e5be63ede43ed3b0b33b161..e3cb411e607946b7ebac6fff5e9d3e2b1b1db35f 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;