diff options
author | Joursoir <chat@joursoir.net> | 2021-12-12 11:05:07 +0300 |
---|---|---|
committer | Joursoir <chat@joursoir.net> | 2021-12-12 11:05:07 +0300 |
commit | afd916c38fda0d70b83015ed867c30bc1578fc14 (patch) | |
tree | 31813565cacd89e77da1ecf4914b0a9f5671e884 /Library/UefiShellUfmCommandLib/cmds.c | |
parent | d7eaae0e2c816c0727ba0a1a5e497a934e0289b6 (diff) | |
download | ufm-afd916c38fda0d70b83015ed867c30bc1578fc14.tar.gz ufm-afd916c38fda0d70b83015ed867c30bc1578fc14.tar.bz2 ufm-afd916c38fda0d70b83015ed867c30bc1578fc14.zip |
add creation of one or more directories
Diffstat (limited to 'Library/UefiShellUfmCommandLib/cmds.c')
-rw-r--r-- | Library/UefiShellUfmCommandLib/cmds.c | 65 |
1 files changed, 65 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; +} |