From e4a128e677658aa9bb111b800dda392fcad88a27 Mon Sep 17 00:00:00 2001 From: Keith Winstein Date: Sun, 15 Jan 2012 18:25:27 -0500 Subject: [PATCH] Allow stm-server to start named processes instead of just the shell --- stm-server.cpp | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/stm-server.cpp b/stm-server.cpp index e2a21d3..2cc8cca 100644 --- a/stm-server.cpp +++ b/stm-server.cpp @@ -24,7 +24,7 @@ void serve( int host_fd ); using namespace std; -int main( void ) +int main( int argc, char *argv[] ) { int master; struct termios child_termios; @@ -80,20 +80,36 @@ int main( void ) } /* get shell name */ - struct passwd *pw = getpwuid( geteuid() ); - if ( pw == NULL ) { - perror( "getpwuid" ); - exit( 1 ); - } + if ( argc <= 1 ) { + 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 ( execve( pw->pw_shell, my_argv, environ ) < 0 ) { - perror( "execve" ); - exit( 1 ); + char *my_argv[ 2 ]; + my_argv[ 0 ] = strdup( pw->pw_shell ); + assert( my_argv[ 0 ] ); + my_argv[ 1 ] = NULL; + + if ( execve( pw->pw_shell, my_argv, environ ) < 0 ) { + perror( "execve" ); + exit( 1 ); + } + } else { + char **my_argv = (char **)malloc( (argc - 1) * sizeof( char * ) ); + assert( my_argv ); + + for ( int i = 0; i < argc - 1; i++ ) { + my_argv[ i ] = strdup( argv[ i + 1 ] ); + assert( my_argv[ i ] ); + my_argv[ argc - 1 ] = NULL; + } + + if ( execve( my_argv[ 0 ], my_argv, environ ) < 0 ) { + perror( "execve" ); + exit( 1 ); + } } exit( 0 ); } else {