From: YOKOTA Hiroshi <yokota.hgml@gmail.com>
Date: Tue, 22 Feb 2022 21:02:14 +0900
Subject: Disable local echo display when in input passwords (Closes:
 #1006238)

Forwarded: https://sourceforge.net/p/sevenzip/patches/381/
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1006238
---
 CPP/7zip/UI/Console/UserInputUtils.cpp | 33 ++++++++++++++++++++++++++++++++-
 CPP/Common/StdInStream.h               |  3 +++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/CPP/7zip/UI/Console/UserInputUtils.cpp b/CPP/7zip/UI/Console/UserInputUtils.cpp
index 6c3c85a..2832b00 100644
--- a/CPP/7zip/UI/Console/UserInputUtils.cpp
+++ b/CPP/7zip/UI/Console/UserInputUtils.cpp
@@ -57,9 +57,18 @@ NUserAnswerMode::EEnum ScanUserYesNoAllQuit(CStdOutStream *outStream)
 #ifdef _WIN32
 #ifndef UNDER_CE
 #define MY_DISABLE_ECHO
+#define MY_DISABLE_ECHO_WIN32
 #endif
 #endif
 
+#ifdef unix
+#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, UString &psw)
     outStream->Flush();
   }
 
-  #ifdef MY_DISABLE_ECHO
+  #ifdef MY_DISABLE_ECHO_WIN32
   
   const HANDLE console = GetStdHandle(STD_INPUT_HANDLE);
 
@@ -91,6 +100,28 @@ static bool GetPassword(CStdOutStream *outStream, UString &psw)
   if (wasChanged)
     SetConsoleMode(console, mode);
   
+  #elif defined(MY_DISABLE_ECHO_UNIX)
+
+  const int ifd = fileno(&(*g_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;
+
+    tcsetattr(ifd, TCSAFLUSH, &new_mode);
+
+    wasChanged = true;
+  }
+
+  const bool res = g_StdIn.ScanUStringUntilNewLine(psw);
+
+  if (wasChanged) {
+    tcsetattr(ifd, TCSAFLUSH, &old_mode);
+  }
+
   #else
   
   const bool res = g_StdIn.ScanUStringUntilNewLine(psw);
diff --git a/CPP/Common/StdInStream.h b/CPP/Common/StdInStream.h
index 2253c43..69d84fe 100644
--- a/CPP/Common/StdInStream.h
+++ b/CPP/Common/StdInStream.h
@@ -23,7 +23,10 @@ public:
 
   /*
   ~CStdInStream() { Close(); }
+  */
 
+  operator FILE *() { return _stream; }
+  /*
   bool Open(LPCTSTR fileName) throw();
   bool Close() throw();
   */
