@ -611,6 +611,8 @@ static void usage(int status)
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				           "                          from the booster. The score is reset to 0 normally. \n " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				           "   -T, --test-mode        Invoker test mode. Also control file in root home should be in place. \n " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				           "   -F, --desktop-file     Desktop file of the application to notify lipstick of launching app. \n " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				           "   -I, --id               Sandboxing id to check if sandboxing should be forced. \n " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				           "                          If this is not defined, it's guessed from binary name. \n " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				           "   -h, --help             Print this help. \n " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				           "   -v, --verbose          Make invoker more verbose. Can be given several times. \n " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				           " \n " 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -772,6 +774,7 @@ typedef struct InvokeArgs {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    unsigned  int   respawn_delay ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    bool           test_mode ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    const  char    * desktop_file ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    char          * sandboxing_id ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    unsigned  int   exit_delay ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				}  InvokeArgs ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -786,6 +789,7 @@ typedef struct InvokeArgs {
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    . respawn_delay  =  RESPAWN_DELAY , \
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    . test_mode      =  false , \
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    . desktop_file   =  NULL , \
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    . sandboxing_id  =  NULL , \
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    . exit_delay     =  EXIT_DELAY , \
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -963,6 +967,7 @@ int main(int argc, char *argv[])
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        { " splash " ,            required_argument ,  NULL ,  ' S ' } ,  // Legacy, ignored
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        { " splash-landscape " ,  required_argument ,  NULL ,  ' L ' } ,  // Legacy, ignored
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        { " desktop-file " ,      required_argument ,  NULL ,  ' F ' } , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        { " id " ,                required_argument ,  NULL ,  ' I ' } , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        { " verbose " ,           no_argument ,        NULL ,  ' v ' } , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        { 0 ,  0 ,  0 ,  0 } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } ; 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -971,7 +976,7 @@ int main(int argc, char *argv[])
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // The use of + for POSIXLY_CORRECT behavior is a GNU extension, but avoids polluting
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // the environment
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    int  opt ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    while  ( ( opt  =  getopt_long ( argc ,  argv ,  " +hvcwnGDsoTd:t:a:Ar:S:L:F: " ,  longopts ,  NULL ) )  ! =  - 1 ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    while  ( ( opt  =  getopt_long ( argc ,  argv ,  " +hvcwnGDsoTd:t:a:Ar:S:L:F: I: " ,  longopts ,  NULL ) )  ! =  - 1 ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        switch ( opt ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        { 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -1043,6 +1048,10 @@ int main(int argc, char *argv[])
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            args . desktop_file  =  optarg ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            break ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        case  ' I ' : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            args . sandboxing_id  =  strdup ( optarg ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            break ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        case  ' ? ' : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            usage ( 1 ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        } 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -1115,25 +1124,36 @@ int main(int argc, char *argv[])
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        exit ( EXIT_FAILURE ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // If sailjail is already used or app specific booster is used, skip checking for sandboxing
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( ! strcmp ( args . prog_name ,  SAILJAIL_PATH )  | |  strcmp ( args . app_name ,  UNDEFINED_APPLICATION ) )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . sandboxing_id  =  NULL ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    }  else  if  ( ! args . sandboxing_id )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        // When id is not defined, assume it can be derived from binary path
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        char  * path  =  strdup ( args . prog_name ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . sandboxing_id  =  strdup ( basename ( path ) ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        free ( path ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Application specific boosters are running in sandbox and can
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // thus launch only sandboxed processes, otherwise
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // If arguments don't define sailjail and sailjaild says the app must be sandboxed,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // we force sandboxing here
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( ! strcmp ( args . app_name ,  UNDEFINED_APPLICATION )  & & 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        strcmp ( args . prog_name ,  SAILJAIL_PATH )  & & 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        ask_for_sandboxing ( args . prog_name ) )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( args . sandboxing_id  & &  ask_for_sandboxing ( args . sandboxing_id ) )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        warning ( " enforcing sandboxing for '%s' " ,  args . prog_name ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        // We must use generic booster here as nothing else would work
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        // to run sailjail which is not compiled for launching via booster
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . app_type  =  BOOSTER_GENERIC ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        // Prepend sailjail
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        char  * * old_argv  =  args . prog_argv ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . prog_argc  + =  2 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . prog_argc  + =  4 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . prog_argv  =  ( char  * * ) calloc ( args . prog_argc  +  1 ,  sizeof  * args . prog_argv ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . prog_argv [ 0 ]  =  SAILJAIL_PATH ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . prog_argv [ 1 ]  =  " -- " ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        for  ( int  i  =  2 ;  i  <  args . prog_argc  +  1 ;  + + i ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            args . prog_argv [ i ]  =  old_argv [ i - 2 ] ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . prog_argv [ 1 ]  =  " -p " ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . prog_argv [ 2 ]  =  args . sandboxing_id , 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            args . sandboxing_id  =  NULL ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . prog_argv [ 3 ]  =  " -- " ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        for  ( int  i  =  4 ;  i  <  args . prog_argc  +  1 ;  + + i ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            args . prog_argv [ i ]  =  old_argv [ i - 4 ] ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        // Don't free old_argv because it's probably not dynamically allocated
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        free ( args . prog_name ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        args . prog_name  =  strdup ( SAILJAIL_PATH ) ;