]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
merge from trunk
authorMichael Terry <michael.terry@canonical.com>
Tue, 30 Aug 2011 13:48:03 +0000 (09:48 -0400)
committerMichael Terry <michael.terry@canonical.com>
Tue, 30 Aug 2011 13:48:03 +0000 (09:48 -0400)
1  2 
src/seat.c

diff --cc src/seat.c
index 4800f513ddc18c20ce3630a11284488257f16bff,b4271fe32abcf3ef61dd47d53cb32d084d9f0800..02507b788478b36d0abbd6bbd95e94c62d4a4796
@@@ -231,32 -232,135 +232,154 @@@ display_get_guest_username_cb (Display 
      return g_strdup (seat->priv->guest_username);
  }
  
+ static gboolean
+ run_script (Display *display, const gchar *script_name, User *user)
+ {
+     GPtrArray *env_array;
+     gchar **argv, **envp;
+     gchar *env, *command;
+     gint exit_status;
+     DisplayServer *display_server;
+     GError *error = NULL;
+     if (getuid () != 0)
+         return TRUE;
+     if (!(g_file_test (script_name, G_FILE_TEST_IS_REGULAR) &&
+           g_file_test (script_name, G_FILE_TEST_IS_EXECUTABLE)))
+     {
+         g_warning ("Could not execute %s", script_name);
+         return FALSE;
+     }
+     if (!g_shell_parse_argv (script_name, NULL, &argv, &error)) {
+         g_warning ("Could not parse %s: %s", script_name, error->message);
+         g_error_free (error);
+         return FALSE;
+     }
+     env_array = g_ptr_array_sized_new (10);
+     if (!env_array)
+         return FALSE;
+     g_ptr_array_add (env_array, g_strdup ("SHELL=/bin/sh"));
+     g_ptr_array_add (env_array, g_strdup ("PATH=/usr/local/bin:/usr/bin:/bin"));
+     if (user)
+     {
+         g_ptr_array_add (env_array, g_strdup_printf ("USER=%s", user_get_name (user)));
+         g_ptr_array_add (env_array, g_strdup_printf ("USERNAME=%s", user_get_name (user)));
+         g_ptr_array_add (env_array, g_strdup_printf ("LOGNAME=%s", user_get_name (user)));
+         g_ptr_array_add (env_array, g_strdup_printf ("HOME=%s", user_get_home_directory (user)));
+     }
+     else
+     {
+         g_ptr_array_add (env_array, g_strdup ("HOME=/"));
+     }
+     display_server = display_get_display_server (display);
+     // FIXME: This should be done in a different layer
+     if (IS_XSERVER (display_server))
+     {
+         XServer *xserver = XSERVER (display_server);
+         gchar *hostname, *xauthority_path;
+         g_ptr_array_add (env_array, g_strdup_printf ("DISPLAY=%s", xserver_get_address (xserver)));
+         if (!IS_XSERVER_LOCAL (xserver) &&
+             (hostname = xserver_get_hostname (xserver)))
+         {
+             g_ptr_array_add (env_array, g_strdup_printf ("REMOTE_HOST=%s", hostname));
+             g_free (hostname);
+         }
+         if (IS_XSERVER_LOCAL (xserver) &&
+             (xauthority_path = xserver_local_get_authority_file_path (XSERVER_LOCAL (xserver))))
+         {
+             g_ptr_array_add (env_array, g_strdup_printf ("XAUTHORITY=%s", xauthority_path));
+             g_free (xauthority_path);
+         }
+     }
+     g_ptr_array_add (env_array, NULL);
+     envp = (gchar **) g_ptr_array_free (env_array, FALSE);
+     env = g_strjoinv (" ", envp);
+     command = g_strjoin (" ", env, script_name, NULL);
+     g_debug ("Executing script: %s", command);
+     g_free (env);
+     g_free (command);
+     if (!g_spawn_sync (NULL,
+                        argv,
+                        envp,
+                        G_SPAWN_SEARCH_PATH,
+                        NULL,
+                        NULL,
+                        NULL,
+                        NULL,
+                        &exit_status,
+                        &error))
+     {
+         g_warning ("Error executing %s: %s", script_name, error->message);
+         g_error_free (error);
+     }
+     g_strfreev (argv);
+     g_strfreev (envp);
+     if (WIFEXITED (exit_status)) {
+         g_debug ("Exit status of %s: %d", script_name, WEXITSTATUS (exit_status));
+         return WEXITSTATUS (exit_status) == EXIT_SUCCESS;
+     }
+     return FALSE;
+ }
 +static void
 +emit_upstart_signal (const gchar *signal)
 +{
 +    g_return_if_fail (signal != NULL);
 +    g_return_if_fail (signal[0] != 0);
 +
 +    gchar *cmd = g_strdup_printf ("/sbin/initctl -q emit %s DISPLAY_MANAGER=lightdm", signal);
 +    g_spawn_command_line_async (cmd, NULL); /* OK if it fails, probably not installed */
 +    g_free (cmd);
 +}
 +
  static void
  display_ready_cb (Display *display, Seat *seat)
  {
+     const gchar *script;
+     /* Run setup script */
+     script = seat_get_string_property (seat, "display-setup-script");
+     if (script)
+         run_script (display, script, NULL);
      /* Switch to this new display */
      SEAT_GET_CLASS (seat)->set_active_display (seat, display);
 +
 +    emit_upstart_signal ("login-session-start");
  }
  
+ static void
+ display_session_created_cb (Display *display, Seat *seat)
+ {
+     Session *session;
+     const gchar *script;
+     session = display_get_session (display);
+     script = seat_get_string_property (seat, "session-setup-script");
+     if (script)
+         run_script (display, script, session_get_user (session));
+ }
 +static void
 +display_session_started_cb (Display *display, Seat *seat)
 +{
 +    emit_upstart_signal ("desktop-session-start");
 +}
 +
  static void
  display_session_stopped_cb (Display *display, Seat *seat)
  {
@@@ -344,7 -455,7 +474,8 @@@ switch_to_user_or_start_greeter (Seat *
      g_signal_connect (new_display, "switch-to-guest", G_CALLBACK (display_switch_to_guest_cb), seat);
      g_signal_connect (new_display, "get-guest-username", G_CALLBACK (display_get_guest_username_cb), seat);
      g_signal_connect (new_display, "ready", G_CALLBACK (display_ready_cb), seat);
+     g_signal_connect (new_display, "session-created", G_CALLBACK (display_session_created_cb), seat);
 +    g_signal_connect (new_display, "session-started", G_CALLBACK (display_session_started_cb), seat);
      g_signal_connect (new_display, "session-stopped", G_CALLBACK (display_session_stopped_cb), seat);
      g_signal_connect (new_display, "stopped", G_CALLBACK (display_stopped_cb), seat);
      display_set_greeter_session (new_display, seat_get_string_property (seat, "greeter-session"));