diff options
-rw-r--r-- | Library/UefiShellUfmCommandLib/dir.c | 18 | ||||
-rw-r--r-- | Library/UefiShellUfmCommandLib/dir.h | 10 |
2 files changed, 28 insertions, 0 deletions
diff --git a/Library/UefiShellUfmCommandLib/dir.c b/Library/UefiShellUfmCommandLib/dir.c index 8e3a083..6049d18 100644 --- a/Library/UefiShellUfmCommandLib/dir.c +++ b/Library/UefiShellUfmCommandLib/dir.c @@ -88,3 +88,21 @@ struct dir_list *scandir(CONST CHAR16 *search_path, CONST CHAR16 *wildcard, SHELL_FREE_NON_NULL(path); return list; } + +EFI_SHELL_FILE_INFO *dirl_getn(struct dir_list *dl, UINTN n) +{ + UINTN i = 1; + EFI_SHELL_FILE_INFO *list_head, *node; + list_head = dl->list_head; + + if(n < 1 || n > dl->len) + return NULL; + + node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&list_head->Link); + while(!IsNull(&list_head->Link, &node->Link) && i != n) { + node = (EFI_SHELL_FILE_INFO *)GetNextNode(&list_head->Link, &node->Link); + i++; + } + + return node; +} diff --git a/Library/UefiShellUfmCommandLib/dir.h b/Library/UefiShellUfmCommandLib/dir.h index 94ad601..912b00f 100644 --- a/Library/UefiShellUfmCommandLib/dir.h +++ b/Library/UefiShellUfmCommandLib/dir.h @@ -41,4 +41,14 @@ VOID dirl_release(struct dir_list *dl); struct dir_list *scandir(CONST CHAR16 *search_path, CONST CHAR16 *wildcard, CONST UINT64 attr); +/* + * Gets the data stored in the specified node of directory linked list + * + * dl: the pointer to the directory list + * n: the node number (starts with 1) + * + * return: A pointer to the EFI_SHELL_FILE_INFO or NULL if search fails +*/ +EFI_SHELL_FILE_INFO *dirl_getn(struct dir_list *dl, UINTN n); + #endif /* UFM_DIR_H */ |