Make sure that io redirections are respected by the '.' builtin. This was not the case earlier, which caused various bugs, especially after eval was made into a function that internally used '.'

darcs-hash:20070425183002-ac50b-d7d93e3b74e7274fe3e0aad98e95dd608bb903ae.gz
This commit is contained in:
axel 2007-04-26 04:30:02 +10:00
parent 784c5d9fa3
commit d0585befb3
6 changed files with 23 additions and 13 deletions

View file

@ -137,6 +137,13 @@ static int builtin_stdin;
*/ */
static hash_table_t *desc=0; static hash_table_t *desc=0;
/**
The underyion IO redirections behind the current builtin. This
should normally not be used - sb_out and friends are already
configured to handle everything.
*/
static io_data_t *real_io;
/** /**
Counts the number of non null pointers in the specified array Counts the number of non null pointers in the specified array
*/ */
@ -2292,7 +2299,7 @@ static int builtin_source( wchar_t ** argv )
parse_util_set_argv( (argc>2)?(argv+2):(argv+1), 0); parse_util_set_argv( (argc>2)?(argv+2):(argv+1), 0);
res = reader_read( fd ); res = reader_read( fd, real_io );
parser_pop_block(); parser_pop_block();
@ -2877,7 +2884,7 @@ static int builtin_breakpoint( wchar_t **argv )
{ {
parser_push_block( BREAKPOINT ); parser_push_block( BREAKPOINT );
reader_read( 0 ); reader_read( 0, real_io );
parser_pop_block(); parser_pop_block();
@ -3262,10 +3269,11 @@ static int internal_help( wchar_t *cmd )
} }
int builtin_run( wchar_t **argv ) int builtin_run( wchar_t **argv, io_data_t *io )
{ {
int (*cmd)(wchar_t **argv)=0; int (*cmd)(wchar_t **argv)=0;
real_io = io;
CHECK( argv, STATUS_BUILTIN_ERROR ); CHECK( argv, STATUS_BUILTIN_ERROR );
CHECK( argv[0], STATUS_BUILTIN_ERROR ); CHECK( argv[0], STATUS_BUILTIN_ERROR );

View file

@ -8,6 +8,7 @@
#include <wchar.h> #include <wchar.h>
#include "util.h" #include "util.h"
#include "io.h"
enum enum
{ {
@ -131,7 +132,7 @@ int builtin_exists( wchar_t *cmd );
\return the exit status of the builtin command \return the exit status of the builtin command
*/ */
int builtin_run( wchar_t **argv ); int builtin_run( wchar_t **argv, io_data_t *io );
/** /**
Insert all builtin names into l. These are not copies of the strings and should not be freed after use. Insert all builtin names into l. These are not copies of the strings and should not be freed after use.

2
exec.c
View file

@ -1158,7 +1158,7 @@ void exec( job_t *j )
signal_unblock(); signal_unblock();
p->status = builtin_run( p->argv ); p->status = builtin_run( p->argv, j->io );
builtin_out_redirect=old_out; builtin_out_redirect=old_out;
builtin_err_redirect=old_err; builtin_err_redirect=old_err;

4
main.c
View file

@ -332,7 +332,7 @@ int main( int argc, char **argv )
{ {
if( my_optind == argc ) if( my_optind == argc )
{ {
res = reader_read( 0 ); res = reader_read( 0, 0 );
} }
else else
{ {
@ -374,7 +374,7 @@ int main( int argc, char **argv )
free( rel_filename ); free( rel_filename );
free( abs_filename ); free( abs_filename );
res = reader_read( fd ); res = reader_read( fd, 0 );
if( res ) if( res )
{ {

View file

@ -2933,7 +2933,7 @@ wchar_t *reader_readline()
the prompt, using syntax highlighting. This is used for reading the prompt, using syntax highlighting. This is used for reading
scripts and init files. scripts and init files.
*/ */
static int read_ni( int fd ) static int read_ni( int fd, io_data_t *io )
{ {
FILE *in_stream; FILE *in_stream;
wchar_t *buff=0; wchar_t *buff=0;
@ -2996,7 +2996,7 @@ static int read_ni( int fd )
if( !parser_test( str, 0, &sb, L"fish" ) ) if( !parser_test( str, 0, &sb, L"fish" ) )
{ {
eval( str, 0, TOP ); eval( str, io, TOP );
} }
else else
{ {
@ -3035,7 +3035,7 @@ static int read_ni( int fd )
return res; return res;
} }
int reader_read( int fd ) int reader_read( int fd, io_data_t *io )
{ {
int res; int res;
@ -3047,7 +3047,7 @@ int reader_read( int fd )
proc_push_interactive( ((fd == 0) && isatty(STDIN_FILENO))); proc_push_interactive( ((fd == 0) && isatty(STDIN_FILENO)));
res= is_interactive?read_i():read_ni( fd ); res= is_interactive?read_i():read_ni( fd, io );
/* /*
If the exit command was called in a script, only exit the If the exit command was called in a script, only exit the

View file

@ -12,11 +12,12 @@
#include <wchar.h> #include <wchar.h>
#include "util.h" #include "util.h"
#include "io.h"
/** /**
Read commands from \c fd until encountering EOF Read commands from \c fd until encountering EOF
*/ */
int reader_read( int fd); int reader_read( int fd, io_data_t *io);
/** /**
Tell the shell that it should exit after the currently running command finishes. Tell the shell that it should exit after the currently running command finishes.