summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2007-10-29 17:09:04 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2007-10-29 17:09:04 +0000
commitf86a775c01b27bad3b1167bb5a6571a1ecf971cc (patch)
tree0ffdc769cd07c0940f995d270cec835607cbaec6
parentee4e3a5f4f46fa22aaa7fb0e4de82f2fece9c563 (diff)
downloadgdm-f86a775c01b27bad3b1167bb5a6571a1ecf971cc.tar.gz
Move the exec_script stuff to the base class.
2007-10-29 William Jon McCann <mccann@jhu.edu> * daemon/gdm-factory-slave.c: (run_greeter): * daemon/gdm-product-slave.c: (setup_server): * daemon/gdm-simple-slave.c: (run_greeter): * daemon/gdm-slave.c: (gdm_slave_whack_temp_auth_file), (create_temp_auth_file), (listify_hash), (get_script_environment), (gdm_slave_run_script): * daemon/gdm-slave.h: Move the exec_script stuff to the base class. svn path=/trunk/; revision=5449
-rw-r--r--ChangeLog11
-rw-r--r--daemon/gdm-factory-slave.c252
-rw-r--r--daemon/gdm-product-slave.c252
-rw-r--r--daemon/gdm-simple-slave.c257
-rw-r--r--daemon/gdm-slave.c228
-rw-r--r--daemon/gdm-slave.h3
6 files changed, 245 insertions, 758 deletions
diff --git a/ChangeLog b/ChangeLog
index dc326965..28696754 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2007-10-29 William Jon McCann <mccann@jhu.edu>
+ * daemon/gdm-factory-slave.c: (run_greeter):
+ * daemon/gdm-product-slave.c: (setup_server):
+ * daemon/gdm-simple-slave.c: (run_greeter):
+ * daemon/gdm-slave.c: (gdm_slave_whack_temp_auth_file),
+ (create_temp_auth_file), (listify_hash), (get_script_environment),
+ (gdm_slave_run_script):
+ * daemon/gdm-slave.h:
+ Move the exec_script stuff to the base class.
+
+2007-10-29 William Jon McCann <mccann@jhu.edu>
+
* daemon/gdm-greeter-server.c: (connection_filter_function):
Don't handle object messages in filter func.
diff --git a/daemon/gdm-factory-slave.c b/daemon/gdm-factory-slave.c
index 13ff1b36..27c2f109 100644
--- a/daemon/gdm-factory-slave.c
+++ b/daemon/gdm-factory-slave.c
@@ -92,254 +92,6 @@ static void gdm_factory_slave_finalize (GObject *object);
G_DEFINE_TYPE (GdmFactorySlave, gdm_factory_slave, GDM_TYPE_SLAVE)
static void
-gdm_factory_slave_whack_temp_auth_file (GdmFactorySlave *factory_slave)
-{
-#if 0
- uid_t old;
-
- old = geteuid ();
- if (old != 0)
- seteuid (0);
- if (d->parent_temp_auth_file != NULL) {
- VE_IGNORE_EINTR (g_unlink (d->parent_temp_auth_file));
- }
- g_free (d->parent_temp_auth_file);
- d->parent_temp_auth_file = NULL;
- if (old != 0)
- seteuid (old);
-#endif
-}
-
-
-static void
-create_temp_auth_file (GdmFactorySlave *factory_slave)
-{
-#if 0
- if (d->type == TYPE_FLEXI_XNEST &&
- d->parent_auth_file != NULL) {
- if (d->parent_temp_auth_file != NULL) {
- VE_IGNORE_EINTR (g_unlink (d->parent_temp_auth_file));
- }
- g_free (d->parent_temp_auth_file);
- d->parent_temp_auth_file =
- copy_auth_file (d->server_uid,
- gdm_daemon_config_get_gdmuid (),
- d->parent_auth_file);
- }
-#endif
-}
-
-static void
-listify_hash (const char *key,
- const char *value,
- GPtrArray *env)
-{
- char *str;
- str = g_strdup_printf ("%s=%s", key, value);
- g_debug ("environment: %s", str);
- g_ptr_array_add (env, str);
-}
-
-static GPtrArray *
-get_script_environment (GdmFactorySlave *slave,
- const char *username)
-{
- GPtrArray *env;
- GHashTable *hash;
- struct passwd *pwent;
- char *x_servers_file;
- char *display_name;
- char *display_hostname;
- char *display_x11_authority_file;
- gboolean display_is_local;
- char *temp;
-
- g_object_get (slave,
- "display-name", &display_name,
- "display-hostname", &display_hostname,
- "display-is-local", &display_is_local,
- "display-x11-authority-file", &display_x11_authority_file,
- NULL);
-
- env = g_ptr_array_new ();
-
- /* create a hash table of current environment, then update keys has necessary */
- hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-
- /* modify environment here */
- g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup ("/"));
- g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup ("/"));
- g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup ("/bin/sh"));
-
- g_hash_table_insert (hash, g_strdup ("LOGNAME"), g_strdup (username));
- g_hash_table_insert (hash, g_strdup ("USER"), g_strdup (username));
- g_hash_table_insert (hash, g_strdup ("USERNAME"), g_strdup (username));
-
- pwent = getpwnam (username);
- if (pwent != NULL) {
- if (pwent->pw_dir != NULL && pwent->pw_dir[0] != '\0') {
- g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup (pwent->pw_dir));
- g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup (pwent->pw_dir));
- }
-
- g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup (pwent->pw_shell));
- }
-
-#if 0
- if (display_is_parented) {
- g_hash_table_insert (hash, g_strdup ("GDM_PARENT_DISPLAY"), g_strdup (parent_display_name));
-
- /*g_hash_table_insert (hash, "GDM_PARENT_XAUTHORITY"), slave->priv->parent_temp_auth_file));*/
- }
-#endif
-
- /* some env for use with the Pre and Post scripts */
- temp = g_strconcat (display_name, ".Xservers", NULL);
- x_servers_file = g_build_filename (AUTHDIR, temp, NULL);
- g_free (temp);
-
- g_hash_table_insert (hash, g_strdup ("X_SERVERS"), x_servers_file);
-
- if (! display_is_local) {
- g_hash_table_insert (hash, g_strdup ("REMOTE_HOST"), g_strdup (display_hostname));
- }
-
- /* Runs as root */
- g_hash_table_insert (hash, g_strdup ("XAUTHORITY"), g_strdup (display_x11_authority_file));
- g_hash_table_insert (hash, g_strdup ("DISPLAY"), g_strdup (display_name));
-
- /*g_setenv ("PATH", gdm_daemon_config_get_value_string (GDM_KEY_ROOT_PATH), TRUE);*/
-
- g_hash_table_insert (hash, g_strdup ("RUNNING_UNDER_GDM"), g_strdup ("true"));
-
- g_hash_table_remove (hash, "MAIL");
-
-
- g_hash_table_foreach (hash, (GHFunc)listify_hash, env);
- g_hash_table_destroy (hash);
-
- g_ptr_array_add (env, NULL);
-
- g_free (display_name);
- g_free (display_hostname);
- g_free (display_x11_authority_file);
-
- return env;
-}
-
-static gboolean
-gdm_factory_slave_exec_script (GdmFactorySlave *slave,
- const char *dir,
- const char *login)
-{
- char *script;
- char **argv;
- gint status;
- GError *error;
- GPtrArray *env;
- gboolean res;
- gboolean ret;
- char *display_name;
- char *display_hostname;
-
- g_assert (dir != NULL);
- g_assert (login != NULL);
-
- g_object_get (slave,
- "display-name", &display_name,
- "display-hostname", &display_hostname,
- NULL);
-
- script = g_build_filename (dir, display_name, NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
-
- if (script == NULL &&
- display_hostname != NULL) {
- script = g_build_filename (dir, display_hostname, NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
-
-#if 0
- if (script == NULL &&
- SERVER_IS_XDMCP (d)) {
- script = g_build_filename (dir, "XDMCP", NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
- if (script == NULL &&
- SERVER_IS_FLEXI (d)) {
- script = g_build_filename (dir, "Flexi", NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
-#endif
-
- if (script == NULL) {
- script = g_build_filename (dir, "Default", NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
-
- if (script == NULL) {
- return TRUE;
- }
-
- create_temp_auth_file (slave);
-
- g_debug ("Running process: %s", script);
- error = NULL;
- if (! g_shell_parse_argv (script, NULL, &argv, &error)) {
- g_warning ("Could not parse command: %s", error->message);
- g_error_free (error);
- goto out;
- }
-
- env = get_script_environment (slave, login);
-
- res = g_spawn_sync (NULL,
- argv,
- (char **)env->pdata,
- G_SPAWN_SEARCH_PATH,
- NULL,
- NULL,
- NULL,
- NULL,
- &status,
- &error);
-
- g_ptr_array_foreach (env, (GFunc)g_free, NULL);
- g_ptr_array_free (env, TRUE);
-
- gdm_factory_slave_whack_temp_auth_file (slave);
-
- if (WIFEXITED (status)) {
- g_debug ("Process exit status: %d", WEXITSTATUS (status));
- ret = WEXITSTATUS (status) != 0;
- } else {
- ret = TRUE;
- }
-
- out:
- g_free (script);
- g_free (display_name);
- g_free (display_hostname);
-
- return ret;
-}
-
-static void
on_greeter_start (GdmGreeterSession *greeter,
GdmFactorySlave *slave)
{
@@ -635,9 +387,7 @@ run_greeter (GdmFactorySlave *slave)
#endif
/* Run the init script. gdmslave suspends until script has terminated */
- gdm_factory_slave_exec_script (slave,
- GDMCONFDIR"/Init",
- "gdm");
+ gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/Init", "gdm");
slave->priv->greeter_server = gdm_greeter_server_new (display_id);
g_signal_connect (slave->priv->greeter_server,
diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
index 20879449..53ac41c6 100644
--- a/daemon/gdm-product-slave.c
+++ b/daemon/gdm-product-slave.c
@@ -103,254 +103,6 @@ static void gdm_product_slave_finalize (GObject *object);
G_DEFINE_TYPE (GdmProductSlave, gdm_product_slave, GDM_TYPE_SLAVE)
static void
-gdm_product_slave_whack_temp_auth_file (GdmProductSlave *product_slave)
-{
-#if 0
- uid_t old;
-
- old = geteuid ();
- if (old != 0)
- seteuid (0);
- if (d->parent_temp_auth_file != NULL) {
- VE_IGNORE_EINTR (g_unlink (d->parent_temp_auth_file));
- }
- g_free (d->parent_temp_auth_file);
- d->parent_temp_auth_file = NULL;
- if (old != 0)
- seteuid (old);
-#endif
-}
-
-
-static void
-create_temp_auth_file (GdmProductSlave *product_slave)
-{
-#if 0
- if (d->type == TYPE_FLEXI_XNEST &&
- d->parent_auth_file != NULL) {
- if (d->parent_temp_auth_file != NULL) {
- VE_IGNORE_EINTR (g_unlink (d->parent_temp_auth_file));
- }
- g_free (d->parent_temp_auth_file);
- d->parent_temp_auth_file =
- copy_auth_file (d->server_uid,
- gdm_daemon_config_get_gdmuid (),
- d->parent_auth_file);
- }
-#endif
-}
-
-static void
-listify_hash (const char *key,
- const char *value,
- GPtrArray *env)
-{
- char *str;
- str = g_strdup_printf ("%s=%s", key, value);
- g_debug ("environment: %s", str);
- g_ptr_array_add (env, str);
-}
-
-static GPtrArray *
-get_script_environment (GdmProductSlave *slave,
- const char *username)
-{
- GPtrArray *env;
- GHashTable *hash;
- struct passwd *pwent;
- char *x_servers_file;
- char *display_name;
- char *display_hostname;
- char *display_x11_authority_file;
- gboolean display_is_local;
- char *temp;
-
- g_object_get (slave,
- "display-name", &display_name,
- "display-hostname", &display_hostname,
- "display-is-local", &display_is_local,
- "display-x11-authority-file", &display_x11_authority_file,
- NULL);
-
- env = g_ptr_array_new ();
-
- /* create a hash table of current environment, then update keys has necessary */
- hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-
- /* modify environment here */
- g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup ("/"));
- g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup ("/"));
- g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup ("/bin/sh"));
-
- g_hash_table_insert (hash, g_strdup ("LOGNAME"), g_strdup (username));
- g_hash_table_insert (hash, g_strdup ("USER"), g_strdup (username));
- g_hash_table_insert (hash, g_strdup ("USERNAME"), g_strdup (username));
-
- pwent = getpwnam (username);
- if (pwent != NULL) {
- if (pwent->pw_dir != NULL && pwent->pw_dir[0] != '\0') {
- g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup (pwent->pw_dir));
- g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup (pwent->pw_dir));
- }
-
- g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup (pwent->pw_shell));
- }
-
-#if 0
- if (display_is_parented) {
- g_hash_table_insert (hash, g_strdup ("GDM_PARENT_DISPLAY"), g_strdup (parent_display_name));
-
- /*g_hash_table_insert (hash, "GDM_PARENT_XAUTHORITY"), slave->priv->parent_temp_auth_file));*/
- }
-#endif
-
- /* some env for use with the Pre and Post scripts */
- temp = g_strconcat (display_name, ".Xservers", NULL);
- x_servers_file = g_build_filename (AUTHDIR, temp, NULL);
- g_free (temp);
-
- g_hash_table_insert (hash, g_strdup ("X_SERVERS"), x_servers_file);
-
- if (! display_is_local) {
- g_hash_table_insert (hash, g_strdup ("REMOTE_HOST"), g_strdup (display_hostname));
- }
-
- /* Runs as root */
- g_hash_table_insert (hash, g_strdup ("XAUTHORITY"), g_strdup (display_x11_authority_file));
- g_hash_table_insert (hash, g_strdup ("DISPLAY"), g_strdup (display_name));
-
- /*g_setenv ("PATH", gdm_daemon_config_get_value_string (GDM_KEY_ROOT_PATH), TRUE);*/
-
- g_hash_table_insert (hash, g_strdup ("RUNNING_UNDER_GDM"), g_strdup ("true"));
-
- g_hash_table_remove (hash, "MAIL");
-
-
- g_hash_table_foreach (hash, (GHFunc)listify_hash, env);
- g_hash_table_destroy (hash);
-
- g_ptr_array_add (env, NULL);
-
- g_free (display_name);
- g_free (display_hostname);
- g_free (display_x11_authority_file);
-
- return env;
-}
-
-static gboolean
-gdm_product_slave_exec_script (GdmProductSlave *slave,
- const char *dir,
- const char *login)
-{
- char *script;
- char **argv;
- gint status;
- GError *error;
- GPtrArray *env;
- gboolean res;
- gboolean ret;
- char *display_name;
- char *display_hostname;
-
- g_assert (dir != NULL);
- g_assert (login != NULL);
-
- g_object_get (slave,
- "display-name", &display_name,
- "display-hostname", &display_hostname,
- NULL);
-
- script = g_build_filename (dir, display_name, NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
-
- if (script == NULL &&
- display_hostname != NULL) {
- script = g_build_filename (dir, display_hostname, NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
-
-#if 0
- if (script == NULL &&
- SERVER_IS_XDMCP (d)) {
- script = g_build_filename (dir, "XDMCP", NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
- if (script == NULL &&
- SERVER_IS_FLEXI (d)) {
- script = g_build_filename (dir, "Flexi", NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
-#endif
-
- if (script == NULL) {
- script = g_build_filename (dir, "Default", NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
-
- if (script == NULL) {
- return TRUE;
- }
-
- create_temp_auth_file (slave);
-
- g_debug ("Running process: %s", script);
- error = NULL;
- if (! g_shell_parse_argv (script, NULL, &argv, &error)) {
- g_warning ("Could not parse command: %s", error->message);
- g_error_free (error);
- goto out;
- }
-
- env = get_script_environment (slave, login);
-
- res = g_spawn_sync (NULL,
- argv,
- (char **)env->pdata,
- G_SPAWN_SEARCH_PATH,
- NULL,
- NULL,
- NULL,
- NULL,
- &status,
- &error);
-
- g_ptr_array_foreach (env, (GFunc)g_free, NULL);
- g_ptr_array_free (env, TRUE);
-
- gdm_product_slave_whack_temp_auth_file (slave);
-
- if (WIFEXITED (status)) {
- g_debug ("Process exit status: %d", WEXITSTATUS (status));
- ret = WEXITSTATUS (status) != 0;
- } else {
- ret = TRUE;
- }
-
- out:
- g_free (script);
- g_free (display_name);
- g_free (display_hostname);
-
- return ret;
-}
-
-static void
relay_session_started (GdmProductSlave *slave)
{
GError *error;
@@ -711,9 +463,7 @@ setup_server (GdmProductSlave *slave)
#endif
/* Run the init script. gdmslave suspends until script has terminated */
- gdm_product_slave_exec_script (slave,
- GDMCONFDIR"/Init",
- "gdm");
+ gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR"/Init", "gdm");
g_free (display_name);
g_free (auth_file);
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index 00270baa..f1d854bb 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -99,259 +99,6 @@ static void gdm_simple_slave_finalize (GObject *object);
G_DEFINE_TYPE (GdmSimpleSlave, gdm_simple_slave, GDM_TYPE_SLAVE)
static void
-gdm_simple_slave_whack_temp_auth_file (GdmSimpleSlave *simple_slave)
-{
-#if 0
- uid_t old;
-
- old = geteuid ();
- if (old != 0)
- seteuid (0);
- if (d->parent_temp_auth_file != NULL) {
- VE_IGNORE_EINTR (g_unlink (d->parent_temp_auth_file));
- }
- g_free (d->parent_temp_auth_file);
- d->parent_temp_auth_file = NULL;
- if (old != 0)
- seteuid (old);
-#endif
-}
-
-
-static void
-create_temp_auth_file (GdmSimpleSlave *simple_slave)
-{
-#if 0
- if (d->type == TYPE_FLEXI_XNEST &&
- d->parent_auth_file != NULL) {
- if (d->parent_temp_auth_file != NULL) {
- VE_IGNORE_EINTR (g_unlink (d->parent_temp_auth_file));
- }
- g_free (d->parent_temp_auth_file);
- d->parent_temp_auth_file =
- copy_auth_file (d->server_uid,
- gdm_daemon_config_get_gdmuid (),
- d->parent_auth_file);
- }
-#endif
-}
-
-static void
-listify_hash (const char *key,
- const char *value,
- GPtrArray *env)
-{
- char *str;
- str = g_strdup_printf ("%s=%s", key, value);
- g_debug ("script environment: %s", str);
- g_ptr_array_add (env, str);
-}
-
-static GPtrArray *
-get_script_environment (GdmSimpleSlave *slave,
- const char *username)
-{
- GPtrArray *env;
- GHashTable *hash;
- struct passwd *pwent;
- char *x_servers_file;
- char *display_name;
- char *display_hostname;
- char *display_x11_authority_file;
- gboolean display_is_local;
- char *temp;
-
- display_name = NULL;
- display_hostname = NULL;
- display_x11_authority_file = NULL;
- display_is_local = FALSE;
-
- g_object_get (slave,
- "display-name", &display_name,
- "display-hostname", &display_hostname,
- "display-is-local", &display_is_local,
- "display-x11-authority-file", &display_x11_authority_file,
- NULL);
-
- env = g_ptr_array_new ();
-
- /* create a hash table of current environment, then update keys has necessary */
- hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-
- /* modify environment here */
- g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup ("/"));
- g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup ("/"));
- g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup ("/bin/sh"));
-
- g_hash_table_insert (hash, g_strdup ("LOGNAME"), g_strdup (username));
- g_hash_table_insert (hash, g_strdup ("USER"), g_strdup (username));
- g_hash_table_insert (hash, g_strdup ("USERNAME"), g_strdup (username));
-
- pwent = getpwnam (username);
- if (pwent != NULL) {
- if (pwent->pw_dir != NULL && pwent->pw_dir[0] != '\0') {
- g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup (pwent->pw_dir));
- g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup (pwent->pw_dir));
- }
-
- g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup (pwent->pw_shell));
- }
-
-#if 0
- if (display_is_parented) {
- g_hash_table_insert (hash, g_strdup ("GDM_PARENT_DISPLAY"), g_strdup (parent_display_name));
-
- /*g_hash_table_insert (hash, "GDM_PARENT_XAUTHORITY"), slave->priv->parent_temp_auth_file));*/
- }
-#endif
-
- /* some env for use with the Pre and Post scripts */
- temp = g_strconcat (display_name, ".Xservers", NULL);
- x_servers_file = g_build_filename (AUTHDIR, temp, NULL);
- g_free (temp);
-
- g_hash_table_insert (hash, g_strdup ("X_SERVERS"), x_servers_file);
-
- if (! display_is_local) {
- g_hash_table_insert (hash, g_strdup ("REMOTE_HOST"), g_strdup (display_hostname));
- }
-
- /* Runs as root */
- g_hash_table_insert (hash, g_strdup ("XAUTHORITY"), g_strdup (display_x11_authority_file));
- g_hash_table_insert (hash, g_strdup ("DISPLAY"), g_strdup (display_name));
-
- /*g_setenv ("PATH", gdm_daemon_config_get_value_string (GDM_KEY_ROOT_PATH), TRUE);*/
-
- g_hash_table_insert (hash, g_strdup ("RUNNING_UNDER_GDM"), g_strdup ("true"));
-
- g_hash_table_remove (hash, "MAIL");
-
-
- g_hash_table_foreach (hash, (GHFunc)listify_hash, env);
- g_hash_table_destroy (hash);
-
- g_ptr_array_add (env, NULL);
-
- g_free (display_name);
- g_free (display_hostname);
- g_free (display_x11_authority_file);
-
- return env;
-}
-
-static gboolean
-gdm_simple_slave_exec_script (GdmSimpleSlave *slave,
- const char *dir,
- const char *login)
-{
- char *script;
- char **argv;
- gint status;
- GError *error;
- GPtrArray *env;
- gboolean res;
- gboolean ret;
- char *display_name;
- char *display_hostname;
-
- g_assert (dir != NULL);
- g_assert (login != NULL);
-
- g_object_get (slave,
- "display-name", &display_name,
- "display-hostname", &display_hostname,
- NULL);
-
- script = g_build_filename (dir, display_name, NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
-
- if (script == NULL &&
- display_hostname != NULL) {
- script = g_build_filename (dir, display_hostname, NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
-
-#if 0
- if (script == NULL &&
- SERVER_IS_XDMCP (d)) {
- script = g_build_filename (dir, "XDMCP", NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
- if (script == NULL &&
- SERVER_IS_FLEXI (d)) {
- script = g_build_filename (dir, "Flexi", NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
-#endif
-
- if (script == NULL) {
- script = g_build_filename (dir, "Default", NULL);
- if (g_access (script, R_OK|X_OK) != 0) {
- g_free (script);
- script = NULL;
- }
- }
-
- if (script == NULL) {
- return TRUE;
- }
-
- create_temp_auth_file (slave);
-
- g_debug ("Running process: %s", script);
- error = NULL;
- if (! g_shell_parse_argv (script, NULL, &argv, &error)) {
- g_warning ("Could not parse command: %s", error->message);
- g_error_free (error);
- goto out;
- }
-
- env = get_script_environment (slave, login);
-
- res = g_spawn_sync (NULL,
- argv,
- (char **)env->pdata,
- G_SPAWN_SEARCH_PATH,
- NULL,
- NULL,
- NULL,
- NULL,
- &status,
- &error);
-
- g_ptr_array_foreach (env, (GFunc)g_free, NULL);
- g_ptr_array_free (env, TRUE);
-
- gdm_simple_slave_whack_temp_auth_file (slave);
-
- if (WIFEXITED (status)) {
- g_debug ("Process exit status: %d", WEXITSTATUS (status));
- ret = WEXITSTATUS (status) != 0;
- } else {
- ret = TRUE;
- }
-
- out:
- g_free (script);
- g_free (display_name);
- g_free (display_hostname);
-
- return ret;
-}
-
-static void
on_session_started (GdmSession *session,
GPid pid,
GdmSimpleSlave *slave)
@@ -1044,9 +791,7 @@ run_greeter (GdmSimpleSlave *slave)
#endif
/* Run the init script. gdmslave suspends until script has terminated */
- gdm_simple_slave_exec_script (slave,
- GDMCONFDIR"/Init",
- "gdm");
+ gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/Init", "gdm");
create_new_session (slave);
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index ee4c1b14..e1485a06 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -33,6 +33,7 @@
#include <signal.h>
#include <glib.h>
+#include <glib/gstdio.h>
#include <glib/gi18n.h>
#include <glib-object.h>
@@ -112,6 +113,233 @@ static void gdm_slave_finalize (GObject *object);
G_DEFINE_ABSTRACT_TYPE (GdmSlave, gdm_slave, G_TYPE_OBJECT)
#define CURSOR_WATCH XC_watch
+
+static void
+gdm_slave_whack_temp_auth_file (GdmSlave *slave)
+{
+#if 0
+ uid_t old;
+
+ old = geteuid ();
+ if (old != 0)
+ seteuid (0);
+ if (d->parent_temp_auth_file != NULL) {
+ VE_IGNORE_EINTR (g_unlink (d->parent_temp_auth_file));
+ }
+ g_free (d->parent_temp_auth_file);
+ d->parent_temp_auth_file = NULL;
+ if (old != 0)
+ seteuid (old);
+#endif
+}
+
+
+static void
+create_temp_auth_file (GdmSlave *slave)
+{
+#if 0
+ if (d->type == TYPE_FLEXI_XNEST &&
+ d->parent_auth_file != NULL) {
+ if (d->parent_temp_auth_file != NULL) {
+ VE_IGNORE_EINTR (g_unlink (d->parent_temp_auth_file));
+ }
+ g_free (d->parent_temp_auth_file);
+ d->parent_temp_auth_file =
+ copy_auth_file (d->server_uid,
+ gdm_daemon_config_get_gdmuid (),
+ d->parent_auth_file);
+ }
+#endif
+}
+
+static void
+listify_hash (const char *key,
+ const char *value,
+ GPtrArray *env)
+{
+ char *str;
+ str = g_strdup_printf ("%s=%s", key, value);
+ g_debug ("script environment: %s", str);
+ g_ptr_array_add (env, str);
+}
+
+static GPtrArray *
+get_script_environment (GdmSlave *slave,
+ const char *username)
+{
+ GPtrArray *env;
+ GHashTable *hash;
+ struct passwd *pwent;
+ char *x_servers_file;
+ char *temp;
+
+ env = g_ptr_array_new ();
+
+ /* create a hash table of current environment, then update keys has necessary */
+ hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+
+ /* modify environment here */
+ g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup ("/"));
+ g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup ("/"));
+ g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup ("/bin/sh"));
+
+ g_hash_table_insert (hash, g_strdup ("LOGNAME"), g_strdup (username));
+ g_hash_table_insert (hash, g_strdup ("USER"), g_strdup (username));
+ g_hash_table_insert (hash, g_strdup ("USERNAME"), g_strdup (username));
+
+ pwent = getpwnam (username);
+ if (pwent != NULL) {
+ if (pwent->pw_dir != NULL && pwent->pw_dir[0] != '\0') {
+ g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup (pwent->pw_dir));
+ g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup (pwent->pw_dir));
+ }
+
+ g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup (pwent->pw_shell));
+ }
+
+#if 0
+ if (display_is_parented) {
+ g_hash_table_insert (hash, g_strdup ("GDM_PARENT_DISPLAY"), g_strdup (parent_display_name));
+
+ /*g_hash_table_insert (hash, "GDM_PARENT_XAUTHORITY"), slave->priv->parent_temp_auth_file));*/
+ }
+#endif
+
+ /* some env for use with the Pre and Post scripts */
+ temp = g_strconcat (slave->priv->display_name, ".Xservers", NULL);
+ x_servers_file = g_build_filename (AUTHDIR, temp, NULL);
+ g_free (temp);
+
+ g_hash_table_insert (hash, g_strdup ("X_SERVERS"), x_servers_file);
+
+ if (! slave->priv->display_is_local) {
+ g_hash_table_insert (hash, g_strdup ("REMOTE_HOST"), g_strdup (slave->priv->display_hostname));
+ }
+
+ /* Runs as root */
+ g_hash_table_insert (hash, g_strdup ("XAUTHORITY"), g_strdup (slave->priv->display_x11_authority_file));
+ g_hash_table_insert (hash, g_strdup ("DISPLAY"), g_strdup (slave->priv->display_name));
+
+ /*g_setenv ("PATH", gdm_daemon_config_get_value_string (GDM_KEY_ROOT_PATH), TRUE);*/
+
+ g_hash_table_insert (hash, g_strdup ("RUNNING_UNDER_GDM"), g_strdup ("true"));
+
+ g_hash_table_remove (hash, "MAIL");
+
+
+ g_hash_table_foreach (hash, (GHFunc)listify_hash, env);
+ g_hash_table_destroy (hash);
+
+ g_ptr_array_add (env, NULL);
+
+ return env;
+}
+
+gboolean
+gdm_slave_run_script (GdmSlave *slave,
+ const char *dir,
+ const char *login)
+{
+ char *script;
+ char **argv;
+ gint status;
+ GError *error;
+ GPtrArray *env;
+ gboolean res;
+ gboolean ret;
+
+ ret = FALSE;
+
+ g_assert (dir != NULL);
+ g_assert (login != NULL);
+
+ script = g_build_filename (dir, slave->priv->display_name, NULL);
+ if (g_access (script, R_OK | X_OK) != 0) {
+ g_free (script);
+ script = NULL;
+ }
+
+ if (script == NULL &&
+ slave->priv->display_hostname != NULL) {
+ script = g_build_filename (dir, slave->priv->display_hostname, NULL);
+ if (g_access (script, R_OK | X_OK) != 0) {
+ g_free (script);
+ script = NULL;
+ }
+ }
+
+#if 0
+ if (script == NULL &&
+ SERVER_IS_XDMCP (d)) {
+ script = g_build_filename (dir, "XDMCP", NULL);
+ if (g_access (script, R_OK | X_OK) != 0) {
+ g_free (script);
+ script = NULL;
+ }
+ }
+ if (script == NULL &&
+ SERVER_IS_FLEXI (d)) {
+ script = g_build_filename (dir, "Flexi", NULL);
+ if (g_access (script, R_OK | X_OK) != 0) {
+ g_free (script);
+ script = NULL;
+ }
+ }
+#endif
+
+ if (script == NULL) {
+ script = g_build_filename (dir, "Default", NULL);
+ if (g_access (script, R_OK | X_OK) != 0) {
+ g_free (script);
+ script = NULL;
+ }
+ }
+
+ if (script == NULL) {
+ return TRUE;
+ }
+
+ create_temp_auth_file (slave);
+
+ g_debug ("Running process: %s", script);
+ error = NULL;
+ if (! g_shell_parse_argv (script, NULL, &argv, &error)) {
+ g_warning ("Could not parse command: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+
+ env = get_script_environment (slave, login);
+
+ res = g_spawn_sync (NULL,
+ argv,
+ (char **)env->pdata,
+ G_SPAWN_SEARCH_PATH,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ &status,
+ &error);
+
+ g_ptr_array_foreach (env, (GFunc)g_free, NULL);
+ g_ptr_array_free (env, TRUE);
+
+ gdm_slave_whack_temp_auth_file (slave);
+
+ if (WIFEXITED (status)) {
+ g_debug ("Process exit status: %d", WEXITSTATUS (status));
+ ret = WEXITSTATUS (status) != 0;
+ } else {
+ ret = TRUE;
+ }
+
+ out:
+ g_free (script);
+
+ return ret;
+}
+
void
gdm_slave_set_busy_cursor (GdmSlave *slave)
{
diff --git a/daemon/gdm-slave.h b/daemon/gdm-slave.h
index eaa4cc3b..f38e58dc 100644
--- a/daemon/gdm-slave.h
+++ b/daemon/gdm-slave.h
@@ -62,6 +62,9 @@ gboolean gdm_slave_add_user_authorization (GdmSlave *slave,
char **filename);
gboolean gdm_slave_connect_to_x11_display (GdmSlave *slave);
void gdm_slave_set_busy_cursor (GdmSlave *slave);
+gboolean gdm_slave_run_script (GdmSlave *slave,
+ const char *dir,
+ const char *username);
void gdm_slave_stopped (GdmSlave *slave);
G_END_DECLS