mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-23 02:03:41 +08:00
Make sure read returns with a non-zero status if no string was actually given
darcs-hash:20070115175346-ac50b-9bbcfd114344f030c46456d2d603ce323406bfea.gz
This commit is contained in:
parent
cb7caf2afc
commit
6467ead9ad
16
builtin.c
16
builtin.c
|
@ -1507,7 +1507,7 @@ static int builtin_read( wchar_t **argv )
|
||||||
wchar_t *nxt;
|
wchar_t *nxt;
|
||||||
wchar_t *prompt = DEFAULT_READ_PROMPT;
|
wchar_t *prompt = DEFAULT_READ_PROMPT;
|
||||||
wchar_t *commandline = L"";
|
wchar_t *commandline = L"";
|
||||||
int exit_res=0;
|
int exit_res=STATUS_BUILTIN_OK;
|
||||||
wchar_t *mode_name = READ_MODE_NAME;
|
wchar_t *mode_name = READ_MODE_NAME;
|
||||||
|
|
||||||
woptind=0;
|
woptind=0;
|
||||||
|
@ -1684,11 +1684,21 @@ static int builtin_read( wchar_t **argv )
|
||||||
*/
|
*/
|
||||||
if( isatty(0) && builtin_stdin == 0 )
|
if( isatty(0) && builtin_stdin == 0 )
|
||||||
{
|
{
|
||||||
|
wchar_t *line;
|
||||||
|
|
||||||
reader_push( mode_name );
|
reader_push( mode_name );
|
||||||
reader_set_prompt( prompt );
|
reader_set_prompt( prompt );
|
||||||
|
|
||||||
reader_set_buffer( commandline, wcslen( commandline ) );
|
reader_set_buffer( commandline, wcslen( commandline ) );
|
||||||
buff = wcsdup(reader_readline( ));
|
line = reader_readline( );
|
||||||
|
if( line )
|
||||||
|
{
|
||||||
|
buff = wcsdup( line );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exit_res = STATUS_BUILTIN_ERROR;
|
||||||
|
}
|
||||||
reader_pop();
|
reader_pop();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1756,7 +1766,7 @@ static int builtin_read( wchar_t **argv )
|
||||||
sb_destroy( &sb );
|
sb_destroy( &sb );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( i != argc )
|
if( i != argc && !exit_res )
|
||||||
{
|
{
|
||||||
|
|
||||||
wchar_t *state;
|
wchar_t *state;
|
||||||
|
|
22
reader.c
22
reader.c
|
@ -135,8 +135,8 @@ commence.
|
||||||
|
|
||||||
/**
|
/**
|
||||||
A struct describing the state of the interactive reader. These
|
A struct describing the state of the interactive reader. These
|
||||||
states can be stacked, in case reader_readline is called from
|
states can be stacked, in case reader_readline() calls are
|
||||||
input_read().
|
nested. This happens when the 'read' builtin is used.
|
||||||
*/
|
*/
|
||||||
typedef struct reader_data
|
typedef struct reader_data
|
||||||
{
|
{
|
||||||
|
@ -1950,16 +1950,24 @@ static int read_i()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for( j = first_job; j; j=j->next )
|
if( !isatty(0) )
|
||||||
{
|
{
|
||||||
if( ! job_is_completed( j ) )
|
/*
|
||||||
|
We already know that stdin is a tty since we're
|
||||||
|
in interactive mode. If isatty returns false, it
|
||||||
|
means stdin must have been closed.
|
||||||
|
*/
|
||||||
|
for( j = first_job; j; j=j->next )
|
||||||
{
|
{
|
||||||
job_signal( j, SIGHUP );
|
if( ! job_is_completed( j ) )
|
||||||
|
{
|
||||||
|
job_signal( j, SIGHUP );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if( tmp )
|
||||||
{
|
{
|
||||||
tmp = wcsdup( tmp );
|
tmp = wcsdup( tmp );
|
||||||
|
|
||||||
|
@ -2644,7 +2652,7 @@ wchar_t *reader_readline()
|
||||||
set_color( FISH_COLOR_RESET, FISH_COLOR_RESET );
|
set_color( FISH_COLOR_RESET, FISH_COLOR_RESET );
|
||||||
}
|
}
|
||||||
|
|
||||||
return data->buff;
|
return finished ? data->buff : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue
Block a user