summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/seat-xlocal.c16
-rw-r--r--src/seat-xremote.c13
-rw-r--r--src/seat-xvnc.c25
-rw-r--r--src/seat.c120
-rw-r--r--src/seat.h1
-rw-r--r--src/xserver-xvnc.c9
-rw-r--r--src/xserver-xvnc.h2
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;
diff --git a/src/seat.c b/src/seat.c
index ffeb6ea1..8a527a8e 100644
--- a/src/seat.c
+++ b/src/seat.c
@@ -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)
{
diff --git a/src/seat.h b/src/seat.h
index 23069a33..3a087298 100644
--- a/src/seat.h
+++ b/src/seat.h
@@ -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_ */