aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Library/UefiShellUfmCommandLib/dir.c18
-rw-r--r--Library/UefiShellUfmCommandLib/dir.h10
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 */