From c5d31b87d7a377f5e6fe93fc1efb061f5c7e9db7 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Thu, 07 Oct 2010 10:57:45 +0000 Subject: 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 --- diff --git a/src/pty.c b/src/pty.c index e3fb782..11dbe6a 100644 --- a/src/pty.c +++ b/src/pty.c @@ -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 TERM - * 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 */ diff --git a/src/vte.c b/src/vte.c index 5c2c1aa..72aa1a1 100644 --- a/src/vte.c +++ b/src/vte.c @@ -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) { -- cgit v0.8.3.1