From 8a91e7834954b9b19c949794ccedff8988cd8163 Mon Sep 17 00:00:00 2001 From: John Hood Date: Wed, 12 Feb 2014 00:18:43 -0500 Subject: [PATCH] termemu: respect $SHELL and exec argv if given Signed-off-by: John Hood --- src/examples/termemu.cc | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/examples/termemu.cc b/src/examples/termemu.cc index 34b55ba..5deb092 100644 --- a/src/examples/termemu.cc +++ b/src/examples/termemu.cc @@ -72,7 +72,7 @@ const size_t buf_size = 16384; static void emulate_terminal( int fd ); -int main( void ) +int main( int argc, char *argv[] ) { int master; struct termios saved_termios, raw_termios, child_termios; @@ -116,19 +116,26 @@ int main( void ) exit( 1 ); } - /* get shell name */ - struct passwd *pw = getpwuid( geteuid() ); - if ( pw == NULL ) { - perror( "getpwuid" ); - exit( 1 ); - } - char *my_argv[ 2 ]; - my_argv[ 0 ] = strdup( pw->pw_shell ); - assert( my_argv[ 0 ] ); - my_argv[ 1 ] = NULL; - if ( execv( pw->pw_shell, my_argv ) < 0 ) { + if ( argc > 1 ) { + argv++; + } else { + /* get shell name */ + my_argv[ 0 ] = getenv( "SHELL" ); + if ( my_argv[ 0 ] == NULL ) { + struct passwd *pw = getpwuid( geteuid() ); + if ( pw == NULL ) { + perror( "getpwuid" ); + exit( 1 ); + } + my_argv[ 0 ] = strdup( pw->pw_shell ); + } + assert( my_argv[ 0 ] ); + my_argv[ 1 ] = NULL; + argv = my_argv; + } + if ( execvp( argv[ 0 ], argv ) < 0 ) { perror( "execve" ); exit( 1 ); }