diff options
Diffstat (limited to 'firmware/target/hosted')
-rw-r--r-- | firmware/target/hosted/filesystem-app.c | 50 | ||||
-rw-r--r-- | firmware/target/hosted/filesystem-app.h | 1 |
2 files changed, 51 insertions, 0 deletions
diff --git a/firmware/target/hosted/filesystem-app.c b/firmware/target/hosted/filesystem-app.c index 7d59a174dc..fc4fff0eb5 100644 --- a/firmware/target/hosted/filesystem-app.c +++ b/firmware/target/hosted/filesystem-app.c | |||
@@ -453,6 +453,56 @@ struct dirent * app_readdir(DIR *dirp) | |||
453 | return (struct dirent *)osdirent; | 453 | return (struct dirent *)osdirent; |
454 | } | 454 | } |
455 | 455 | ||
456 | /* read a directory (reentrant) */ | ||
457 | int app_readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result) | ||
458 | { | ||
459 | struct __dir *this = (struct __dir *)dirp; | ||
460 | if (!this) | ||
461 | FILE_ERROR_RETURN(EBADF, -6); | ||
462 | |||
463 | if (!result) | ||
464 | FILE_ERROR_RETURN(EFAULT, -2); | ||
465 | |||
466 | *result = NULL; | ||
467 | |||
468 | if (!entry) | ||
469 | FILE_ERROR_RETURN(EFAULT, -3); | ||
470 | |||
471 | #ifdef HAVE_MULTIDRIVE | ||
472 | if (this->volumes_returned < NUM_VOLUMES) | ||
473 | { | ||
474 | while (++this->volumes_returned < NUM_VOLUMES) | ||
475 | { | ||
476 | if (!volume_present(this->volumes_returned)) | ||
477 | continue; | ||
478 | |||
479 | get_volume_name(this->volumes_returned, entry->d_name); | ||
480 | *result = entry; | ||
481 | return 0; | ||
482 | } | ||
483 | } | ||
484 | /* do normal directory reads */ | ||
485 | #endif /* HAVE_MULTIDRIVE */ | ||
486 | |||
487 | OS_DIRENT_T *osdirent = os_readdir(this->osdirp); | ||
488 | if (!osdirent) | ||
489 | FILE_ERROR_RETURN(ERRNO, -4); | ||
490 | #ifdef OS_DIRENT_CONVERT | ||
491 | size_t name_size = sizeof (entry->d_name); | ||
492 | if (strlcpy_from_os(entry->d_name, osdirent->d_name, | ||
493 | name_size) >= name_size) | ||
494 | { | ||
495 | entry->d_name[0] = '\0'; | ||
496 | errno = EOVERFLOW; | ||
497 | FILE_ERROR_RETURN(ENAMETOOLONG, -5); | ||
498 | } | ||
499 | |||
500 | *result = entry; | ||
501 | #endif /* OS_DIRENT_CONVERT */ | ||
502 | |||
503 | return 0; | ||
504 | } | ||
505 | |||
456 | int app_mkdir(const char *path) | 506 | int app_mkdir(const char *path) |
457 | { | 507 | { |
458 | char realpath[MAX_PATH]; | 508 | char realpath[MAX_PATH]; |
diff --git a/firmware/target/hosted/filesystem-app.h b/firmware/target/hosted/filesystem-app.h index b35b63e95f..2d7d6e817d 100644 --- a/firmware/target/hosted/filesystem-app.h +++ b/firmware/target/hosted/filesystem-app.h | |||
@@ -107,6 +107,7 @@ ssize_t app_readlink(const char *path, char *buf, size_t bufsize); | |||
107 | #ifndef DIRFUNCTIONS_DECLARED | 107 | #ifndef DIRFUNCTIONS_DECLARED |
108 | DIR * app_opendir(const char *dirname); | 108 | DIR * app_opendir(const char *dirname); |
109 | struct dirent * app_readdir(DIR *dirp); | 109 | struct dirent * app_readdir(DIR *dirp); |
110 | int app_readdir_r(DIR *dirp, struct dirent* entry, struct dirent **result); | ||
110 | int app_closedir(DIR *dirp); | 111 | int app_closedir(DIR *dirp); |
111 | int app_mkdir(const char *path); | 112 | int app_mkdir(const char *path); |
112 | int app_rmdir(const char *path); | 113 | int app_rmdir(const char *path); |