aboutsummaryrefslogtreecommitdiffhomepage
path: root/builtin.c
diff options
context:
space:
mode:
authorGravatar axel <axel@liljencrantz.se>2007-04-23 07:19:47 +1000
committerGravatar axel <axel@liljencrantz.se>2007-04-23 07:19:47 +1000
commit2b7535bb518c909e2a6ce1352df93c5c6bbc084b (patch)
treecfce1fe4a8073a4f855b8f73390d2cda4d8ff740 /builtin.c
parentc5805cfd472dd082a7adc02e02cb87ee5b7d7f81 (diff)
Make the . (source) builtin able to read commands from stdin
darcs-hash:20070422211947-ac50b-b8d33d81fcef5e0b7e76a8d2a9f0bcbcf3ac67b7.gz
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c94
1 files changed, 51 insertions, 43 deletions
diff --git a/builtin.c b/builtin.c
index 2e84e8ed..02360d4e 100644
--- a/builtin.c
+++ b/builtin.c
@@ -2257,36 +2257,42 @@ static int builtin_source( wchar_t ** argv )
argc = builtin_count_args( argv );
- if( argc < 2 )
- {
- sb_printf( sb_err, _( L"%ls: Expected at least one argument, got %d\n" ), argv[0], argc );
- builtin_print_help( argv[0], sb_err );
- return STATUS_BUILTIN_ERROR;
- }
-
- if( wstat(argv[1], &buf) == -1 )
- {
- builtin_wperror( L"stat" );
- return STATUS_BUILTIN_ERROR;
- }
+ wchar_t *fn;
+ const wchar_t *fn_intern;
+
- if( !S_ISREG(buf.st_mode) )
- {
- sb_printf( sb_err, _( L"%ls: '%ls' is not a file\n" ), argv[0], argv[1] );
- builtin_print_help( argv[0], sb_err );
- return STATUS_BUILTIN_ERROR;
- }
- if( ( fd = wopen( argv[1], O_RDONLY ) ) == -1 )
+ if( argc < 2 || (wcscmp( argv[1], L"-" ) == 0) )
{
- builtin_wperror( L"open" );
- res = STATUS_BUILTIN_ERROR;
+ fn = L"-";
+ fn_intern = fn;
+ fd = dup(builtin_stdin);
}
else
{
- wchar_t *fn = wrealpath( argv[1], 0 );
- const wchar_t *fn_intern;
-
+
+ if( wstat(argv[1], &buf) == -1 )
+ {
+ builtin_wperror( L"stat" );
+ return STATUS_BUILTIN_ERROR;
+ }
+
+ if( !S_ISREG(buf.st_mode) )
+ {
+ sb_printf( sb_err, _( L"%ls: '%ls' is not a file\n" ), argv[0], argv[1] );
+ builtin_print_help( argv[0], sb_err );
+
+ return STATUS_BUILTIN_ERROR;
+ }
+
+ if( ( fd = wopen( argv[1], O_RDONLY ) ) == -1 )
+ {
+ builtin_wperror( L"open" );
+ return STATUS_BUILTIN_ERROR;
+ }
+
+ fn = wrealpath( argv[1], 0 );
+
if( !fn )
{
fn_intern = intern( argv[1] );
@@ -2296,33 +2302,35 @@ static int builtin_source( wchar_t ** argv )
fn_intern = intern(fn);
free( fn );
}
+
+ }
- parser_push_block( SOURCE );
- reader_push_current_filename( fn_intern );
+ parser_push_block( SOURCE );
+ reader_push_current_filename( fn_intern );
- current_block->param1.source_dest = fn_intern;
+ current_block->param1.source_dest = fn_intern;
- parse_util_set_argv( argv+2, 0);
+ parse_util_set_argv( (argc>2)?(argv+2):(argv+1), 0);
- res = reader_read( fd );
+ res = reader_read( fd );
- parser_pop_block();
- if( res )
- {
- sb_printf( sb_err,
- _( L"%ls: Error while reading file '%ls'\n" ),
- argv[0],
- argv[1] );
- }
+ parser_pop_block();
- /*
- Do not close fd after calling reader_read. reader_read
- automatically closes it before calling eval.
- */
-
- reader_pop_current_filename();
+ if( res )
+ {
+ sb_printf( sb_err,
+ _( L"%ls: Error while reading file '%ls'\n" ),
+ argv[0],
+ argv[1] );
}
+ /*
+ Do not close fd after calling reader_read. reader_read
+ automatically closes it before calling eval.
+ */
+
+ reader_pop_current_filename();
+
return res;
}