Edit.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /** @file
  2. Main file for Edit shell Debug1 function.
  3. (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
  4. Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #include "UefiShellDebug1CommandsLib.h"
  8. #include "TextEditor.h"
  9. /**
  10. Function for 'edit' command.
  11. @param[in] ImageHandle Handle to the Image (NULL if Internal).
  12. @param[in] SystemTable Pointer to the System Table (NULL if Internal).
  13. **/
  14. SHELL_STATUS
  15. EFIAPI
  16. ShellCommandRunEdit (
  17. IN EFI_HANDLE ImageHandle,
  18. IN EFI_SYSTEM_TABLE *SystemTable
  19. )
  20. {
  21. EFI_STATUS Status;
  22. CHAR16 *Buffer;
  23. CHAR16 *ProblemParam;
  24. SHELL_STATUS ShellStatus;
  25. LIST_ENTRY *Package;
  26. CONST CHAR16 *Cwd;
  27. CHAR16 *Nfs;
  28. CHAR16 *Spot;
  29. CONST CHAR16 *TempParam;
  30. // SHELL_FILE_HANDLE TempHandle;
  31. Buffer = NULL;
  32. ShellStatus = SHELL_SUCCESS;
  33. Nfs = NULL;
  34. //
  35. // initialize the shell lib (we must be in non-auto-init...)
  36. //
  37. Status = ShellInitialize ();
  38. ASSERT_EFI_ERROR (Status);
  39. Status = CommandInit ();
  40. ASSERT_EFI_ERROR (Status);
  41. //
  42. // parse the command line
  43. //
  44. Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);
  45. if (EFI_ERROR (Status)) {
  46. if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {
  47. ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"edit", ProblemParam);
  48. FreePool (ProblemParam);
  49. ShellStatus = SHELL_INVALID_PARAMETER;
  50. } else {
  51. ASSERT (FALSE);
  52. }
  53. } else {
  54. if (ShellCommandLineGetCount (Package) > 2) {
  55. ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"edit");
  56. ShellStatus = SHELL_INVALID_PARAMETER;
  57. } else {
  58. Cwd = gEfiShellProtocol->GetCurDir (NULL);
  59. if (Cwd == NULL) {
  60. Cwd = ShellGetEnvironmentVariable (L"path");
  61. if (Cwd != NULL) {
  62. Nfs = StrnCatGrow (&Nfs, NULL, Cwd+3, 0);
  63. if (Nfs != NULL) {
  64. Spot = StrStr (Nfs, L";");
  65. if (Spot != NULL) {
  66. *Spot = CHAR_NULL;
  67. }
  68. Spot = StrStr (Nfs, L"\\");
  69. if (Spot != NULL) {
  70. Spot[1] = CHAR_NULL;
  71. }
  72. gEfiShellProtocol->SetCurDir (NULL, Nfs);
  73. FreePool (Nfs);
  74. }
  75. }
  76. }
  77. Status = MainEditorInit ();
  78. if (EFI_ERROR (Status)) {
  79. gST->ConOut->ClearScreen (gST->ConOut);
  80. gST->ConOut->EnableCursor (gST->ConOut, TRUE);
  81. ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_MAIN_INIT_FAILED), gShellDebug1HiiHandle);
  82. } else {
  83. MainEditorBackup ();
  84. //
  85. // if editor launched with file named
  86. //
  87. if (ShellCommandLineGetCount (Package) == 2) {
  88. TempParam = ShellCommandLineGetRawValue (Package, 1);
  89. ASSERT (TempParam != NULL);
  90. FileBufferSetFileName (TempParam);
  91. // if (EFI_ERROR(ShellFileExists(MainEditor.FileBuffer->FileName))) {
  92. // Status = ShellOpenFileByName(MainEditor.FileBuffer->FileName, &TempHandle, EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 0);
  93. // if (!EFI_ERROR(Status)) {
  94. // ShellCloseFile(&TempHandle);
  95. // }
  96. // }
  97. }
  98. Status = FileBufferRead (MainEditor.FileBuffer->FileName, FALSE);
  99. if (!EFI_ERROR (Status)) {
  100. MainEditorRefresh ();
  101. Status = MainEditorKeyInput ();
  102. }
  103. if (Status != EFI_OUT_OF_RESOURCES) {
  104. //
  105. // back up the status string
  106. //
  107. Buffer = CatSPrint (NULL, L"%s", StatusBarGetString ());
  108. }
  109. MainEditorCleanup ();
  110. //
  111. // print editor exit code on screen
  112. //
  113. if (Status == EFI_SUCCESS) {
  114. } else if (Status == EFI_OUT_OF_RESOURCES) {
  115. ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"edit");
  116. } else {
  117. if (Buffer != NULL) {
  118. if (StrCmp (Buffer, L"") != 0) {
  119. //
  120. // print out the status string
  121. //
  122. ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_MAIN_BUFFER), gShellDebug1HiiHandle, Buffer);
  123. } else {
  124. ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_MAIN_UNKNOWN_EDITOR_ERR), gShellDebug1HiiHandle);
  125. }
  126. } else {
  127. ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_EDIT_MAIN_UNKNOWN_EDITOR_ERR), gShellDebug1HiiHandle);
  128. }
  129. }
  130. if (Status != EFI_OUT_OF_RESOURCES) {
  131. SHELL_FREE_NON_NULL (Buffer);
  132. }
  133. }
  134. }
  135. ShellCommandLineFreeVarList (Package);
  136. }
  137. return ShellStatus;
  138. }