diff options
Diffstat (limited to 'lib/libskey')
-rw-r--r-- | lib/libskey/skey_getpass.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/libskey/skey_getpass.c b/lib/libskey/skey_getpass.c new file mode 100644 index 0000000..1608355 --- /dev/null +++ b/lib/libskey/skey_getpass.c @@ -0,0 +1,40 @@ +#include <unistd.h> +#include <stdio.h> +#include <skey.h> + +/* skey_getpass - read regular or s/key password */ + +char *skey_getpass(prompt, pwd, pwok) +char *prompt; +struct passwd *pwd; +int pwok; +{ + static char buf[128]; + struct skey skey; + char *pass; + char *username = pwd ? pwd->pw_name : "nope"; + int sflag; + + /* Attempt an s/key challenge. */ + sflag = skeychallenge(&skey, username, buf); + if (!sflag) + printf("%s\n", buf); + + if (!pwok) + printf("(s/key required)\n"); + + pass = getpass(prompt); + + /* Give S/Key users a chance to do it with echo on. */ + if (!sflag && !feof(stdin) && *pass == '\0') { + fputs(" (turning echo on)\n", stdout); + fputs(prompt, stdout); + fflush(stdout); + fgets(buf, sizeof(buf), stdin); + rip(buf); + return (buf); + } + + putchar('\n'); + return (pass); +} |