diff --git a/libraries/fs/fat/FATFileSystem.cpp b/libraries/fs/fat/FATFileSystem.cpp index fb0eb5253f..da7e8e086f 100644 --- a/libraries/fs/fat/FATFileSystem.cpp +++ b/libraries/fs/fat/FATFileSystem.cpp @@ -108,6 +108,15 @@ int FATFileSystem::remove(const char *filename) { return 0; } +int FATFileSystem::rename(const char *oldname, const char *newname) { + FRESULT res = f_rename(oldname, newname); + if (res) { + debug_if(FFS_DBG, "f_rename() failed: %d\n", res); + return -1; + } + return 0; +} + int FATFileSystem::format() { FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster) if (res) { diff --git a/libraries/fs/fat/FATFileSystem.h b/libraries/fs/fat/FATFileSystem.h index 1d8f56d9b5..0e1cc6355b 100644 --- a/libraries/fs/fat/FATFileSystem.h +++ b/libraries/fs/fat/FATFileSystem.h @@ -41,6 +41,7 @@ public: virtual FileHandle *open(const char* name, int flags); virtual int remove(const char *filename); + virtual int rename(const char *oldname, const char *newname); virtual int format(); virtual DirHandle *opendir(const char *name); virtual int mkdir(const char *name, mode_t mode); diff --git a/libraries/mbed/common/retarget.cpp b/libraries/mbed/common/retarget.cpp index 57bf22f29c..7362eddb3f 100644 --- a/libraries/mbed/common/retarget.cpp +++ b/libraries/mbed/common/retarget.cpp @@ -323,7 +323,15 @@ extern "C" int remove(const char *path) { } extern "C" int rename(const char *oldname, const char *newname) { - return -1; + FilePath fpOld(oldname); + FilePath fpNew(newname); + FileSystemLike *fsOld = fpOld.fileSystem(); + FileSystemLike *fsNew = fpNew.fileSystem(); + + /* rename only if both files are on the same FS */ + if (fsOld != fsNew || fsOld == NULL) return -1; + + return fsOld->rename(fpOld.fileName(), fpNew.fileName()); } extern "C" char *tmpnam(char *s) {