Browse Source
This is currently in connect.c, but really has nothing to do with the git protocol itself. Let's make a new source file all about prompting the user, which will make it cleaner to refactor. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint


7 changed files with 58 additions and 45 deletions
@ -0,0 +1,48 @@ |
|||||||
|
#include "cache.h" |
||||||
|
#include "run-command.h" |
||||||
|
#include "strbuf.h" |
||||||
|
#include "prompt.h" |
||||||
|
|
||||||
|
char *git_getpass(const char *prompt) |
||||||
|
{ |
||||||
|
const char *askpass; |
||||||
|
struct child_process pass; |
||||||
|
const char *args[3]; |
||||||
|
static struct strbuf buffer = STRBUF_INIT; |
||||||
|
|
||||||
|
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[1] = prompt; |
||||||
|
args[2] = NULL; |
||||||
|
|
||||||
|
memset(&pass, 0, sizeof(pass)); |
||||||
|
pass.argv = args; |
||||||
|
pass.out = -1; |
||||||
|
|
||||||
|
if (start_command(&pass)) |
||||||
|
exit(1); |
||||||
|
|
||||||
|
strbuf_reset(&buffer); |
||||||
|
if (strbuf_read(&buffer, pass.out, 20) < 0) |
||||||
|
die("failed to read password from %s\n", askpass); |
||||||
|
|
||||||
|
close(pass.out); |
||||||
|
|
||||||
|
if (finish_command(&pass)) |
||||||
|
exit(1); |
||||||
|
|
||||||
|
strbuf_setlen(&buffer, strcspn(buffer.buf, "\r\n")); |
||||||
|
|
||||||
|
return buffer.buf; |
||||||
|
} |
Loading…
Reference in new issue