diff options
Diffstat (limited to 'firmware/common/file.c')
-rw-r--r-- | firmware/common/file.c | 42 |
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) | |||
277 | int rename(const char* path, const char* newpath) | 277 | int 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; |