X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=prompt.c;h=d851807feb9849813635471d7099e67ed743a2d7;hb=8c80ff362f1f4e586a37fba8e6dc83eee67aa2b5;hp=42a1c9f9fb459c033246d33e8b7f65f0ab5da68f;hpb=d3c58b83aee2007ca76dc5d1242c09b6f7989c76;p=git.git diff --git a/prompt.c b/prompt.c index 42a1c9f9f..d851807fe 100644 --- a/prompt.c +++ b/prompt.c @@ -2,27 +2,16 @@ #include "run-command.h" #include "strbuf.h" #include "prompt.h" +#include "compat/terminal.h" -char *git_getpass(const char *prompt) +static char *do_askpass(const char *cmd, const char *prompt) { - const char *askpass; struct child_process pass; const char *args[3]; static struct strbuf buffer = STRBUF_INIT; + int err = 0; - askpass = getenv("GIT_ASKPASS"); - if (!askpass) - askpass = askpass_program; - if (!askpass) - askpass = getenv("SSH_ASKPASS"); - if (!askpass || !(*askpass)) { - char *result = getpass(prompt); - if (!result) - die_errno("Could not read password"); - return result; - } - - args[0] = askpass; + args[0] = cmd; args[1] = prompt; args[2] = NULL; @@ -31,18 +20,53 @@ char *git_getpass(const char *prompt) pass.out = -1; if (start_command(&pass)) - exit(1); + return NULL; - strbuf_reset(&buffer); if (strbuf_read(&buffer, pass.out, 20) < 0) - die("failed to read password from %s\n", askpass); + err = 1; close(pass.out); if (finish_command(&pass)) - exit(1); + err = 1; + + if (err) { + error("unable to read askpass response from '%s'", cmd); + strbuf_release(&buffer); + return NULL; + } strbuf_setlen(&buffer, strcspn(buffer.buf, "\r\n")); - return buffer.buf; + return strbuf_detach(&buffer, NULL); +} + +char *git_prompt(const char *prompt, int flags) +{ + char *r = NULL; + + if (flags & PROMPT_ASKPASS) { + const char *askpass; + + askpass = getenv("GIT_ASKPASS"); + if (!askpass) + askpass = askpass_program; + if (!askpass) + askpass = getenv("SSH_ASKPASS"); + if (askpass && *askpass) + r = do_askpass(askpass, prompt); + } + + if (!r) + r = git_terminal_prompt(prompt, flags & PROMPT_ECHO); + if (!r) { + /* prompts already contain ": " at the end */ + die("could not read %s%s", prompt, strerror(errno)); + } + return r; +} + +char *git_getpass(const char *prompt) +{ + return git_prompt(prompt, PROMPT_ASKPASS); }