You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.4 KiB
75 lines
1.4 KiB
#include "cache.h" |
|
#include "run-command.h" |
|
#include "strbuf.h" |
|
#include "prompt.h" |
|
#include "compat/terminal.h" |
|
|
|
static char *do_askpass(const char *cmd, const char *prompt) |
|
{ |
|
struct child_process pass = CHILD_PROCESS_INIT; |
|
const char *args[3]; |
|
static struct strbuf buffer = STRBUF_INIT; |
|
int err = 0; |
|
|
|
args[0] = cmd; |
|
args[1] = prompt; |
|
args[2] = NULL; |
|
|
|
pass.argv = args; |
|
pass.out = -1; |
|
|
|
if (start_command(&pass)) |
|
return NULL; |
|
|
|
strbuf_reset(&buffer); |
|
if (strbuf_read(&buffer, pass.out, 20) < 0) |
|
err = 1; |
|
|
|
close(pass.out); |
|
|
|
if (finish_command(&pass)) |
|
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; |
|
} |
|
|
|
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) { |
|
const char *err; |
|
|
|
if (git_env_bool("GIT_TERMINAL_PROMPT", 1)) { |
|
r = git_terminal_prompt(prompt, flags & PROMPT_ECHO); |
|
err = strerror(errno); |
|
} else { |
|
err = "terminal prompts disabled"; |
|
} |
|
if (!r) { |
|
/* prompts already contain ": " at the end */ |
|
die("could not read %s%s", prompt, err); |
|
} |
|
} |
|
return r; |
|
}
|
|
|