summaryrefslogtreecommitdiff
path: root/firmware/common
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2002-11-19 12:48:50 +0000
committerBjörn Stenberg <bjorn@haxx.se>2002-11-19 12:48:50 +0000
commitc5f5be565ea5488b3c6ba18b4af7696ef0cd92b8 (patch)
tree4bb0853b28ed368f04472372331b2bce7df5418d /firmware/common
parentfde9b57f7010369800d56b6b2eb98e6593236e13 (diff)
downloadrockbox-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.c57
-rw-r--r--firmware/common/file.h2
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