summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
0e0442b)
Warn user the password will be echoed just in case. This allows
getpass to be used with input piped to it (e.g. from the hcoop members
portal).
fun getpass () =
let
val tty = Posix.FileSys.stdin
fun getpass () =
let
val tty = Posix.FileSys.stdin
- val termios = Posix.TTY.TC.getattr tty
- val fields = Posix.TTY.fieldsOf termios
+ val termios = SOME (Posix.TTY.TC.getattr tty)
+ handle OS.SysErr (reason, SOME syserr) =>
+ if syserr = Posix.Error.notty then
+ (print "Warning: no terminal found, not hiding password\n";
+ TextIO.flushOut TextIO.stdOut;
+ NONE)
+ else raise OS.SysErr (reason, SOME syserr)
+ val fields = case termios of SOME termios => SOME (Posix.TTY.fieldsOf termios)
+ | NONE => NONE
- val termios' = Posix.TTY.termios {iflag = #iflag fields,
- oflag = #oflag fields,
- cflag = #cflag fields,
- lflag = Posix.TTY.L.flags [Posix.TTY.L.clear (Posix.TTY.L.echo, #lflag fields),
- Posix.TTY.L.echonl,
- Posix.TTY.L.icanon],
- cc = #cc fields,
- ispeed = #ispeed fields,
- ospeed = #ospeed fields}
+ val termios' = case fields of SOME fields =>
+ SOME (Posix.TTY.termios {iflag = #iflag fields,
+ oflag = #oflag fields,
+ cflag = #cflag fields,
+ lflag = Posix.TTY.L.flags [Posix.TTY.L.clear (Posix.TTY.L.echo, #lflag fields),
+ Posix.TTY.L.echonl,
+ Posix.TTY.L.icanon],
+ cc = #cc fields,
+ ispeed = #ispeed fields,
+ ospeed = #ospeed fields})
+ | NONE => NONE
- fun reset () = Posix.TTY.TC.setattr (tty, Posix.TTY.TC.sanow, termios)
+ fun reset () = case termios of SOME termios => Posix.TTY.TC.setattr (tty, Posix.TTY.TC.sanow, termios)
+ | NONE => ()
in
print " Password: ";
TextIO.flushOut TextIO.stdOut;
in
print " Password: ";
TextIO.flushOut TextIO.stdOut;
- Posix.TTY.TC.setattr (tty, Posix.TTY.TC.sanow, termios');
+ case termios' of SOME termios' => Posix.TTY.TC.setattr (tty, Posix.TTY.TC.sanow, termios')
+ | NONE => ();
case TextIO.inputLine TextIO.stdIn of
NONE => (reset ();
Aborted)
case TextIO.inputLine TextIO.stdIn of
NONE => (reset ();
Aborted)