Properly prepare the environment when launching child applications
This commit is contained in:
parent
ce7b48dd5d
commit
93dedffe5a
|
@ -51,6 +51,8 @@ static char const _license[] =
|
||||||
# define DATADIR PREFIX "/share"
|
# define DATADIR PREFIX "/share"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern char ** environ;
|
||||||
|
|
||||||
|
|
||||||
/* Simulator */
|
/* Simulator */
|
||||||
/* private */
|
/* private */
|
||||||
|
@ -383,6 +385,8 @@ static void _run_on_choose_response(GtkWidget * widget, gint arg1,
|
||||||
|
|
||||||
static void _simulator_on_file_run(gpointer data)
|
static void _simulator_on_file_run(gpointer data)
|
||||||
{
|
{
|
||||||
|
char const display[] = "DISPLAY=";
|
||||||
|
char const display1[] = "DISPLAY=:1.0"; /* XXX may be wrong */
|
||||||
Simulator * simulator = data;
|
Simulator * simulator = data;
|
||||||
GtkWidget * dialog;
|
GtkWidget * dialog;
|
||||||
GtkWidget * vbox;
|
GtkWidget * vbox;
|
||||||
|
@ -393,7 +397,9 @@ static void _simulator_on_file_run(gpointer data)
|
||||||
char const * command;
|
char const * command;
|
||||||
int res;
|
int res;
|
||||||
char * argv[] = { "/bin/sh", "run", "-c", NULL, NULL };
|
char * argv[] = { "/bin/sh", "run", "-c", NULL, NULL };
|
||||||
char * envp[] = { "DISPLAY=:1.0", NULL };
|
char ** envp = NULL;
|
||||||
|
size_t i;
|
||||||
|
char ** p;
|
||||||
GSpawnFlags flags = G_SPAWN_FILE_AND_ARGV_ZERO | G_SPAWN_SEARCH_PATH;
|
GSpawnFlags flags = G_SPAWN_FILE_AND_ARGV_ZERO | G_SPAWN_SEARCH_PATH;
|
||||||
GError * error = NULL;
|
GError * error = NULL;
|
||||||
|
|
||||||
|
@ -455,15 +461,47 @@ static void _simulator_on_file_run(gpointer data)
|
||||||
gtk_widget_destroy(dialog);
|
gtk_widget_destroy(dialog);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
/* prepare the arguments */
|
||||||
command = gtk_entry_get_text(GTK_ENTRY(entry));
|
command = gtk_entry_get_text(GTK_ENTRY(entry));
|
||||||
if((argv[3] = strdup(command)) == NULL)
|
if((argv[3] = strdup(command)) == NULL)
|
||||||
|
{
|
||||||
simulator_error(simulator, strerror(errno), 1);
|
simulator_error(simulator, strerror(errno), 1);
|
||||||
else if(g_spawn_async(NULL, argv, envp, flags, NULL, NULL, NULL,
|
gtk_widget_destroy(dialog);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* prepare the environment */
|
||||||
|
for(i = 0; environ[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
if((p = realloc(envp, sizeof(*p) * (i + 2))) == NULL)
|
||||||
|
break;
|
||||||
|
envp = p;
|
||||||
|
envp[i + 1] = NULL;
|
||||||
|
if(strncmp(environ[i], display, sizeof(display) - 1) == 0)
|
||||||
|
envp[i] = strdup(display1);
|
||||||
|
else
|
||||||
|
envp[i] = strdup(environ[i]);
|
||||||
|
if(envp[i] == NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(environ[i] != NULL)
|
||||||
|
{
|
||||||
|
for(i = 0; envp[i] != NULL; i++)
|
||||||
|
free(envp[i]);
|
||||||
|
free(envp);
|
||||||
|
free(argv[3]);
|
||||||
|
simulator_error(simulator, strerror(errno), 1);
|
||||||
|
gtk_widget_destroy(dialog);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(g_spawn_async(NULL, argv, envp, flags, NULL, NULL, NULL,
|
||||||
&error) == FALSE)
|
&error) == FALSE)
|
||||||
{
|
{
|
||||||
simulator_error(simulator, error->message, 1);
|
simulator_error(simulator, error->message, 1);
|
||||||
g_error_free(error);
|
g_error_free(error);
|
||||||
}
|
}
|
||||||
|
for(i = 0; envp[i] != NULL; i++)
|
||||||
|
free(envp[i]);
|
||||||
|
free(envp);
|
||||||
free(argv[3]);
|
free(argv[3]);
|
||||||
gtk_widget_destroy(dialog);
|
gtk_widget_destroy(dialog);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user