ladishd: set env vars for use in commandlines

This commit is contained in:
Nedko Arnaudov 2010-11-18 02:59:06 +02:00
parent c7d0a6a479
commit 99b1ab0da4
6 changed files with 92 additions and 8 deletions

View File

@ -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,

View File

@ -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
*

View File

@ -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;

View File

@ -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);

View File

@ -2,7 +2,7 @@
/*
* LADI Session Handler (ladish)
*
* Copyright (C) 2009 Nedko Arnaudov <nedko@arnaudov.name>
* Copyright (C) 2009, 2010 Nedko Arnaudov <nedko@arnaudov.name>
*
**************************************************************************
* 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,

View File

@ -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);