提交 b589977b 编写于 作者: R Richard Levitte

Do not loop i the OpenSSL UI method any more. Instead, letthe

application do that.

NOTE: there's no requirement for other UI_METHODs to avoid this kind
of loop.  For example, a GUI UI_METHOD would probably check the
lengths of the answers from within instead of being constantly
redisplayed for everything that is wrong.
上级 291e4a6e
......@@ -280,7 +280,7 @@ static void popsig(void);
#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN16)
static int noecho_fgets(char *buf, int size, FILE *tty);
#endif
static int read_string_inner(UI *ui, UI_STRING *uis, int echo);
static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl);
static int read_string(UI *ui, UI_STRING *uis);
static int write_string(UI *ui, UI_STRING *uis);
......@@ -313,13 +313,13 @@ static int write_string(UI *ui, UI_STRING *uis)
{
switch (UI_get_string_type(uis))
{
case UIT_VERIFY:
case UIT_PROMPT:
break;
default:
case UIT_ERROR:
case UIT_INFO:
fputs(UI_get0_output_string(uis), tty_out);
fflush(tty_out);
break;
default:
break;
}
return 1;
}
......@@ -330,17 +330,23 @@ static int read_string(UI *ui, UI_STRING *uis)
switch (UI_get_string_type(uis))
{
case UIT_BOOLEAN:
fputs(UI_get0_output_string(uis), tty_out);
fputs(UI_get0_action_string(uis), tty_out);
fflush(tty_out);
return read_string_inner(ui, uis,
UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO, 0);
case UIT_PROMPT:
fputs(UI_get0_output_string(uis), tty_out);
fflush(tty_out);
return read_string_inner(ui, uis,
UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO);
UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO, 1);
case UIT_VERIFY:
fprintf(tty_out,"Verifying - %s",
UI_get0_output_string(uis));
fflush(tty_out);
if ((ok = read_string_inner(ui, uis,
UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO)) <= 0)
UI_get_input_flags(uis) & UI_INPUT_FLAG_ECHO, 1)) <= 0)
return ok;
if (strcmp(UI_get0_result_string(uis),
UI_get0_test_string(uis)) != 0)
......@@ -368,12 +374,13 @@ static void read_till_nl(FILE *in)
} while (strchr(buf,'\n') == NULL);
}
static int read_string_inner(UI *ui, UI_STRING *uis, int echo)
static int read_string_inner(UI *ui, UI_STRING *uis, int echo, int strip_nl)
{
static int ps;
int ok;
char *result = OPENSSL_malloc(BUFSIZ);
char result[BUFSIZ];
int maxsize = BUFSIZ-1;
char *p;
#ifndef OPENSSL_SYS_WIN16
if ((ok = setjmp(save)))
......@@ -390,28 +397,26 @@ static int read_string_inner(UI *ui, UI_STRING *uis, int echo)
if (!echo) noecho_console(ui);
ps=2;
while (!ok)
{
char *p;
result[0]='\0';
result[0]='\0';
#ifdef OPENSSL_SYS_MSDOS
if (!echo)
noecho_fgets(result,maxsize,tty_in);
else
fgets(result,maxsize,tty_in);
#else
if (!echo)
noecho_fgets(result,maxsize,tty_in);
else
fgets(result,maxsize,tty_in);
#else
fgets(result,maxsize,tty_in);
#endif
if (feof(tty_in)) goto error;
if (ferror(tty_in)) goto error;
if ((p=(char *)strchr(result,'\n')) != NULL)
if (feof(tty_in)) goto error;
if (ferror(tty_in)) goto error;
if ((p=(char *)strchr(result,'\n')) != NULL)
{
if (strip_nl)
*p='\0';
else
read_till_nl(tty_in);
if (UI_set_result(uis, result) >= 0)
ok=1;
}
else
read_till_nl(tty_in);
if (UI_set_result(ui, uis, result) >= 0)
ok=1;
error:
if (!echo) fprintf(tty_out,"\n");
......@@ -421,11 +426,10 @@ error:
if (ps >= 1)
popsig();
#else
memset(result,0,BUFSIZ);
ok=1;
#endif
OPENSSL_free(result);
memset(result,0,BUFSIZ);
return ok;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册