char *getpass(const char *Prompt) { BOOLEAN Ascii; CHAR16 *ReturnString; Ascii = FALSE; Print(L"%a", Prompt); ReturnString = ShellFileHandleReturnLine (gEfiShellParametersProtocol->StdIn, &Ascii); if (ReturnString == NULL) { return (NULL); } ReturnStringAscii = AllocateZeroPool((StrLen(ReturnString)+1)*sizeof(CHAR8)); if (ReturnStringAscii == NULL) { return (NULL); } UnicodeStrToAsciiStr(ReturnString, ReturnStringAscii); FreePool(ReturnString); return (ReturnStringAscii); }
/** Do the actual parsing of the file. the file should be SFO output from a shell command or a similar format. @param[in] FileName The filename to open. @param[in] TableName The name of the table to find. @param[in] ColumnIndex The column number to get. @param[in] TableNameInstance Which instance of the table to get (row). @param[in] ShellCommandInstance Which instance of the command to get. @retval SHELL_NOT_FOUND The requested instance was not found. @retval SHELL_SUCCESS The operation was successful. **/ SHELL_STATUS EFIAPI PerformParsing( IN CONST CHAR16 *FileName, IN CONST CHAR16 *TableName, IN CONST UINTN ColumnIndex, IN CONST UINTN TableNameInstance, IN CONST UINTN ShellCommandInstance ) { SHELL_FILE_HANDLE FileHandle; EFI_STATUS Status; BOOLEAN Ascii; UINTN LoopVariable; UINTN ColumnLoop; CHAR16 *TempLine; CHAR16 *ColumnPointer; SHELL_STATUS ShellStatus; CHAR16 *TempSpot; ASSERT(FileName != NULL); ASSERT(TableName != NULL); ShellStatus = SHELL_SUCCESS; Status = ShellOpenFileByName(FileName, &FileHandle, EFI_FILE_MODE_READ, 0); if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, FileName); ShellStatus = SHELL_NOT_FOUND; } else if (!EFI_ERROR (FileHandleIsDirectory (FileHandle))) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NOT_FILE), gShellLevel2HiiHandle, FileName); ShellStatus = SHELL_NOT_FOUND; } else { for (LoopVariable = 0 ; LoopVariable < ShellCommandInstance && !ShellFileHandleEof(FileHandle);) { TempLine = ShellFileHandleReturnLine(FileHandle, &Ascii); if (TempLine == NULL) { break; } // // Search for "ShellCommand," in the file to start the SFO table // for a given ShellCommand. The UEFI Shell spec does not specify // a space after the comma. // if (StrStr (TempLine, L"ShellCommand,") == TempLine) { LoopVariable++; } SHELL_FREE_NON_NULL(TempLine); } if (LoopVariable == ShellCommandInstance) { LoopVariable = 0; while(1) { TempLine = ShellFileHandleReturnLine(FileHandle, &Ascii); if (TempLine == NULL || *TempLine == CHAR_NULL || StrStr (TempLine, L"ShellCommand,") == TempLine) { SHELL_FREE_NON_NULL(TempLine); break; } if (StrStr (TempLine, TableName) == TempLine) { LoopVariable++; if (LoopVariable == TableNameInstance || (TableNameInstance == (UINTN)-1)) { for (ColumnLoop = 1, ColumnPointer = TempLine; ColumnLoop < ColumnIndex && ColumnPointer != NULL && *ColumnPointer != CHAR_NULL; ColumnLoop++) { ColumnPointer = StrStr (ColumnPointer, L",\""); if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL){ ColumnPointer++; } } if (ColumnLoop == ColumnIndex) { if (ColumnPointer == NULL) { ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"Column Index"); ShellStatus = SHELL_INVALID_PARAMETER; } else { TempSpot = StrStr (ColumnPointer, L",\""); if (TempSpot != NULL) { *TempSpot = CHAR_NULL; } while (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[0] == L' '){ ColumnPointer++; } if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[0] == L'\"'){ ColumnPointer++; } if (ColumnPointer != NULL && *ColumnPointer != CHAR_NULL && ColumnPointer[StrLen (ColumnPointer) - 1] == L'\"'){ ColumnPointer[StrLen (ColumnPointer) - 1] = CHAR_NULL; } ShellPrintEx (-1, -1, L"%s\r\n", ColumnPointer); } } } } SHELL_FREE_NON_NULL(TempLine); } } } return (ShellStatus); }