diff --git a/common.h b/common.h index 5b56da736..f5603d418 100644 --- a/common.h +++ b/common.h @@ -98,7 +98,7 @@ extern wchar_t *program_name; char c; \ show_stackframe(); \ read( 0, &c, 1 ); \ - exit(1 ); \ + exit( 1 ); \ } \ @@ -140,15 +140,15 @@ extern wchar_t *program_name; */ #define N_(wstr) wstr - +/* + Print a stack trace to stderr +*/ void show_stackframe(); /** Take an array_list_t containing wide strings and converts them to a single null-terminated wchar_t **. The array is allocated using - halloc, and uses the \c context parameter as context. If \c context - is not noll, all elements of the \c array_list_t are also - registered to \c context using \c halloc_register(). + malloc, and needs to be fred's by the caller. */ wchar_t **list_to_char_arr( array_list_t *l ); diff --git a/doc_src/commandline.txt b/doc_src/commandline.txt index 7a38e7e4c..6fc7dea93 100644 --- a/doc_src/commandline.txt +++ b/doc_src/commandline.txt @@ -20,7 +20,7 @@ The following switches change what the commandline builtin does will cause any additional arguments to be interpreted as readline functions, and these functions will be injected into the reader, so that they will be returned to the reader before any additional - actual keypresses are read. + actual key presses are read. The following switches change the way \c commandline updates the diff --git a/env.c b/env.c index 5d5175c97..8472f596b 100644 --- a/env.c +++ b/env.c @@ -202,7 +202,9 @@ static void clear_hash_entry( void *key, void *data ) { var_entry_t *entry = (var_entry_t *)data; if( entry->export ) + { has_changed = 1; + } free( (void *)key ); free( (void *)data ); @@ -257,8 +259,12 @@ static int is_locale( const wchar_t *key ) { int i; for( i=0; locale_variable[i]; i++ ) + { if( wcscmp(locale_variable[i], key ) == 0 ) + { return 1; + } + } return 0; } @@ -303,8 +309,11 @@ static void handle_locale() for( i=2; locale_variable[i]; i++ ) { const wchar_t *val = env_get( locale_variable[i] ); + if( val ) + { wsetlocale( cat[i], val ); + } } } @@ -318,8 +327,10 @@ static void handle_locale() strings should be reloaded. We do both and hope for the best. */ + extern int _nl_msg_cat_cntr; - ++_nl_msg_cat_cntr; + _nl_msg_cat_cntr++; + dcgettext( "fish", "Changing language to English", LC_MESSAGES ); if( is_interactive ) @@ -343,17 +354,24 @@ static void universal_callback( int type, wchar_t *str=0; if( is_locale( name ) ) + { handle_locale(); + } switch( type ) { case SET: case SET_EXPORT: + { str=L"SET"; break; + } + case ERASE: + { str=L"ERASE"; break; + } } if( str ) @@ -404,19 +422,27 @@ static void setup_path() al_init( &l ); if( path ) + { tokenize_variable_array( path, &l ); + } for( j=0; path_el[j]; j++ ) { + int has_el=0; for( i=0; i 0) && (el[len-1]==L'/') ) + { len--; - if( (wcslen( path_el[j] ) == len) && (wcsncmp( el, path_el[j], len)==0) ) + } + + if( (wcslen( path_el[j] ) == len) && + (wcsncmp( el, path_el[j], len)==0) ) { has_el = 1; } @@ -456,6 +482,7 @@ static void setup_path() static void env_set_defaults() { + if( !env_get( L"USER" ) ) { struct passwd *pw = getpwuid( getuid()); @@ -463,6 +490,7 @@ static void env_set_defaults() env_set( L"USER", unam, ENV_GLOBAL ); free( unam ); } + if( !env_get( L"HOME" ) ) { wchar_t *unam = env_get( L"USER" ); @@ -473,6 +501,7 @@ static void env_set_defaults() free( dir ); free( unam_narrow ); } + } void env_init() @@ -541,13 +570,17 @@ void env_init() key = str2wcs(*p); if( !key ) + { continue; + } val = wcschr( key, L'=' ); if( val == 0 ) + { env_set( key, L"", ENV_EXPORT ); + } else { *val = L'\0'; @@ -557,7 +590,9 @@ void env_init() while( *pos ) { if( *pos == L':' ) + { *pos = ARRAY_SEP; + } pos++; } @@ -609,8 +644,10 @@ void env_destroy() b_destroy( &export_buffer ); while( &top->env != global ) + { env_pop(); - + } + hash_destroy( &env_read_only ); hash_destroy( &env_electric ); @@ -624,8 +661,8 @@ void env_destroy() } /** - Find the scope hashtable containing the variable with the specified - key + Search all visible scopes in order for the specified key. Return + the first scope in which it was found. */ static env_node_t *env_get_node( const wchar_t *key ) { @@ -643,9 +680,13 @@ static env_node_t *env_get_node( const wchar_t *key ) } if( env->new_scope ) + { env = global_env; + } else + { env = env->next; + } } return 0; @@ -693,13 +734,15 @@ int env_set( const wchar_t *key, } } /* - Do not actually create a umask variable, on env_get, it will be calculated dynamically + Do not actually create a umask variable, on env_get, it will + be calculated dynamically */ return 0; } /* - Zero element arrays are internaly not coded as null but as this placeholder string + Zero element arrays are internaly not coded as null but as this + placeholder string */ if( !val ) { @@ -716,7 +759,9 @@ int env_set( const wchar_t *key, env_universal_get_export( key ); } else + { export = (var_mode & ENV_EXPORT ); + } env_universal_set( key, val, export ); is_universal = 1; @@ -732,15 +777,15 @@ int env_set( const wchar_t *key, key ); if( e->export ) + { has_changed_new = 1; - + } } if( (var_mode & ENV_LOCAL) || (var_mode & ENV_GLOBAL) ) { node = ( var_mode & ENV_GLOBAL )?global_env:top; - } else { @@ -770,8 +815,10 @@ int env_set( const wchar_t *key, env_universal_get_export( key ); } else + { export = (var_mode & ENV_EXPORT ); - + } + env_universal_set( key, val, export ); is_universal = 1; @@ -788,8 +835,9 @@ int env_set( const wchar_t *key, */ node = top; while( node->next && !node->new_scope ) + { node = node->next; - + } } } } @@ -806,13 +854,15 @@ int env_set( const wchar_t *key, Try to reuse previous key string */ if( !k ) + { k = wcsdup(key); - + } + old_entry = (var_entry_t *)v; if( old_entry && old_entry->size >= val_len ) { entry = old_entry; - + if( !!(var_mode & ENV_EXPORT) || entry->export ) { entry->export = !!(var_mode & ENV_EXPORT); @@ -827,8 +877,10 @@ int env_set( const wchar_t *key, sizeof(wchar_t )*(val_len+1)); if( !entry ) + { DIE_MEM(); - + } + entry->size = val_len; if( var_mode & ENV_EXPORT) @@ -848,8 +900,10 @@ int env_set( const wchar_t *key, } if( free_val ) + { free((void *)val); - + } + has_changed = has_changed_old || has_changed_new; } @@ -895,8 +949,10 @@ static int try_remove( env_node_t *n, wchar_t *old_key, *old_val; if( n == 0 ) + { return 0; - + } + hash_remove( &n->env, key, &old_key_void, @@ -919,12 +975,18 @@ static int try_remove( env_node_t *n, } if( var_mode & ENV_LOCAL ) + { return 0; + } if( n->new_scope ) + { return try_remove( global_env, key, var_mode ); + } else + { return try_remove( n->next, key, var_mode ); + } } @@ -1018,7 +1080,10 @@ wchar_t *env_get( const wchar_t *key ) } if( i!=0) + { sb_append( &dyn_var, ARRAY_SEP_STR ); + } + sb_append( &dyn_var, next ); } @@ -1060,13 +1125,19 @@ wchar_t *env_get( const wchar_t *key ) return 0; } else + { return res->val; + } } if( env->new_scope ) + { env = global_env; + } else + { env = env->next; + } } if( !proc_had_barrier) { @@ -1081,7 +1152,9 @@ wchar_t *env_get( const wchar_t *key ) return 0; } else + { return item; + } } int env_exist( const wchar_t *key, int mode ) @@ -1118,12 +1191,18 @@ int env_exist( const wchar_t *key, int mode ) } if( mode & ENV_LOCAL ) + { break; + } if( env->new_scope ) + { env = global_env; + } else + { env = env->next; + } } } diff --git a/exec.c b/exec.c index f36d3394d..f99cf6790 100644 --- a/exec.c +++ b/exec.c @@ -272,12 +272,15 @@ static int handle_child_io( io_data_t *io, int exit_on_error ) switch( io->io_mode ) { case IO_CLOSE: + { if( close(io->fd) ) { debug( 0, _(L"Failed to close file descriptor %d"), io->fd ); wperror( L"close" ); } break; + } + case IO_FILE: { if( (tmp=wopen( io->param1.filename, @@ -827,9 +830,13 @@ void exec( job_t *j ) if( block_io ) { if( j->io ) + { j->io = io_add( io_duplicate( j, block_io), j->io ); + } else + { j->io=io_duplicate( j, block_io); + } } @@ -868,7 +875,7 @@ void exec( job_t *j ) if( !setup_child_process( j, 0 ) ) { /* - launch_process never returns + launch_process _never_ returns */ launch_process( j->first_process ); } @@ -1195,8 +1202,10 @@ void exec( job_t *j ) } if( exec_error ) + { break; - + } + switch( p->type ) { @@ -1331,7 +1340,7 @@ void exec( job_t *j ) ( !p->next ); /* - If the output of a builtin is to be sent to aninternal + If the output of a builtin is to be sent to an internal buffer, there is no need to fork. This helps out the performance quite a bit in complex completion code. */ @@ -1360,7 +1369,6 @@ void exec( job_t *j ) proc_set_last_status( job_get_flag( j, JOB_NEGATE )?(!p->status):p->status ); } break; - } /* @@ -1376,7 +1384,6 @@ void exec( job_t *j ) print correct output to stdout and stderr, and then exit. */ - p->pid = getpid(); setup_child_process( j, p ); do_builtin_io( sb_out->used ? (wchar_t *)sb_out->buff : 0, sb_err->used ? (wchar_t *)sb_err->buff : 0 ); diff --git a/signal.c b/signal.c index 3109e3ee0..40e23f79a 100644 --- a/signal.c +++ b/signal.c @@ -568,6 +568,7 @@ void signal_set_handlers() exit(1); } +#ifdef SIGWINCH act.sa_flags = SA_SIGINFO; act.sa_sigaction= &handle_winch; if( sigaction( SIGWINCH, &act, 0 ) ) @@ -575,6 +576,7 @@ void signal_set_handlers() wperror( L"sigaction" ); exit(1); } +#endif act.sa_flags = SA_SIGINFO; act.sa_sigaction= &handle_hup;