From 6d4190bd0b2c2dc3bec26ace9f356a237e4e49dc Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Mon, 12 Mar 2018 13:13:29 -0500 Subject: [PATCH 1/4] fatfs: Update error code mapping A lot of the error codes in fatfs were mapped incorrectly. This patch revisits the error code mapping to try to correct these mistakes. --- features/filesystem/fat/FATFileSystem.cpp | 73 +++++++++++++---------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/features/filesystem/fat/FATFileSystem.cpp b/features/filesystem/fat/FATFileSystem.cpp index 70cd2ffb53..07e0327434 100644 --- a/features/filesystem/fat/FATFileSystem.cpp +++ b/features/filesystem/fat/FATFileSystem.cpp @@ -35,39 +35,48 @@ static int fat_error_remap(FRESULT res) { switch(res) { - case FR_OK: /* (0) Succeeded */ - return 0; /* no error */ - case FR_DISK_ERR: /* (1) A hard error occurred in the low level disk I/O layer */ - case FR_NOT_READY: /* (3) The physical drive cannot work */ - return -EIO; /* I/O error */ - case FR_NO_FILE: /* (4) Could not find the file */ - case FR_NO_PATH: /* (5) Could not find the path */ - case FR_INVALID_NAME: /* (6) The path name format is invalid */ - case FR_INVALID_DRIVE: /* (11) The logical drive number is invalid */ - case FR_NO_FILESYSTEM: /* (13) There is no valid FAT volume */ - return -ENOENT; /* No such file or directory */ - case FR_DENIED: /* (7) Access denied due to prohibited access or directory full */ - return -EACCES; /* Permission denied */ - case FR_EXIST: /* (8) Access denied due to prohibited access */ - return -EEXIST; /* File exists */ - case FR_WRITE_PROTECTED: /* (10) The physical drive is write protected */ - case FR_LOCKED: /* (16) The operation is rejected according to the file sharing policy */ - return -EACCES; /* Permission denied */ - case FR_INVALID_OBJECT: /* (9) The file/directory object is invalid */ - return -EFAULT; /* Bad address */ - case FR_NOT_ENABLED: /* (12) The volume has no work area */ - return -ENXIO; /* No such device or address */ - case FR_NOT_ENOUGH_CORE: /* (17) LFN working buffer could not be allocated */ - return -ENOMEM; /* Not enough space */ - case FR_TOO_MANY_OPEN_FILES: /* (18) Number of open files > _FS_LOCK */ - return -ENFILE; /* Too many open files in system */ - case FR_INVALID_PARAMETER: /* (19) Given parameter is invalid */ - return -ENOEXEC; /* Exec format error */ - case FR_INT_ERR: /* (2) Assertion failed */ - case FR_MKFS_ABORTED: /* (14) The f_mkfs() aborted due to any parameter error */ - case FR_TIMEOUT: /* (15) Could not get a grant to access the volume within defined period */ - default: /* Bad file number */ + case FR_OK: // (0) Succeeded + return 0; + case FR_DISK_ERR: // (1) A hard error occurred in the low level disk I/O layer + return -EIO; + case FR_INT_ERR: // (2) Assertion failed + return -1; + case FR_NOT_READY: // (3) The physical drive cannot work + return -EIO; + case FR_NO_FILE: // (4) Could not find the file + return -ENOENT; + case FR_NO_PATH: // (5) Could not find the path + return -ENOTDIR; + case FR_INVALID_NAME: // (6) The path name format is invalid + return -EINVAL; + case FR_DENIED: // (7) Access denied due to prohibited access or directory full + return -EACCES; + case FR_EXIST: // (8) Access denied due to prohibited access + return -EEXIST; + case FR_INVALID_OBJECT: // (9) The file/directory object is invalid return -EBADF; + case FR_WRITE_PROTECTED: // (10) The physical drive is write protected + return -EACCES; + case FR_INVALID_DRIVE: // (11) The logical drive number is invalid + return -ENODEV; + case FR_NOT_ENABLED: // (12) The volume has no work area + return -ENODEV; + case FR_NO_FILESYSTEM: // (13) There is no valid FAT volume + return -EINVAL; + case FR_MKFS_ABORTED: // (14) The f_mkfs() aborted due to any problem + return -EIO; + case FR_TIMEOUT: // (15) Could not get a grant to access the volume within defined period + return -ETIMEDOUT; + case FR_LOCKED: // (16) The operation is rejected according to the file sharing policy + return -EBUSY; + case FR_NOT_ENOUGH_CORE: // (17) LFN working buffer could not be allocated + return -ENOMEM; + case FR_TOO_MANY_OPEN_FILES: // (18) Number of open files > FF_FS_LOCK + return -ENFILE; + case FR_INVALID_PARAMETER: // (19) Given parameter is invalid + return -EINVAL; + default: + return -res; } } From 5efda4b922f1c5cc4a4b7ec6cfabf6a33d261c18 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sun, 29 Apr 2018 09:50:24 -0500 Subject: [PATCH 2/4] fatfs: Fixed ENOTEMPTY error for removing a directory --- features/filesystem/fat/FATFileSystem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/features/filesystem/fat/FATFileSystem.cpp b/features/filesystem/fat/FATFileSystem.cpp index 07e0327434..018c7ff226 100644 --- a/features/filesystem/fat/FATFileSystem.cpp +++ b/features/filesystem/fat/FATFileSystem.cpp @@ -404,6 +404,10 @@ int FATFileSystem::remove(const char *path) if (res != FR_OK) { debug_if(FFS_DBG, "f_unlink() failed: %d\n", res); + if (res == FR_DENIED) { + printf("hi %d -> %d\n", FR_DENIED, -ENOTEMPTY); + return -ENOTEMPTY; + } } return fat_error_remap(res); } From 78992a4c26012718e997681ba702bcb836d786c5 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Sun, 29 Apr 2018 09:50:55 -0500 Subject: [PATCH 3/4] retarget: Added include errno.h Unfortunately, some toolchains don't define the same errno codes that are used fairly consistently on Linux based platforms, which means they also don't match the errno codes used in the retarget layer. If a user includes errno.h after mbed.h, the errno codes can be redefined incorrectly. Adding an include of errno.h in mbed.h forces the order to be fixed. --- platform/mbed_retarget.h | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/mbed_retarget.h b/platform/mbed_retarget.h index b3c6e6d502..3faa095475 100644 --- a/platform/mbed_retarget.h +++ b/platform/mbed_retarget.h @@ -26,6 +26,7 @@ #endif //__cplusplus #include #include +#include /* We can get the following standard types from sys/types for gcc, but we * need to define the types ourselves for the other compilers that normally From effdc6571b2ff0c293f8d360475b0d4f24782253 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Thu, 17 May 2018 10:24:46 -0500 Subject: [PATCH 4/4] retarget: Added workaround for conflicting definitions of error_t The errno.h header file defines the type error_t, unfortunately this is a common type name that may be defined in user code. For at least GCC we can work around this by telling errno that the error_t is already defined. --- platform/mbed_retarget.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/platform/mbed_retarget.h b/platform/mbed_retarget.h index 3faa095475..bf98eab3d0 100644 --- a/platform/mbed_retarget.h +++ b/platform/mbed_retarget.h @@ -26,7 +26,18 @@ #endif //__cplusplus #include #include + +/* Include logic for errno so we can get errno defined but not bring in error_t, + * including errno here prevents an include later, which would redefine our + * error codes + */ +#ifndef __error_t_defined +#define __error_t_defined 1 #include +#undef __error_t_defined +#else +#include +#endif /* We can get the following standard types from sys/types for gcc, but we * need to define the types ourselves for the other compilers that normally