diff options
-rw-r--r-- | src/seat-xlocal.c | 16 | ||||
-rw-r--r-- | src/seat-xremote.c | 13 | ||||
-rw-r--r-- | src/seat-xvnc.c | 25 | ||||
-rw-r--r-- | src/seat.c | 120 | ||||
-rw-r--r-- | src/seat.h | 1 | ||||
-rw-r--r-- | src/xserver-xvnc.c | 9 | ||||
-rw-r--r-- | src/xserver-xvnc.h | 2 |
7 files changed, 92 insertions, 94 deletions
diff --git a/src/seat-xlocal.c b/src/seat-xlocal.c index 996b4533..7a8b7221 100644 --- a/src/seat-xlocal.c +++ b/src/seat-xlocal.c @@ -129,6 +129,21 @@ seat_xlocal_set_active_display (Seat *seat, Display *display) } static void +seat_xlocal_run_script (Seat *seat, Display *display, Process *script) +{ + gchar *path; + XServerLocal *xserver; + + xserver = XSERVER_LOCAL (display_get_display_server (display)); + path = xserver_local_get_authority_file_path (xserver); + process_set_env (script, "DISPLAY", xserver_get_address (XSERVER (xserver))); + process_set_env (script, "XAUTHORITY", path); + g_free (path); + + SEAT_CLASS (seat_xlocal_parent_class)->run_script (seat, display, script); +} + +static void seat_xlocal_display_removed (Seat *seat, Display *display) { if (seat_get_is_stopping (seat)) @@ -164,5 +179,6 @@ seat_xlocal_class_init (SeatXLocalClass *klass) seat_class->create_display_server = seat_xlocal_create_display_server; seat_class->create_session = seat_xlocal_create_session; seat_class->set_active_display = seat_xlocal_set_active_display; + seat_class->run_script = seat_xlocal_run_script; seat_class->display_removed = seat_xlocal_display_removed; } diff --git a/src/seat-xremote.c b/src/seat-xremote.c index df648bde..d61acc14 100644 --- a/src/seat-xremote.c +++ b/src/seat-xremote.c @@ -60,6 +60,18 @@ seat_xremote_create_session (Seat *seat, Display *display) } static void +seat_xremote_run_script (Seat *seat, Display *display, Process *script) +{ + XServerRemote *xserver; + + xserver = XSERVER_REMOTE (display_get_display_server (display)); + process_set_env (script, "DISPLAY", xserver_get_address (XSERVER (xserver))); + process_set_env (script, "REMOTE_HOST", xserver_get_hostname (XSERVER (xserver))); + + SEAT_CLASS (seat_xremote_parent_class)->run_script (seat, display, script); +} + +static void seat_xremote_display_removed (Seat *seat, Display *display) { /* Can't restart the display, so remove this seat */ @@ -79,5 +91,6 @@ seat_xremote_class_init (SeatXRemoteClass *klass) seat_class->setup = seat_xremote_setup; seat_class->create_display_server = seat_xremote_create_display_server; seat_class->create_session = seat_xremote_create_session; + seat_class->run_script = seat_xremote_run_script; seat_class->display_removed = seat_xremote_display_removed; } diff --git a/src/seat-xvnc.c b/src/seat-xvnc.c index db1ae66f..d1e16965 100644 --- a/src/seat-xvnc.c +++ b/src/seat-xvnc.c @@ -63,6 +63,30 @@ seat_xvnc_create_session (Seat *seat, Display *display) } static void +seat_xvnc_run_script (Seat *seat, Display *display, Process *script) +{ + XServerXVNC *xserver; + GInetSocketAddress *address; + gchar *hostname; + gchar *path; + + xserver = XSERVER_XVNC (display_get_display_server (display)); + + address = G_INET_SOCKET_ADDRESS (g_socket_get_remote_address (SEAT_XVNC (seat)->priv->connection, NULL)); + hostname = g_inet_address_to_string (g_inet_socket_address_get_address (address)); + path = xserver_xvnc_get_authority_file_path (xserver); + + process_set_env (script, "REMOTE_HOST", hostname); + process_set_env (script, "DISPLAY", xserver_get_address (XSERVER (xserver))); + process_set_env (script, "XAUTHORITY", path); + + g_free (hostname); + g_free (path); + + SEAT_CLASS (seat_xvnc_parent_class)->run_script (seat, display, script); +} + +static void seat_xvnc_display_removed (Seat *seat, Display *display) { seat_stop (seat); @@ -94,6 +118,7 @@ seat_xvnc_class_init (SeatXVNCClass *klass) seat_class->create_display_server = seat_xvnc_create_display_server; seat_class->create_session = seat_xvnc_create_session; + seat_class->run_script = seat_xvnc_run_script; seat_class->display_removed = seat_xvnc_display_removed; object_class->finalize = seat_xdmcp_session_finalize; @@ -14,9 +14,6 @@ #include <sys/wait.h> #include "seat.h" -#include "display.h" -#include "xserver.h" // FIXME: Shouldn't know if it's an xserver -#include "xserver-local.h" // FIXME: Shouldn't know if it's an xserver #include "guest-account.h" enum { @@ -237,107 +234,42 @@ display_get_guest_username_cb (Display *display, Seat *seat) } static gboolean -run_script (Display *display, const gchar *script_name, User *user) +run_script (Seat *seat, Display *display, const gchar *script_name, User *user) { - gboolean result; - 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; - } - - result = g_shell_parse_argv (script_name, NULL, &argv, &error); - if (error) - g_warning ("Could not parse %s: %s", script_name, error->message); - if (!result) - 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")); + Process *process; + int exit_status; + gboolean result = FALSE; + process = process_new (); + process_set_command (process, script_name); + process_set_env (process, "SHELL", "/bin/sh"); + process_set_env (process, "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))); + process_set_env (process, "USER=%s", user_get_name (user)); + process_set_env (process, "USERNAME=%s", user_get_name (user)); + process_set_env (process, "LOGNAME=%s", user_get_name (user)); + process_set_env (process, "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; + process_set_env (process, "HOME", "/"); - g_ptr_array_add (env_array, g_strdup_printf ("DISPLAY=%s", xserver_get_address (xserver))); + SEAT_GET_CLASS (seat)->run_script (seat, display, process); - 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 (process_start (process)) + { + waitpid (process_get_pid (process), &exit_status, 0); - if (IS_XSERVER_LOCAL (xserver) && - (xauthority_path = xserver_local_get_authority_file_path (XSERVER_LOCAL (xserver)))) + if (WIFEXITED (exit_status)) { - g_ptr_array_add (env_array, g_strdup_printf ("XAUTHORITY=%s", xauthority_path)); - g_free (xauthority_path); + g_debug ("Exit status of %s: %d", script_name, WEXITSTATUS (exit_status)); + result = WEXITSTATUS (exit_status) == EXIT_SUCCESS; } } - 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); - result = g_spawn_sync (NULL, - argv, - envp, - G_SPAWN_SEARCH_PATH, - NULL, - NULL, - NULL, - NULL, - &exit_status, - &error); - if (error) - g_warning ("Error executing %s: %s", script_name, error->message); - g_clear_error (&error); - g_strfreev (argv); - g_strfreev (envp); - - if (!result) - return FALSE; - - if (WIFEXITED (exit_status)) - { - g_debug ("Exit status of %s: %d", script_name, WEXITSTATUS (exit_status)); - return WEXITSTATUS (exit_status) == EXIT_SUCCESS; - } + g_object_unref (process); - return FALSE; + return result; } static void @@ -361,7 +293,7 @@ display_start_display_server_cb (Display *display, Seat *seat) /* Run setup script */ script = seat_get_string_property (seat, "display-setup-script"); - if (script && !run_script (display, script, NULL)) + if (script && !run_script (seat, display, script, NULL)) return TRUE; emit_upstart_signal ("login-session-start"); @@ -385,7 +317,7 @@ display_start_greeter_cb (Display *display, Seat *seat) script = seat_get_string_property (seat, "greeter-setup-script"); if (script) - return !run_script (display, script, session_get_user (session)); + return !run_script (seat, display, script, session_get_user (session)); else return FALSE; } @@ -400,7 +332,7 @@ display_start_session_cb (Display *display, Seat *seat) script = seat_get_string_property (seat, "session-setup-script"); if (script) - return !run_script (display, script, session_get_user (session)); + return !run_script (seat, display, script, session_get_user (session)); else return FALSE; } @@ -427,7 +359,7 @@ session_stopped_cb (Session *session, Seat *seat) /* Cleanup */ script = seat_get_string_property (seat, "session-cleanup-script"); if (script) - run_script (display, script, session_get_user (session)); + run_script (seat, display, script, session_get_user (session)); if (seat->priv->guest_username && strcmp (user_get_name (session_get_user (session)), seat->priv->guest_username) == 0) { @@ -39,6 +39,7 @@ typedef struct DisplayServer *(*create_display_server) (Seat *seat); Session *(*create_session) (Seat *seat, Display *display); void (*set_active_display)(Seat *seat, Display *display); + void (*run_script)(Seat *seat, Display *display, Process *script); void (*stop)(Seat *seat); void (*started)(Seat *seat); diff --git a/src/xserver-xvnc.c b/src/xserver-xvnc.c index cec101c0..d9185895 100644 --- a/src/xserver-xvnc.c +++ b/src/xserver-xvnc.c @@ -88,6 +88,15 @@ xserver_xvnc_get_stdin (XServerXVNC *server) return server->priv->stdin_fd; } +gchar * +xserver_xvnc_get_authority_file_path (XServerXVNC *server) +{ + g_return_val_if_fail (server != NULL, 0); + if (server->priv->authority_file) + return g_file_get_path (server->priv->authority_file); + return NULL; +} + static gchar * get_absolute_command (const gchar *command) { diff --git a/src/xserver-xvnc.h b/src/xserver-xvnc.h index a1e65c17..461dcb3d 100644 --- a/src/xserver-xvnc.h +++ b/src/xserver-xvnc.h @@ -45,6 +45,8 @@ void xserver_xvnc_set_stdin (XServerXVNC *server, int fd); int xserver_xvnc_get_stdin (XServerXVNC *server); +gchar *xserver_xvnc_get_authority_file_path (XServerXVNC *server); + G_END_DECLS #endif /* _XSERVER_XVNC_H_ */ |