Disable local echo display with input passwords in linux
Patch from Debian

Index: CPP/7zip/UI/Console/UserInputUtils.cpp
--- CPP/7zip/UI/Console/UserInputUtils.cpp.orig
+++ CPP/7zip/UI/Console/UserInputUtils.cpp
@@ -57,9 +57,18 @@ NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStr
 #ifdef _WIN32
 #ifndef UNDER_CE
 #define MY_DISABLE_ECHO
+#define MY_DISABLE_ECHO_WIN32
 #endif
 #endif
 
+#ifdef __OpenBSD__
+#include <stdio.h>
+#include <termios.h>
+#include <unistd.h>
+#define MY_DISABLE_ECHO
+#define MY_DISABLE_ECHO_UNIX
+#endif
+
 static bool GetPassword(CStdOutStream *outStream, UString &psw)
 {
   if (outStream)
@@ -72,7 +81,7 @@ static bool GetPassword(CStdOutStream *outStream, UStr
     outStream->Flush();
   }
 
-  #ifdef MY_DISABLE_ECHO
+  #ifdef MY_DISABLE_ECHO_WIN32
   
   const HANDLE console = GetStdHandle(STD_INPUT_HANDLE);
 
@@ -90,7 +99,29 @@ static bool GetPassword(CStdOutStream *outStream, UStr
   const bool res = g_StdIn.ScanUStringUntilNewLine(psw);
   if (wasChanged)
     SetConsoleMode(console, mode);
-  
+
+  #elif defined(MY_DISABLE_ECHO_UNIX)
+
+  int ifd = fileno(stdin);
+  bool wasChanged = false;
+  struct termios old_mode = {};
+  struct termios new_mode = {};
+
+  if (tcgetattr(ifd, &old_mode) == 0) {
+    new_mode = old_mode;
+    new_mode.c_lflag &= ~ECHO;
+
+    wasChanged = true;
+
+    tcsetattr(ifd, TCSAFLUSH, &new_mode);
+  }
+
+  bool res = g_StdIn.ScanUStringUntilNewLine(psw);
+
+  if (wasChanged) {
+    tcsetattr(ifd, TCSAFLUSH, &old_mode);
+  }
+    
   #else
   
   const bool res = g_StdIn.ScanUStringUntilNewLine(psw);
