diff options
Diffstat (limited to 'Library')
| -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 | 
