<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>