diff options
| author | Björn Stenberg <bjorn@haxx.se> | 2002-11-19 12:48:50 +0000 |
|---|---|---|
| committer | Björn Stenberg <bjorn@haxx.se> | 2002-11-19 12:48:50 +0000 |
| commit | c5f5be565ea5488b3c6ba18b4af7696ef0cd92b8 (patch) | |
| tree | 4bb0853b28ed368f04472372331b2bce7df5418d /firmware/common | |
| parent | fde9b57f7010369800d56b6b2eb98e6593236e13 (diff) | |
| download | rockbox-c5f5be565ea5488b3c6ba18b4af7696ef0cd92b8.zip rockbox-c5f5be565ea5488b3c6ba18b4af7696ef0cd92b8.tar.gz rockbox-c5f5be565ea5488b3c6ba18b4af7696ef0cd92b8.tar.bz2 rockbox-c5f5be565ea5488b3c6ba18b4af7696ef0cd92b8.tar.xz | |
Added rename()
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2857 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/common')
| -rw-r--r-- | firmware/common/file.c | 57 | ||||
| -rw-r--r-- | firmware/common/file.h | 2 |
2 files changed, 54 insertions, 5 deletions
diff --git a/firmware/common/file.c b/firmware/common/file.c index 01a0ebf..1d78dcb 100644 --- a/firmware/common/file.c +++ b/firmware/common/file.c @@ -125,7 +125,7 @@ int open(const char* pathname, int flags) break; } } - closedir(dir); + if ( !entry ) { LDEBUGF("Didn't find file %s\n",name); if ( file->write && (flags & O_CREAT) ) { @@ -135,6 +135,7 @@ int open(const char* pathname, int flags) DEBUGF("Couldn't create %s in %s\n",name,pathname); errno = EIO; file->busy = false; + closedir(dir); return -5; } file->size = 0; @@ -143,9 +144,11 @@ int open(const char* pathname, int flags) DEBUGF("Couldn't find %s in %s\n",name,pathname); errno = ENOENT; file->busy = false; + closedir(dir); return -6; } } + closedir(dir); file->cacheoffset = -1; file->fileoffset = 0; @@ -205,23 +208,69 @@ int remove(const char* name) file = &openfiles[fd]; rc = fat_truncate(&(file->fatfile)); if ( rc < 0 ) { - DEBUGF("Failed truncating file\n"); + DEBUGF("Failed truncating file: %d\n", rc); errno = EIO; return -1; } rc = fat_remove(&(file->fatfile)); if ( rc < 0 ) { - DEBUGF("Failed removing file\n"); + DEBUGF("Failed removing file: %d\n", rc); errno = EIO; return -2; } file->size = 0; + rc = close(fd); + if (rc<0) + return -3; + + return 0; +} + +int rename(const char* path, const char* newpath) +{ + int rc, fd; + char* nameptr; + struct filedesc* file; + + /* verify new path does not already exist */ + fd = open(newpath, O_RDONLY); + if ( fd >= 0 ) { + errno = EBUSY; + return fd; + } close(fd); - return rc; + fd = open(path, O_RDONLY); + if ( fd < 0 ) { + errno = EIO; + return fd; + } + + /* strip path */ + nameptr = strrchr(newpath,'/'); + if (nameptr) + nameptr++; + else + nameptr = (char*)newpath; + + file = &openfiles[fd]; + rc = fat_rename(&file->fatfile, nameptr, file->size); + if ( rc < 0 ) { + DEBUGF("Failed renaming file: %d\n", rc); + errno = EIO; + return -1; + } + + rc = close(fd); + if (rc<0) { + errno = EIO; + return -2; + } + + return 0; } int ftruncate(int fd, unsigned int size) diff --git a/firmware/common/file.h b/firmware/common/file.h index bf7ad82..bf8dc38 100644 --- a/firmware/common/file.h +++ b/firmware/common/file.h @@ -58,7 +58,7 @@ extern int lseek(int fd, int offset, int whence); extern int creat(const char *pathname, int mode); extern int write(int fd, void* buf, int count); extern int remove(const char* pathname); -extern int rename(const char* oldname, const char* newname); +extern int rename(const char* path, const char* newname); extern int ftruncate(int fd, unsigned int size); #else |