X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/21d921a56a850857f6ea883c6dff6a411a659bbf..417edb970ec87cd1e45ea2923fdee4c6cb5d57f4:/src/client.sml diff --git a/src/client.sml b/src/client.sml index 863c0c0..a92b13f 100644 --- a/src/client.sml +++ b/src/client.sml @@ -25,27 +25,41 @@ datatype passwd_result = | Aborted | Error +fun hastty () = + Posix.ProcEnv.isatty 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 orelse syserr = Posix.Error.inval 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; - 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)