diff options
Diffstat (limited to 'Library')
-rw-r--r-- | Library/UefiShellUfmCommandLib/cmds.c | 65 | ||||
-rw-r--r-- | Library/UefiShellUfmCommandLib/cmds.h | 20 |
2 files changed, 85 insertions, 0 deletions
diff --git a/Library/UefiShellUfmCommandLib/cmds.c b/Library/UefiShellUfmCommandLib/cmds.c new file mode 100644 index 0000000..93c5666 --- /dev/null +++ b/Library/UefiShellUfmCommandLib/cmds.c @@ -0,0 +1,65 @@ +#include <Library/UefiLib.h> +#include <Library/DebugLib.h> +#include <Library/MemoryAllocationLib.h> + +#include "cmds.h" + +EFI_STATUS make_directory(CONST CHAR16 *dir_name) +{ + EFI_STATUS status = EFI_SUCCESS; + CHAR16 *tmp_str = NULL; + CHAR16 split_char, *split_name = NULL; + SHELL_FILE_HANDLE file_handle = NULL; + + // check if dir already exists + status = ShellOpenFileByName(dir_name, + &file_handle, + EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, + EFI_FILE_DIRECTORY + ); + if(!EFI_ERROR(status)) { + ShellCloseFile(&file_handle); + return EFI_INVALID_PARAMETER; + } + + // create the nested directory from parent to child: + // if dir_name = test1\test2\test3, first create "test1\" directory, then "test1\test2\", finally "test1\test2\test3". + tmp_str = AllocateCopyPool(StrSize(dir_name), dir_name); + tmp_str = PathCleanUpDirectories(tmp_str); + if(tmp_str == NULL) + return EFI_OUT_OF_RESOURCES; + + split_name = tmp_str; + while(split_name != NULL) { + split_name = StrStr(split_name + 1, L"\\"); + if(split_name != NULL) { + split_char = *(split_name + 1); + *(split_name + 1) = '\0'; + } + + // check if current nested directory already exists + status = ShellOpenFileByName(tmp_str, + &file_handle, + EFI_FILE_MODE_READ, + EFI_FILE_DIRECTORY + ); + if(!EFI_ERROR(status)) { + ShellCloseFile(&file_handle); + } + else { + status = ShellCreateDirectory(tmp_str, &file_handle); + if(EFI_ERROR(status)) + break; + if(file_handle != NULL) + gEfiShellProtocol->CloseFile(file_handle); + } + + if(split_name != NULL) + *(split_name + 1) = split_char; + } + if(EFI_ERROR(status)) + status = EFI_ACCESS_DENIED; + + SHELL_FREE_NON_NULL(tmp_str); + return status; +} diff --git a/Library/UefiShellUfmCommandLib/cmds.h b/Library/UefiShellUfmCommandLib/cmds.h new file mode 100644 index 0000000..d819d47 --- /dev/null +++ b/Library/UefiShellUfmCommandLib/cmds.h @@ -0,0 +1,20 @@ +#ifndef UFM_CMDS_H +#define UFM_CMDS_H + +#include <Uefi.h> +#include <Library/ShellLib.h> + +/* + * Creates one or more directories. + * + * dir_name: the name of a directory or directories to create + * + * return: EFI_SUCCESS Directory(-ies) was created + EFI_INVALID_PARAMETER Parameter has an invalid value + EFI_ACCESS_DENIED Error while creating directory(-ies) + EFI_OUT_OF_RESOURCES Not enough resources were available to open the + file +*/ +EFI_STATUS make_directory(CONST CHAR16 *dir_name); + +#endif /* UFM_CMDS_H */ |