1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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
|