<html>
<head>
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
On 27/11/16 17:07, Michael Van Canneyt wrote:<br>
<blockquote
cite="mid:alpine.DEB.2.10.1611271806480.6561@home.telenet.be"
type="cite">
<div class="moz-text-flowed" style="font-family: -moz-fixed;
font-size: 10px;" lang="x-western">If you mean in a
cross-platform way, I think we would welcome patches <span
class="moz-smiley-s1" title=":)"><span>:)</span></span>
<br>
<br>
Michael.<br>
</div>
</blockquote>
<br>
Today, I also came up against the problem of how to read a password
from the console without echo. With a bit of googling and code
bashing, I have created the following cross-platform code from a
"getpassword" function.<br>
<br>
uses ...<br>
{$IFDEF WINDOWS} ,Windows {$ENDIF}<br>
{$IFDEF UNIX} ,TermIO, IOStream {$ENDIF} <br>
;<br>
<br>
...<br>
{$IFDEF UNIX}<br>
function getpassword: string;<br>
var oldattr, newattr: termios;<br>
stdinStream: TIOStream;<br>
c: char;<br>
begin<br>
Result := '';<br>
stdinStream := TIOStream.Create(iosInput);<br>
try<br>
TCGetAttr(stdinStream.Handle, oldattr);<br>
newattr := oldattr;<br>
newattr.c_lflag := newattr.c_lflag and not (ICANON or ECHO);<br>
tcsetattr( stdinStream.Handle, TCSANOW, newattr );<br>
try<br>
repeat<br>
read(c);<br>
if c = #10 then break;<br>
write('*');<br>
Result += c;<br>
until false;<br>
writeln;<br>
finally<br>
tcsetattr( stdinStream.Handle, TCSANOW, oldattr );<br>
end;<br>
finally<br>
stdinStream.Free;<br>
end;<br>
end;<br>
{$ENDIF}<br>
{$IFDEF WINDOWS}<br>
function getpassword: string;<br>
var oldmode, newmode: DWORD;<br>
c: char;<br>
begin<br>
Result := '';<br>
GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), oldmode);<br>
newmode := oldmode - ENABLE_ECHO_INPUT - ENABLE_LINE_INPUT;<br>
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),newmode);<br>
try<br>
repeat<br>
read(c);<br>
if c = #13 then break;<br>
write('*');<br>
Result += c;<br>
until false;<br>
writeln;<br>
finally<br>
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),oldmode);<br>
end<br>
end;<br>
{$ENDIF}<br>
<br>
Seems to work for me.<br>
<br>
Tony<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>