diff options
Diffstat (limited to 'main/vte/term.patch')
-rw-r--r-- | main/vte/term.patch | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/main/vte/term.patch b/main/vte/term.patch new file mode 100644 index 0000000000..811385d9f5 --- /dev/null +++ b/main/vte/term.patch @@ -0,0 +1,137 @@ +From c5d31b87d7a377f5e6fe93fc1efb061f5c7e9db7 Mon Sep 17 00:00:00 2001 +From: Tomeu Vizoso <tomeu.vizoso@collabora.co.uk> +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 <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 + */ +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 |