diff options
author | Joursoir <chat@joursoir.net> | 2021-12-13 20:38:27 +0300 |
---|---|---|
committer | Joursoir <chat@joursoir.net> | 2021-12-13 20:38:27 +0300 |
commit | 8fe71800158e0da52b380ccbd758732b7f3777e4 (patch) | |
tree | 38667c09192784a26a3bdece3c89ffca0316d219 /Library/UefiShellUfmCommandLib | |
parent | 8a4c78cc58ac89aca08d8d54a61462d8fb7f814b (diff) | |
download | ufm-8fe71800158e0da52b380ccbd758732b7f3777e4.tar.gz ufm-8fe71800158e0da52b380ccbd758732b7f3777e4.tar.bz2 ufm-8fe71800158e0da52b380ccbd758732b7f3777e4.zip |
cmds: make the advanced stub for copying a file
Diffstat (limited to 'Library/UefiShellUfmCommandLib')
-rw-r--r-- | Library/UefiShellUfmCommandLib/cmds.c | 52 | ||||
-rw-r--r-- | Library/UefiShellUfmCommandLib/cmds.h | 13 |
2 files changed, 65 insertions, 0 deletions
diff --git a/Library/UefiShellUfmCommandLib/cmds.c b/Library/UefiShellUfmCommandLib/cmds.c index 30d94b8..5aa4642 100644 --- a/Library/UefiShellUfmCommandLib/cmds.c +++ b/Library/UefiShellUfmCommandLib/cmds.c @@ -76,6 +76,58 @@ EFI_STATUS delete_file(EFI_SHELL_FILE_INFO *node) return status; } +EFI_STATUS copy_file(CONST CHAR16 *src, CONST CHAR16 *dest) +{ + SHELL_FILE_HANDLE dest_handle = NULL; + EFI_SHELL_FILE_INFO *list; + EFI_STATUS status; + CONST CHAR16 *path_last_item; + CHAR16 *temp_name = NULL, *correct_dest = NULL; + UINTN size = 0; + + if(StrCmp(src, dest) == 0) + return EFI_SUCCESS; + + if(ShellIsDirectory(src) == EFI_SUCCESS) { + // move DIRECTORY to DIRECTORY + status = ShellCreateDirectory(dest, &dest_handle); + if(EFI_ERROR(status)) + return EFI_ACCESS_DENIED; + + temp_name = NULL; + StrnCatGrow(&temp_name, &size, src, 0); + StrnCatGrow(&temp_name, &size, L"\\*", 0); + if(temp_name == NULL) + return EFI_OUT_OF_RESOURCES; + + ShellOpenFileMetaArg(temp_name, EFI_FILE_MODE_READ, &list); + *temp_name = CHAR_NULL; + StrnCatGrow(&temp_name, &size, dest, 0); + StrnCatGrow(&temp_name, &size, L"\\", 0); + // TODO: copy directory entries + ShellCloseFileMetaArg(&list); + SHELL_FREE_NON_NULL(temp_name); + return status; + } + + StrnCatGrow(&correct_dest, &size, dest, 0); + if(ShellIsDirectory(dest) == EFI_SUCCESS) { + // move SOURCE to DIRECTORY + path_last_item = src; + while((temp_name = StrStr(path_last_item, L"\\"))) + path_last_item = temp_name + 1; + ASSERT(path_last_item != NULL); + + // dest would be "dest/(src last item)" + StrnCatGrow(&correct_dest, &size, L"\\", 0); + StrnCatGrow(&correct_dest, &size, path_last_item, 0); + } + + // TODO: copy single file + SHELL_FREE_NON_NULL(correct_dest); + return status; +} + EFI_STATUS make_directory(CONST CHAR16 *dir_name) { EFI_STATUS status = EFI_SUCCESS; diff --git a/Library/UefiShellUfmCommandLib/cmds.h b/Library/UefiShellUfmCommandLib/cmds.h index f58cdea..8635192 100644 --- a/Library/UefiShellUfmCommandLib/cmds.h +++ b/Library/UefiShellUfmCommandLib/cmds.h @@ -17,6 +17,19 @@ EFI_STATUS delete_file(EFI_SHELL_FILE_INFO *node); /* + * Copies one file/directory (including subdirectories) to another location. + * If destination is a directory, the source is copied to a directory + * + * NOTE: if destination is a existing file, the source overwrites file + * + * src: the pointer to source string + * dest: the pointer to destination string + * + * return: unknown +*/ +EFI_STATUS copy_file(CONST CHAR16 *src, CONST CHAR16 *dest); + +/* * Creates one or more directories. * * dir_name: the name of a directory or directories to create |