@ -123,6 +123,8 @@ struct wet_compositor {
bool init_failed ;
bool init_failed ;
struct wl_list layoutput_list ; /**< wet_layoutput::compositor_link */
struct wl_list layoutput_list ; /**< wet_layoutput::compositor_link */
struct wl_list child_process_list ;
struct wl_list child_process_list ;
pid_t autolaunch_pid ;
bool autolaunch_watch ;
} ;
} ;
static FILE * weston_logfile = NULL ;
static FILE * weston_logfile = NULL ;
@ -360,6 +362,13 @@ sigchld_handler(int signal_number, void *data)
pid_t pid ;
pid_t pid ;
while ( ( pid = waitpid ( - 1 , & status , WNOHANG ) ) > 0 ) {
while ( ( pid = waitpid ( - 1 , & status , WNOHANG ) ) > 0 ) {
if ( wet - > autolaunch_pid ! = - 1 & & wet - > autolaunch_pid = = pid ) {
if ( wet - > autolaunch_watch )
wl_display_terminate ( wet - > compositor - > wl_display ) ;
wet - > autolaunch_pid = - 1 ;
continue ;
}
wl_list_for_each ( p , & wet - > child_process_list , link ) {
wl_list_for_each ( p , & wet - > child_process_list , link ) {
if ( p - > pid = = pid )
if ( p - > pid = = pid )
break ;
break ;
@ -3116,6 +3125,45 @@ wet_load_xwayland(struct weston_compositor *comp)
}
}
# endif
# endif
static int
execute_autolaunch ( struct wet_compositor * wet , struct weston_config * config )
{
int ret = - 1 ;
pid_t tmp_pid = - 1 ;
char * autolaunch_path = NULL ;
struct weston_config_section * section = NULL ;
section = weston_config_get_section ( config , " autolaunch " , NULL , NULL ) ;
weston_config_section_get_string ( section , " path " , & autolaunch_path , " " ) ;
weston_config_section_get_bool ( section , " watch " , & wet - > autolaunch_watch , false ) ;
if ( ! strlen ( autolaunch_path ) )
goto out_ok ;
if ( access ( autolaunch_path , X_OK ) ! = 0 ) {
weston_log ( " Specified autolaunch path (%s) is not executable \n " , autolaunch_path ) ;
goto out ;
}
tmp_pid = fork ( ) ;
if ( tmp_pid = = - 1 ) {
weston_log ( " Failed to fork autolaunch process: %s \n " , strerror ( errno ) ) ;
goto out ;
} else if ( tmp_pid = = 0 ) {
execl ( autolaunch_path , autolaunch_path , NULL ) ;
/* execl shouldn't return */
fprintf ( stderr , " Failed to execute autolaunch: %s \n " , strerror ( errno ) ) ;
_exit ( 1 ) ;
}
out_ok :
ret = 0 ;
out :
wet - > autolaunch_pid = tmp_pid ;
free ( autolaunch_path ) ;
return ret ;
}
static void
static void
weston_log_setup_scopes ( struct weston_log_context * log_ctx ,
weston_log_setup_scopes ( struct weston_log_context * log_ctx ,
struct weston_log_subscriber * subscriber ,
struct weston_log_subscriber * subscriber ,
@ -3449,6 +3497,9 @@ wet_main(int argc, char *argv[], const struct weston_testsuite_data *test_data)
weston_compositor_wake ( wet . compositor ) ;
weston_compositor_wake ( wet . compositor ) ;
if ( execute_autolaunch ( & wet , config ) < 0 )
goto out ;
wl_display_run ( display ) ;
wl_display_run ( display ) ;
/* Allow for setting return exit code after
/* Allow for setting return exit code after