Pass the correct TERM value inside envp when spawning
authorTomeu Vizoso <tomeu.vizoso@collabora.co.uk>
Thu, 7 Oct 2010 10:57:45 +0000 (12:57 +0200)
committerTomeu Vizoso <tomeu.vizoso@collabora.co.uk>
Fri, 8 Oct 2010 07:18:03 +0000 (09:18 +0200)
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
src/vte.c

index e3fb782..11dbe6a 100644 (file)
--- 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
  */
index 1412478..0a21d9f 100644 (file)
--- 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) {