summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2009-02-04 10:55:03 -0500
committerRay Strode <rstrode@redhat.com>2009-04-17 10:24:47 -0400
commit2e566b37c2b17117a70d1fa4c9e97cfdfeb27e75 (patch)
tree6adb65018b485be10337e18cafc752a05ccc2aa7
parentb1fbbdad6d4fd847b248aaad7eec9a8730714b06 (diff)
downloadgdm-2e566b37c2b17117a70d1fa4c9e97cfdfeb27e75.tar.gz
Rename session worker to the service it's managing
This way when we're running multiple PAM conversations at once it will be obvious which worker is managing which conversation.
-rw-r--r--daemon/gdm-session-direct.c7
-rw-r--r--daemon/gdm-session-worker-job.c63
-rw-r--r--daemon/gdm-session-worker-job.h3
3 files changed, 57 insertions, 16 deletions
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
index 304a67b8..0a715125 100644
--- a/daemon/gdm-session-direct.c
+++ b/daemon/gdm-session-direct.c
@@ -1623,6 +1623,7 @@ start_conversation (GdmSessionDirect *session,
const char *service_name)
{
GdmSessionConversation *conversation;
+ char *job_name;
conversation = g_new0 (GdmSessionConversation, 1);
conversation->session = session;
@@ -1643,12 +1644,16 @@ start_conversation (GdmSessionDirect *session,
G_CALLBACK (worker_died),
conversation);
- if (!gdm_session_worker_job_start (conversation->job)) {
+ job_name = g_strdup_printf ("pam: %s", service_name);
+ if (!gdm_session_worker_job_start (conversation->job,
+ job_name)) {
g_object_unref (conversation->job);
g_free (conversation->service_name);
g_free (conversation);
+ g_free (job_name);
return NULL;
}
+ g_free (job_name);
conversation->worker_pid = gdm_session_worker_job_get_pid (conversation->job);
diff --git a/daemon/gdm-session-worker-job.c b/daemon/gdm-session-worker-job.c
index 9c020fa0..0327d77b 100644
--- a/daemon/gdm-session-worker-job.c
+++ b/daemon/gdm-session-worker-job.c
@@ -149,6 +149,37 @@ copy_environment_to_hash (GHashTable *hash)
}
static GPtrArray *
+get_job_arguments (GdmSessionWorkerJob *job,
+ const char *name)
+{
+ GPtrArray *args;
+ GError *error;
+ char **argv;
+ int i;
+
+ args = NULL;
+ argv = NULL;
+ error = NULL;
+ if (! g_shell_parse_argv (job->priv->command, NULL, &argv, &error)) {
+ g_warning ("Could not parse command: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+
+ args = g_ptr_array_new ();
+ g_ptr_array_add (args, g_strdup (argv[0]));
+ g_ptr_array_add (args, g_strdup (name));
+ for (i = 1; argv[i] != NULL; i++) {
+ g_ptr_array_add (args, g_strdup (argv[i]));
+ }
+ g_strfreev (argv);
+
+ g_ptr_array_add (args, NULL);
+out:
+ return args;
+}
+
+static GPtrArray *
get_job_environment (GdmSessionWorkerJob *job)
{
GPtrArray *env;
@@ -171,31 +202,31 @@ get_job_environment (GdmSessionWorkerJob *job)
}
static gboolean
-gdm_session_worker_job_spawn (GdmSessionWorkerJob *session_worker_job)
+gdm_session_worker_job_spawn (GdmSessionWorkerJob *session_worker_job,
+ const char *name)
{
- gchar **argv;
GError *error;
gboolean ret;
+ GPtrArray *args;
GPtrArray *env;
ret = FALSE;
- g_debug ("GdmSessionWorkerJob: Running session_worker_job process: %s", session_worker_job->priv->command);
+ g_debug ("GdmSessionWorkerJob: Running session_worker_job process: %s %s",
+ name != NULL? name : "", session_worker_job->priv->command);
- argv = NULL;
- if (! g_shell_parse_argv (session_worker_job->priv->command, NULL, &argv, &error)) {
- g_warning ("Could not parse command: %s", error->message);
- g_error_free (error);
- goto out;
- }
+ args = get_job_arguments (session_worker_job, name);
+ if (args == NULL) {
+ return FALSE;
+ }
env = get_job_environment (session_worker_job);
error = NULL;
ret = g_spawn_async_with_pipes (NULL,
- argv,
+ (char **) args->pdata,
(char **)env->pdata,
- G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
+ G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_FILE_AND_ARGV_ZERO,
(GSpawnChildSetupFunc)session_worker_job_child_setup,
session_worker_job,
&session_worker_job->priv->pid,
@@ -204,6 +235,9 @@ gdm_session_worker_job_spawn (GdmSessionWorkerJob *session_worker_job)
NULL,
&error);
+ g_ptr_array_foreach (args, (GFunc)g_free, NULL);
+ g_ptr_array_free (args, TRUE);
+
g_ptr_array_foreach (env, (GFunc)g_free, NULL);
g_ptr_array_free (env, TRUE);
@@ -220,7 +254,6 @@ gdm_session_worker_job_spawn (GdmSessionWorkerJob *session_worker_job)
(GChildWatchFunc)session_worker_job_child_watch,
session_worker_job);
- g_strfreev (argv);
out:
return ret;
@@ -233,13 +266,14 @@ gdm_session_worker_job_spawn (GdmSessionWorkerJob *session_worker_job)
* Starts a local X session_worker_job. Handles retries and fatal errors properly.
*/
gboolean
-gdm_session_worker_job_start (GdmSessionWorkerJob *session_worker_job)
+gdm_session_worker_job_start (GdmSessionWorkerJob *session_worker_job,
+ const char *name)
{
gboolean res;
g_debug ("GdmSessionWorkerJob: Starting worker...");
- res = gdm_session_worker_job_spawn (session_worker_job);
+ res = gdm_session_worker_job_spawn (session_worker_job, name);
if (res) {
@@ -287,6 +321,7 @@ gdm_session_worker_job_stop (GdmSessionWorkerJob *session_worker_job)
g_debug ("GdmSessionWorkerJob: Stopping job pid:%d", session_worker_job->priv->pid);
res = gdm_signal_pid (session_worker_job->priv->pid, SIGTERM);
+
if (res < 0) {
g_warning ("Unable to kill session worker process");
} else {
diff --git a/daemon/gdm-session-worker-job.h b/daemon/gdm-session-worker-job.h
index d24f025d..4833f23c 100644
--- a/daemon/gdm-session-worker-job.h
+++ b/daemon/gdm-session-worker-job.h
@@ -57,7 +57,8 @@ GType gdm_session_worker_job_get_type (void);
GdmSessionWorkerJob * gdm_session_worker_job_new (void);
void gdm_session_worker_job_set_server_address (GdmSessionWorkerJob *session_worker_job,
const char *server_address);
-gboolean gdm_session_worker_job_start (GdmSessionWorkerJob *session_worker_job);
+gboolean gdm_session_worker_job_start (GdmSessionWorkerJob *session_worker_job,
+ const char *name);
gboolean gdm_session_worker_job_stop (GdmSessionWorkerJob *session_worker_job);
GPid gdm_session_worker_job_get_pid (GdmSessionWorkerJob *session_worker_job);