The username/password prompts share a lot of logic, so consolidate them into one place. Signed-off-by: Kevin Cernekee <cernekee at gmail.com> --- main.c | 115 ++++++++++++++++++++++++++++++++++++--------------------------- 1 files changed, 66 insertions(+), 49 deletions(-) diff --git a/main.c b/main.c index 6817032..e68ff29 100644 --- a/main.c +++ b/main.c @@ -1012,11 +1012,74 @@ static int validate_peer_cert(void *_vpninfo, OPENCONNECT_X509 *peer_cert, } } +/* Return value: + * < 0, on error + * >=0, otherwise, indicating the length of the response + */ +static int prompt_user(const char *prompt, char *buf, int max_len, int hide_chars) +{ + struct termios t; + char *p; + + fprintf(stderr, "%s", prompt); + fflush(stderr); + + tcgetattr(0, &t); + if (hide_chars) + t.c_lflag &= ~ECHO; + tcsetattr(0, TCSANOW, &t); + + p = fgets(buf, max_len, stdin); + + t.c_lflag |= ECHO; + tcsetattr(0, TCSANOW, &t); + + if (hide_chars) + fprintf(stderr, "\n"); + + if (!p) + return -1; + + p = strchr(buf, '\n'); + if (p) + *p = 0; + + return strlen(buf); +} + +/* Return value: + * < 0, on error + * >=0, otherwise, indicating the length of the response + */ +static int prompt_opt(struct openconnect_info *vpninfo, struct oc_form_opt *opt, + int hide_chars) +{ + int ret; + + if (non_inter) { + vpn_progress(vpninfo, PRG_ERR, + _("User input required in non-interactive mode\n")); + return -1; + } + + opt->value=malloc(80); + if (!opt->value) + return -1; + + ret = prompt_user(opt->label, opt->value, 80, hide_chars); + + if (ret < 0) { + free(opt->value); + opt->value = NULL; + } + + return ret; +} /* Return value: * < 0, on error * = 0, when form was parsed and POST required - * = 1, when response was cancelled by user + * = 1, when response was cancelled by user (allowed but unused) */ static int process_auth_form(void *_vpninfo, struct oc_auth_form *form) @@ -1117,25 +1180,8 @@ static int process_auth_form(void *_vpninfo, opt->value = strdup(vpninfo->username); if (!opt->value) goto err; - } else if (non_inter) { - vpn_progress(vpninfo, PRG_ERR, - _("User input required in non-interactive mode\n")); + } else if (prompt_opt(vpninfo, opt, 0) < 0) goto err; - } else { - opt->value=malloc(80); - if (!opt->value) - goto err; - - fprintf(stderr, "%s", opt->label); - fflush(stderr); - - if (!fgets(opt->value, 80, stdin) || !strlen(opt->value)) - goto err; - - p = strchr(opt->value, '\n'); - if (p) - *p = 0; - } } else if (opt->type == OC_FORM_OPT_PASSWORD) { if (vpninfo->password && @@ -1144,37 +1190,8 @@ static int process_auth_form(void *_vpninfo, vpninfo->password = NULL; if (!opt->value) goto err; - } else if (non_inter) { - vpn_progress(vpninfo, PRG_ERR, - _("User input required in non-interactive mode\n")); + } else if (prompt_opt(vpninfo, opt, 1) < 0) goto err; - } else { - struct termios t; - opt->value=malloc(80); - if (!opt->value) - goto err; - - fprintf(stderr, "%s", opt->label); - fflush(stderr); - - tcgetattr(0, &t); - t.c_lflag &= ~ECHO; - tcsetattr(0, TCSANOW, &t); - - p = fgets(opt->value, 80, stdin); - - t.c_lflag |= ECHO; - tcsetattr(0, TCSANOW, &t); - fprintf(stderr, "\n"); - - if (!p || !strlen(opt->value)) - goto err; - - p = strchr(opt->value, '\n'); - if (p) - *p = 0; - } - } } -- 1.7.5.4