[vte/vte-0-26] Pass the correct TERM value inside envp when spawning
- From: Tomeu Vizoso <tomeuv src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vte/vte-0-26] Pass the correct TERM value inside envp when spawning
- Date: Fri, 8 Oct 2010 16:26:16 +0000 (UTC)
commit c5d31b87d7a377f5e6fe93fc1efb061f5c7e9db7
Author: Tomeu Vizoso <tomeu vizoso collabora co uk>
Date: Thu Oct 7 12:57:45 2010 +0200
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
src/pty.c | 19 ++++++++-----------
src/vte.c | 32 ++------------------------------
2 files changed, 10 insertions(+), 41 deletions(-)
---
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) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]