diff --git a/daemon/app_supervisor.c b/daemon/app_supervisor.c index db1bacf8..f803efc9 100644 --- a/daemon/app_supervisor.c +++ b/daemon/app_supervisor.c @@ -57,6 +57,7 @@ struct ladish_app_supervisor char * name; char * opath; char * dir; + char * project_name; uint64_t version; uint64_t next_id; struct list_head applist; @@ -99,6 +100,7 @@ ladish_app_supervisor_create( } supervisor_ptr->dir = NULL; + supervisor_ptr->project_name = NULL; supervisor_ptr->version = 0; supervisor_ptr->next_id = 1; @@ -342,11 +344,11 @@ bool ladish_app_supervisor_clear(ladish_app_supervisor_handle supervisor_handle) struct ladish_app * app_ptr; bool lifeless; - if (supervisor_ptr->dir != NULL) - { - free(supervisor_ptr->dir); - supervisor_ptr->dir = NULL; - } + free(supervisor_ptr->dir); + supervisor_ptr->dir = NULL; + + free(supervisor_ptr->project_name); + supervisor_ptr->project_name = NULL; lifeless = true; @@ -403,6 +405,33 @@ ladish_app_supervisor_set_directory( return true; } +bool +ladish_app_supervisor_set_project_name( + ladish_app_supervisor_handle supervisor_handle, + const char * project_name) +{ + char * dup; + + if (project_name != NULL) + { + dup = strdup(project_name); + if (dup == NULL) + { + log_error("strdup(\"%s\") failed", project_name); + return false; + } + + if (supervisor_ptr->project_name != NULL) + { + free(supervisor_ptr->project_name); + } + } + + supervisor_ptr->project_name = dup; + + return true; +} + bool ladish_app_supervisor_child_exit(ladish_app_supervisor_handle supervisor_handle, pid_t pid) { struct list_head * node_ptr; @@ -480,6 +509,7 @@ bool ladish_app_supervisor_start_app(ladish_app_supervisor_handle supervisor_han if (!loader_execute( supervisor_ptr->name, + supervisor_ptr->project_name, app_ptr->name, supervisor_ptr->dir != NULL ? supervisor_ptr->dir : "/", app_ptr->terminal, diff --git a/daemon/app_supervisor.h b/daemon/app_supervisor.h index 27cf5730..1cae5e04 100644 --- a/daemon/app_supervisor.h +++ b/daemon/app_supervisor.h @@ -115,6 +115,7 @@ ladish_app_supervisor_destroy( * Set the directory where apps will be started. If never called, apps will be started in the root directory ("/") * * @param[in] supervisor_handle supervisor object handle + * @param[in] dir directory where apps will be started * * @return success status */ @@ -123,6 +124,19 @@ ladish_app_supervisor_set_directory( ladish_app_supervisor_handle supervisor_handle, const char * dir); +/** + * Set/reset the project name + * + * @param[in] supervisor_handle supervisor object handle + * @param[in] poject_name project name. NULL means that there is no project name. + * + * @return success status + */ +bool +ladish_app_supervisor_set_project_name( + ladish_app_supervisor_handle supervisor_handle, + const char * project_name); + /** * Mark that app has quit * diff --git a/daemon/cmd_load_studio.c b/daemon/cmd_load_studio.c index ec0a079b..6c9f2731 100644 --- a/daemon/cmd_load_studio.c +++ b/daemon/cmd_load_studio.c @@ -944,6 +944,11 @@ static bool run(void * command_context) ladish_recent_store_use_item(g_studios_recent_store, g_studio.name); + if (!ladish_app_supervisor_set_project_name(ladish_studio_get_studio_app_supervisor(), g_studio.name)) + { + ladish_app_supervisor_set_project_name(ladish_studio_get_studio_app_supervisor(), NULL); + } + ladish_studio_announce(); cmd_ptr->command.state = LADISH_COMMAND_STATE_DONE; diff --git a/daemon/loader.c b/daemon/loader.c index cdee3299..ad9b9831 100644 --- a/daemon/loader.c +++ b/daemon/loader.c @@ -49,6 +49,7 @@ struct loader_child char * vgraph_name; char * app_name; + char * project_name; bool dead; pid_t pid; @@ -139,6 +140,7 @@ loader_childs_bury(void) list_del(&child_ptr->siblings); + free(child_ptr->project_name); free(child_ptr->vgraph_name); free(child_ptr->app_name); @@ -262,6 +264,7 @@ loader_exec_program( const char * working_dir, bool run_in_terminal, const char * vgraph_name, + const char * project_name, const char * app_name) { const char * argv[8]; @@ -284,6 +287,14 @@ loader_exec_program( log_error("Could not change directory to working dir '%s' for program '%s': %s", working_dir, argv[0], strerror(errno)); } + setenv("LADISH_APP_NAME", app_name, true); + setenv("LADISH_VGRAPH_NAME", vgraph_name, true); + + if (project_name != NULL) + { + setenv("LADISH_PROJECT_NAME", project_name, true); + } + i = 0; if (run_in_terminal) @@ -475,6 +486,7 @@ loader_run(void) bool loader_execute( const char * vgraph_name, + const char * project_name, const char * app_name, const char * working_dir, bool run_in_terminal, @@ -499,11 +511,25 @@ loader_execute( goto free_struct; } + if (project_name != NULL) + { + child_ptr->project_name = strdup(app_name); + if (child_ptr->project_name == NULL) + { + log_error("strdup() failed to duplicate project name '%s'", project_name); + goto free_vgraph_name; + } + } + else + { + child_ptr->project_name = NULL; + } + child_ptr->app_name = strdup(app_name); if (child_ptr->app_name == NULL) { log_error("strdup() failed to duplicate app name '%s'", app_name); - goto free_vgraph_name; + goto free_project_name; } child_ptr->dead = false; @@ -576,7 +602,7 @@ loader_execute( putenv("LD_PRELOAD=libalsapid.so"); - loader_exec_program(commandline, working_dir, run_in_terminal, vgraph_name, app_name); + loader_exec_program(commandline, working_dir, run_in_terminal, vgraph_name, project_name, app_name); return false; /* We should never get here */ } @@ -601,6 +627,9 @@ loader_execute( return true; +free_project_name: + free(child_ptr->project_name); + free_vgraph_name: free(child_ptr->vgraph_name); diff --git a/daemon/loader.h b/daemon/loader.h index 94fa4db6..6485f948 100644 --- a/daemon/loader.h +++ b/daemon/loader.h @@ -2,7 +2,7 @@ /* * LADI Session Handler (ladish) * - * Copyright (C) 2009 Nedko Arnaudov + * Copyright (C) 2009, 2010 Nedko Arnaudov * ************************************************************************** * This file contains interface to the code that starts programs @@ -31,6 +31,7 @@ void loader_init(void (* on_child_exit)(pid_t pid)); bool loader_execute( + const char * vgraph_name, const char * project_name, const char * app_name, const char * working_dir, diff --git a/daemon/room_load.c b/daemon/room_load.c index 247ec9d2..5de8ea4d 100644 --- a/daemon/room_load.c +++ b/daemon/room_load.c @@ -752,6 +752,11 @@ bool ladish_room_load_project(ladish_room_handle room_handle, const char * proje /* ladish_graph_dump(room_ptr->graph); */ ladish_app_supervisor_set_directory(room_ptr->app_supervisor, project_dir); + if (!ladish_app_supervisor_set_project_name(room_ptr->app_supervisor, room_ptr->project_name)) + { + ladish_app_supervisor_set_project_name(room_ptr->app_supervisor, NULL); + } + ladish_graph_trick_dicts(room_ptr->graph); ladish_try_connect_hidden_connections(room_ptr->graph); ladish_app_supervisor_autorun(room_ptr->app_supervisor);