If PATH is unset, use a default value

darcs-hash:20060420183502-ac50b-8e746ae4ed00c354712cf61e57e0a187aa40a4fa.gz
This commit is contained in:
axel 2006-04-21 04:35:02 +10:00
parent c755bd0358
commit f59e4a88c6

182
parser.c
View file

@ -165,7 +165,7 @@ The fish parser. Contains functions for parsing code.
/** /**
Error for wrong token type Error for wrong token type
*/ */
#define UNEXPECTED_TOKEN_ERR_MSG _( L"Unexpected token of type '%ls'") #define UNEXPECTED_TOKEN_ERR_MSG _( L"Unexpected token of type '%ls'")
@ -176,78 +176,78 @@ The fish parser. Contains functions for parsing code.
/** /**
While block description While block description
*/ */
#define WHILE_BLOCK _( L"'while' block" ) #define WHILE_BLOCK _( L"'while' block" )
/** /**
For block description For block description
*/ */
#define FOR_BLOCK _( L"'for' block" ) #define FOR_BLOCK _( L"'for' block" )
/** /**
If block description If block description
*/ */
#define IF_BLOCK _( L"'if' conditional block" ) #define IF_BLOCK _( L"'if' conditional block" )
/** /**
function definition block description Function definition block description
*/ */
#define FUNCTION_DEF_BLOCK _( L"function definition block" ) #define FUNCTION_DEF_BLOCK _( L"function definition block" )
/** /**
Function invocation block description Function invocation block description
*/ */
#define FUNCTION_CALL_BLOCK _( L"function invocation block" ) #define FUNCTION_CALL_BLOCK _( L"function invocation block" )
/** /**
Switch block description Switch block description
*/ */
#define SWITCH_BLOCK _( L"'switch' block" ) #define SWITCH_BLOCK _( L"'switch' block" )
/** /**
Fake block description Fake block description
*/ */
#define FAKE_BLOCK _( L"unexecutable block" ) #define FAKE_BLOCK _( L"unexecutable block" )
/** /**
Top block description Top block description
*/ */
#define TOP_BLOCK _( L"global root block" ) #define TOP_BLOCK _( L"global root block" )
/** /**
Command substitution block description Command substitution block description
*/ */
#define SUBST_BLOCK _( L"command substitution block" ) #define SUBST_BLOCK _( L"command substitution block" )
/** /**
Begin block description Begin block description
*/ */
#define BEGIN_BLOCK _( L"'begin' unconditional block" ) #define BEGIN_BLOCK _( L"'begin' unconditional block" )
/** /**
Source block description Source block description
*/ */
#define SOURCE_BLOCK _( L"Block created by the . builtin" ) #define SOURCE_BLOCK _( L"Block created by the . builtin" )
/** /**
Source block description Source block description
*/ */
#define EVENT_BLOCK _( L"event handler block" ) #define EVENT_BLOCK _( L"event handler block" )
/** /**
Unknown block description Unknown block description
*/ */
#define UNKNOWN_BLOCK _( L"unknown/invalid block" ) #define UNKNOWN_BLOCK _( L"unknown/invalid block" )
@ -724,75 +724,85 @@ wchar_t *get_filename( const wchar_t *cmd )
else else
{ {
path = env_get(L"PATH"); path = env_get(L"PATH");
if( path != 0 ) if( path == 0 )
{ {
/* if( contains_str( PREFIX L"/bin", L"/bin", L"/usr/bin", (void *)0 ) )
Allocate string long enough to hold the whole command
*/
wchar_t *new_cmd = malloc( sizeof(wchar_t)*(wcslen(cmd)+wcslen(path)+2) );
/*
We tokenize a copy of the path, since strtok modifies
its arguments
*/
wchar_t *path_cpy = wcsdup( path );
wchar_t *nxt_path = path;
wchar_t *state;
if( (new_cmd==0) || (path_cpy==0) )
{ {
die_mem(); path = L"/bin" ARRAY_SEP_STR L"/usr/bin";
} }
else
for( nxt_path = wcstok( path_cpy, ARRAY_SEP_STR, &state );
nxt_path != 0;
nxt_path = wcstok( 0, ARRAY_SEP_STR, &state) )
{ {
int path_len = wcslen( nxt_path ); path = L"/bin" ARRAY_SEP_STR L"/usr/bin" ARRAY_SEP_STR PREFIX L"/bin";
wcscpy( new_cmd, nxt_path );
if( new_cmd[path_len-1] != L'/' )
{
new_cmd[path_len++]=L'/';
}
wcscpy( &new_cmd[path_len], cmd );
if( waccess( new_cmd, X_OK )==0 )
{
struct stat buff;
if( wstat( new_cmd, &buff )==-1 )
{
if( errno != EACCES )
{
wperror( L"stat" );
}
continue;
}
if( S_ISREG(buff.st_mode) )
{
free( path_cpy );
return new_cmd;
}
}
else
{
switch( errno )
{
case ENOENT:
case ENAMETOOLONG:
case EACCES:
case ENOTDIR:
break;
default:
{
debug( 1,
MISSING_COMMAND_ERR_MSG,
new_cmd );
wperror( L"access" );
}
}
}
} }
free( path_cpy );
free( new_cmd );
} }
/*
Allocate string long enough to hold the whole command
*/
wchar_t *new_cmd = malloc( sizeof(wchar_t)*(wcslen(cmd)+wcslen(path)+2) );
/*
We tokenize a copy of the path, since strtok modifies
its arguments
*/
wchar_t *path_cpy = wcsdup( path );
wchar_t *nxt_path = path;
wchar_t *state;
if( (new_cmd==0) || (path_cpy==0) )
{
die_mem();
}
for( nxt_path = wcstok( path_cpy, ARRAY_SEP_STR, &state );
nxt_path != 0;
nxt_path = wcstok( 0, ARRAY_SEP_STR, &state) )
{
int path_len = wcslen( nxt_path );
wcscpy( new_cmd, nxt_path );
if( new_cmd[path_len-1] != L'/' )
{
new_cmd[path_len++]=L'/';
}
wcscpy( &new_cmd[path_len], cmd );
if( waccess( new_cmd, X_OK )==0 )
{
struct stat buff;
if( wstat( new_cmd, &buff )==-1 )
{
if( errno != EACCES )
{
wperror( L"stat" );
}
continue;
}
if( S_ISREG(buff.st_mode) )
{
free( path_cpy );
return new_cmd;
}
}
else
{
switch( errno )
{
case ENOENT:
case ENAMETOOLONG:
case EACCES:
case ENOTDIR:
break;
default:
{
debug( 1,
MISSING_COMMAND_ERR_MSG,
new_cmd );
wperror( L"access" );
}
}
}
}
free( path_cpy );
free( new_cmd );
} }
return 0; return 0;
} }
@ -1101,8 +1111,8 @@ int parser_get_lineno()
int lineno; int lineno;
/* static const wchar_t *prev_str = 0; /* static const wchar_t *prev_str = 0;
static int i=0; static int i=0;
static int lineno=1; static int lineno=1;
*/ */
if( !current_tokenizer ) if( !current_tokenizer )
return -1; return -1;
@ -1241,8 +1251,8 @@ wchar_t *parser_current_line()
// debug( 1, L"Current pos %d, line pos %d, file_length %d, is_interactive %d, offset %d\n", current_tokenizer_pos, current_line_pos, wcslen(whole_str), is_interactive, offset); // debug( 1, L"Current pos %d, line pos %d, file_length %d, is_interactive %d, offset %d\n", current_tokenizer_pos, current_line_pos, wcslen(whole_str), is_interactive, offset);
/* /*
Skip printing character position if we are in interactive mode Skip printing character position if we are in interactive mode
and the error was on the first character of the line. and the error was on the first character of the line.
*/ */
if( !is_interactive || is_function() || (current_line_width!=0) ) if( !is_interactive || is_function() || (current_line_width!=0) )
{ {
@ -1716,8 +1726,8 @@ static int parse_job( process_t *p,
else else
{ {
error( SYNTAX_ERROR, error( SYNTAX_ERROR,
tok_get_pos( tok ), tok_get_pos( tok ),
CMD_ERR_MSG, CMD_ERR_MSG,
tok_get_desc( tok_last_type(tok) ) ); tok_get_desc( tok_last_type(tok) ) );
} }
@ -1926,8 +1936,8 @@ static int parse_job( process_t *p,
if( !p->type || (p->type == INTERNAL_EXEC) ) if( !p->type || (p->type == INTERNAL_EXEC) )
{ {
/* /*
If we are not executing the current block, allow If we are not executing the current block, allow
non-existent commands. non-existent commands.
*/ */
if( current_block->skip ) if( current_block->skip )
{ {
@ -2482,7 +2492,7 @@ int eval( const wchar_t *cmd, io_data_t *io, int block_type )
} }
/* /*
Restore previous eval state Restore previous eval state
*/ */
forbidden_function = prev_forbidden; forbidden_function = prev_forbidden;
current_tokenizer=previous_tokenizer; current_tokenizer=previous_tokenizer;