Commit e5fd6c3c authored by Tomeu Vizoso's avatar Tomeu Vizoso

Pass the correct TERM value inside envp when spawning

So the codepaths that end up invoking execve still have the correct
TERM entry. Clarify the effect of vte_pty_set_term().

https://bugzilla.gnome.org/show_bug.cgi?id=631589
parent 89336f82
......@@ -394,7 +394,7 @@ __vte_pty_get_argv (const char *command,
* Returns: a newly allocated string array. Free using g_strfreev()
*/
static gchar **
__vte_pty_merge_environ (char **envp)
__vte_pty_merge_environ (char **envp, const char *term_value)
{
GHashTable *table;
GHashTableIter iter;
......@@ -425,6 +425,9 @@ __vte_pty_merge_environ (char **envp)
}
}
if (term_value != NULL)
g_hash_table_replace (table, g_strdup ("TERM"), g_strdup (term_value));
array = g_ptr_array_sized_new (g_hash_table_size (table) + 1);
g_hash_table_iter_init(&iter, table);
while (g_hash_table_iter_next(&iter, (gpointer) &name, (gpointer) &value)) {
......@@ -518,7 +521,7 @@ __vte_pty_spawn (VtePty *pty,
spawn_flags &= ~G_SPAWN_LEAVE_DESCRIPTORS_OPEN;
/* add the given environment to the childs */
envp2 = __vte_pty_merge_environ (envv);
envp2 = __vte_pty_merge_environ (envv, pty->priv->term);
_VTE_DEBUG_IF (VTE_DEBUG_MISC) {
g_printerr ("Spawing command:\n");
......@@ -1679,8 +1682,8 @@ vte_pty_class_init (VtePtyClass *klass)
/**
* VtePty:term:
*
* The value to set for the TERM environment variable
* in vte_pty_child_setup().
* The value to set for the TERM environment variable just after
* forking.
*
* Since: 0.26
*/
......@@ -1816,13 +1819,7 @@ vte_pty_get_fd (VtePty *pty)
* @pty: a #VtePty
* @emulation: (allow-none): the name of a terminal description, or %NULL
*
* Sets what value of the TERM environment variable to set
* when using vte_pty_child_setup().
*
* Note: When using fork() and execve(), or the g_spawn_async() family of
* functions with vte_pty_child_setup(),
* and the environment passed to them contains the <literal>TERM</literal>
* environment variable, that value will override the one set here.
* Sets what value of the TERM environment variable to set just after forking.
*
* Since: 0.26
*/
......
......@@ -3518,32 +3518,6 @@ _vte_terminal_get_argv (const char *command,
return argv2;
}
/*
* _vte_terminal_filter_envv:
* @envv: the environment vector
*
* Filters out the TERM variable from @envv.
*
* Returns: (transfer container): the filtered environment vector
*/
static char **
_vte_terminal_filter_envv (char **envv)
{
GPtrArray *array;
int i;
if (envv == NULL)
return NULL;
array = g_ptr_array_sized_new (g_strv_length (envv));
for (i = 0; envv[i]; ++i)
if (!g_str_has_prefix (envv[i], "TERM="))
g_ptr_array_add (array, envv[i]);
g_ptr_array_add (array, NULL);
return (char **) g_ptr_array_free (array, FALSE);
}
/**
* vte_terminal_fork_command:
* @terminal: a #VteTerminal
......@@ -3580,7 +3554,7 @@ vte_terminal_fork_command(VteTerminal *terminal,
gboolean utmp,
gboolean wtmp)
{
char **real_argv, **real_envv;
char **real_argv;
GSpawnFlags spawn_flags;
GPid child_pid;
gboolean ret;
......@@ -3596,19 +3570,17 @@ vte_terminal_fork_command(VteTerminal *terminal,
spawn_flags = G_SPAWN_CHILD_INHERITS_STDIN |
G_SPAWN_SEARCH_PATH;
real_argv = _vte_terminal_get_argv (command, argv, &spawn_flags);
real_envv = _vte_terminal_filter_envv (envv);
ret = vte_terminal_fork_command_full(terminal,
__vte_pty_get_pty_flags(lastlog, utmp, wtmp),
working_directory,
real_argv,
real_envv,
envv,
spawn_flags,
NULL, NULL,
&child_pid,
err);
g_strfreev (real_argv);
g_free (real_envv);
#ifdef VTE_DEBUG
if (error) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment