]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLib/UefiShellLib.c
ShellPkg: Fix ASCII and UNICODE file pipes.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLib / UefiShellLib.c
index 9e815c56a6c8f7106965c04de1c90397ba465c7f..4b53c7080c306f9e69335f2b4a0c8c63b2aaa060 100644 (file)
@@ -1,6 +1,7 @@
 /** @file\r
   Provides interface to shell functionality for shell commands and applications.\r
 \r
+  Copyright 2016 Dell Inc.\r
   Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -4097,6 +4098,7 @@ ShellFileHandleReturnLine(
 \r
   @retval EFI_SUCCESS           The operation was successful.  The line is stored in\r
                                 Buffer.\r
+  @retval EFI_END_OF_FILE       There are no more lines in the file.\r
   @retval EFI_INVALID_PARAMETER Handle was NULL.\r
   @retval EFI_INVALID_PARAMETER Size was NULL.\r
   @retval EFI_BUFFER_TOO_SMALL  Size was not large enough to store the line.\r
@@ -4142,45 +4144,64 @@ ShellFileHandleReadLine(
     }\r
   }\r
 \r
+  if (*Ascii) {\r
+    CharSize = sizeof(CHAR8);\r
+  } else {\r
+    CharSize = sizeof(CHAR16);\r
+  }\r
   for (CountSoFar = 0;;CountSoFar++){\r
     CharBuffer = 0;\r
-    if (*Ascii) {\r
-      CharSize = sizeof(CHAR8);\r
-    } else {\r
-      CharSize = sizeof(CHAR16);\r
-    }\r
     Status = gEfiShellProtocol->ReadFile(Handle, &CharSize, &CharBuffer);\r
     if (  EFI_ERROR(Status)\r
        || CharSize == 0\r
        || (CharBuffer == L'\n' && !(*Ascii))\r
        || (CharBuffer ==  '\n' && *Ascii)\r
      ){\r
+      if (CharSize == 0) {\r
+        Status = EFI_END_OF_FILE;\r
+      }\r
       break;\r
     }\r
     //\r
     // if we have space save it...\r
     //\r
-    if ((CountSoFar+1)*sizeof(CHAR16) < *Size){\r
+    if ((CountSoFar + 1) * CharSize < *Size){\r
       ASSERT(Buffer != NULL);\r
-      ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;\r
-      ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;\r
+      if (*Ascii) {\r
+        ((CHAR8*)Buffer)[CountSoFar] = (CHAR8) CharBuffer;\r
+        ((CHAR8*)Buffer)[CountSoFar+1] = '\0';\r
+      }\r
+      else {\r
+        ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;\r
+        ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;\r
+      }\r
     }\r
   }\r
 \r
   //\r
   // if we ran out of space tell when...\r
   //\r
-  if ((CountSoFar+1)*sizeof(CHAR16) > *Size){\r
-    *Size = (CountSoFar+1)*sizeof(CHAR16);\r
-    if (!Truncate) {\r
-      gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);\r
-    } else {\r
-      DEBUG((DEBUG_WARN, "The line was truncated in ShellFileHandleReadLine"));\r
+  if (Status != EFI_END_OF_FILE){\r
+    if ((CountSoFar + 1) * CharSize > *Size){\r
+      *Size = (CountSoFar + 1) * CharSize;\r
+      if (!Truncate) {\r
+        gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);\r
+      } else {\r
+        DEBUG((DEBUG_WARN, "The line was truncated in ShellFileHandleReadLine"));\r
+      }\r
+      return (EFI_BUFFER_TOO_SMALL);\r
+    }\r
+\r
+    if (*Ascii) {\r
+      if (CountSoFar && ((CHAR8*)Buffer)[CountSoFar - 1] == '\r') {\r
+        ((CHAR8*)Buffer)[CountSoFar - 1] = '\0';\r
+      }\r
+    }\r
+    else {\r
+      if (CountSoFar && Buffer[CountSoFar - 1] == L'\r') {\r
+        Buffer[CountSoFar - 1] = CHAR_NULL;\r
+      }\r
     }\r
-    return (EFI_BUFFER_TOO_SMALL);\r
-  }\r
-  while(Buffer[StrLen(Buffer)-1] == L'\r') {\r
-    Buffer[StrLen(Buffer)-1] = CHAR_NULL;\r
   }\r
 \r
   return (Status);\r