ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
The UEFI Shell touch command returns an error if a file to be touched
doesn't exist. In other command line operating environments, the touch
command typically creates a file if it doesn't exist. This patch updates
the UEFI Shell touch command to follow this convention.
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Jaben Carsey <jaben.carsey@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Westfahl <jeff.westfahl@ni.com>
---
ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c
index 639346f..921de5a 100644
--- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c
+++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c
@@ -175,11 +175,13 @@ ShellCommandRunTouch (
UINTN ParamCount;
EFI_SHELL_FILE_INFO *FileList;
EFI_SHELL_FILE_INFO *Node;
+ SHELL_FILE_HANDLE FileHandle;
ProblemParam = NULL;
ShellStatus = SHELL_SUCCESS;
ParamCount = 0;
FileList = NULL;
+ FileHandle = NULL;
//
// initialize the shell lib (we must be in non-auto-init...)
@@ -226,9 +228,17 @@ ShellCommandRunTouch (
){
Status = ShellOpenFileMetaArg((CHAR16*)Param, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, &FileList);
if (EFI_ERROR(Status)) {
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"touch", (CHAR16*)Param);
- ShellStatus = SHELL_NOT_FOUND;
- break;
+ //
+ // try to create the file in case it doesn't exist
+ //
+ gEfiShellProtocol->CreateFile(Param, 0, &FileHandle);
+ gEfiShellProtocol->CloseFile(FileHandle);
+ Status = ShellOpenFileMetaArg((CHAR16*)Param, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, &FileList);
+ if (EFI_ERROR(Status)) {
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"touch", (CHAR16*)Param);
+ ShellStatus = SHELL_NOT_FOUND;
+ break;
+ }
}
//
// make sure we completed the param parsing sucessfully...
--
2.7.4
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
I don't think it is good to change the behavior of the tool beyond what is in the specification. Further, this tool has existed for quite a long time in the EDK shell and now the UEFI shell without this behavior. So the de-facto standard of this environment is "don't create". Leaving behind stray 0 byte files would be an unwanted side effect for existing scripts that use this command. Further, this doesn't add any corresponding command-line options to , and certainly not without corresponding command-line options like -c to disable this behavior. Thanks, Tim -----Original Message----- From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Jeff Westfahl Sent: Monday, May 15, 2017 2:02 PM To: edk2-devel@lists.01.org Cc: Ruiyu Ni <ruiyu.ni@intel.com>; Jaben Carsey <jaben.carsey@intel.com> Subject: [edk2] [PATCH] ShellPkg/Touch: Create file if it doesn't exist The UEFI Shell touch command returns an error if a file to be touched doesn't exist. In other command line operating environments, the touch command typically creates a file if it doesn't exist. This patch updates the UEFI Shell touch command to follow this convention. Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Jaben Carsey <jaben.carsey@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Westfahl <jeff.westfahl@ni.com> --- ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c index 639346f..921de5a 100644 --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c @@ -175,11 +175,13 @@ ShellCommandRunTouch ( UINTN ParamCount; EFI_SHELL_FILE_INFO *FileList; EFI_SHELL_FILE_INFO *Node; + SHELL_FILE_HANDLE FileHandle; ProblemParam = NULL; ShellStatus = SHELL_SUCCESS; ParamCount = 0; FileList = NULL; + FileHandle = NULL; // // initialize the shell lib (we must be in non-auto-init...) @@ -226,9 +228,17 @@ ShellCommandRunTouch ( ){ Status = ShellOpenFileMetaArg((CHAR16*)Param, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, &FileList); if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"touch", (CHAR16*)Param); - ShellStatus = SHELL_NOT_FOUND; - break; + // + // try to create the file in case it doesn't exist + // + gEfiShellProtocol->CreateFile(Param, 0, &FileHandle); + gEfiShellProtocol->CloseFile(FileHandle); + Status = ShellOpenFileMetaArg((CHAR16*)Param, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, &FileList); + if (EFI_ERROR(Status)) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"touch", (CHAR16*)Param); + ShellStatus = SHELL_NOT_FOUND; + break; + } } // // make sure we completed the param parsing sucessfully... -- 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
Hi Tim, I think those are reasonable arguments. It's probably best to just leave the touch command alone. It sounds like we've gotten along fine with the existing behavior for quite a while. Regards, Jeff On Mon, 15 May 2017, Tim Lewis wrote: > I don't think it is good to change the behavior of the tool beyond what is in the specification. Further, this tool has existed for quite a long time in the EDK shell and now the UEFI shell without this behavior. So the de-facto standard of this environment is "don't create". Leaving behind stray 0 byte files would be an unwanted side effect for existing scripts that use this command. > > Further, this doesn't add any corresponding command-line options to , and certainly not without corresponding command-line options like -c to disable this behavior. > > Thanks, > > Tim > > > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Jeff Westfahl > Sent: Monday, May 15, 2017 2:02 PM > To: edk2-devel@lists.01.org > Cc: Ruiyu Ni <ruiyu.ni@intel.com>; Jaben Carsey <jaben.carsey@intel.com> > Subject: [edk2] [PATCH] ShellPkg/Touch: Create file if it doesn't exist > > The UEFI Shell touch command returns an error if a file to be touched doesn't exist. In other command line operating environments, the touch command typically creates a file if it doesn't exist. This patch updates the UEFI Shell touch command to follow this convention. > > Cc: Ruiyu Ni <ruiyu.ni@intel.com> > Cc: Jaben Carsey <jaben.carsey@intel.com> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Jeff Westfahl <jeff.westfahl@ni.com> > --- > ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > diff --git a/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c b/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c > index 639346f..921de5a 100644 > --- a/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c > +++ b/ShellPkg/Library/UefiShellLevel3CommandsLib/Touch.c > @@ -175,11 +175,13 @@ ShellCommandRunTouch ( > UINTN ParamCount; > EFI_SHELL_FILE_INFO *FileList; > EFI_SHELL_FILE_INFO *Node; > + SHELL_FILE_HANDLE FileHandle; > > ProblemParam = NULL; > ShellStatus = SHELL_SUCCESS; > ParamCount = 0; > FileList = NULL; > + FileHandle = NULL; > > // > // initialize the shell lib (we must be in non-auto-init...) @@ -226,9 +228,17 @@ ShellCommandRunTouch ( > ){ > Status = ShellOpenFileMetaArg((CHAR16*)Param, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, &FileList); > if (EFI_ERROR(Status)) { > - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"touch", (CHAR16*)Param); > - ShellStatus = SHELL_NOT_FOUND; > - break; > + // > + // try to create the file in case it doesn't exist > + // > + gEfiShellProtocol->CreateFile(Param, 0, &FileHandle); > + gEfiShellProtocol->CloseFile(FileHandle); > + Status = ShellOpenFileMetaArg((CHAR16*)Param, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, &FileList); > + if (EFI_ERROR(Status)) { > + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"touch", (CHAR16*)Param); > + ShellStatus = SHELL_NOT_FOUND; > + break; > + } > } > // > // make sure we completed the param parsing sucessfully... > -- > 2.7.4 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel
© 2016 - 2024 Red Hat, Inc.