summaryrefslogtreecommitdiff
path: root/firmware/common/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/common/file.c')
-rw-r--r--firmware/common/file.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/firmware/common/file.c b/firmware/common/file.c
index e875d43f2e..546a927037 100644
--- a/firmware/common/file.c
+++ b/firmware/common/file.c
@@ -277,12 +277,16 @@ int remove(const char* name)
277int rename(const char* path, const char* newpath) 277int rename(const char* path, const char* newpath)
278{ 278{
279 int rc, fd; 279 int rc, fd;
280 DIR* dir;
280 char* nameptr; 281 char* nameptr;
282 char* dirptr;
281 struct filedesc* file; 283 struct filedesc* file;
284 char newpath2[MAX_PATH];
282 285
283 /* verify new path does not already exist */ 286 /* verify new path does not already exist */
287 /* If it is a directory, errno == EISDIR if the name exists */
284 fd = open(newpath, O_RDONLY); 288 fd = open(newpath, O_RDONLY);
285 if ( fd >= 0 ) { 289 if ( fd >= 0 || errno == EISDIR) {
286 close(fd); 290 close(fd);
287 errno = EBUSY; 291 errno = EBUSY;
288 return -1; 292 return -1;
@@ -295,25 +299,51 @@ int rename(const char* path, const char* newpath)
295 return fd * 10 - 2; 299 return fd * 10 - 2;
296 } 300 }
297 301
298 /* strip path */ 302 /* extract new file name */
299 nameptr = strrchr(newpath,'/'); 303 nameptr = strrchr(newpath,'/');
300 if (nameptr) 304 if (nameptr)
301 nameptr++; 305 nameptr++;
302 else 306 else
303 nameptr = (char*)newpath; 307 return - 3;
308
309 /* Extract new path */
310 strcpy(newpath2, newpath);
311
312 dirptr = strrchr(newpath2,'/');
313 if(dirptr)
314 *dirptr = 0;
315 else
316 return - 4;
304 317
318 dirptr = newpath2;
319
320 if(strlen(dirptr) == 0) {
321 dirptr = "/";
322 }
323
324 dir = opendir(dirptr);
325 if(!dir)
326 return - 5;
327
305 file = &openfiles[fd]; 328 file = &openfiles[fd];
306 rc = fat_rename(&file->fatfile, nameptr, file->size, file->attr); 329 rc = fat_rename(&file->fatfile, &dir->fatdir, nameptr,
330 file->size, file->attr);
307 if ( rc < 0 ) { 331 if ( rc < 0 ) {
308 DEBUGF("Failed renaming file: %d\n", rc); 332 DEBUGF("Failed renaming file: %d\n", rc);
309 errno = EIO; 333 errno = EIO;
310 return rc * 10 - 3; 334 return rc * 10 - 6;
311 } 335 }
312 336
313 rc = close(fd); 337 rc = close(fd);
314 if (rc<0) { 338 if (rc<0) {
315 errno = EIO; 339 errno = EIO;
316 return rc * 10 - 4; 340 return rc * 10 - 7;
341 }
342
343 rc = closedir(dir);
344 if (rc<0) {
345 errno = EIO;
346 return rc * 10 - 8;
317 } 347 }
318 348
319 return 0; 349 return 0;