diff options
author | William Jon McCann <jmccann@redhat.com> | 2008-04-19 00:48:10 -0400 |
---|---|---|
committer | William Jon McCann <jmccann@redhat.com> | 2008-04-19 00:48:10 -0400 |
commit | fbb42449670f21cdeb7f0106fc617e276d7e229c (patch) | |
tree | be8d939a63bf9d3b88679f91420b991689f3d22d | |
parent | e30bc7486fe4e872a7b91f1566bc2c880deb63b7 (diff) |
always try to detect parameters for session
Treat the parameters passed in via OpenSessionWithParameters
as overrides.
-rw-r--r-- | src/ck-manager.c | 16 | ||||
-rw-r--r-- | src/ck-session-leader.c | 120 | ||||
-rw-r--r-- | src/ck-session-leader.h | 63 | ||||
-rw-r--r-- | src/ck-vt-monitor.c | 1 |
4 files changed, 155 insertions, 45 deletions
diff --git a/src/ck-manager.c b/src/ck-manager.c index c491e14..df5a86a 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -1,6 +1,6 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- * - * Copyright (C) 2006-2007 William Jon McCann <mccann@jhu.edu> + * Copyright (C) 2006-2008 William Jon McCann <mccann@jhu.edu> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1923,22 +1923,16 @@ create_session_for_sender (CkManager *manager, ck_session_leader_set_service_name (leader, sender); ck_session_leader_set_session_id (leader, ssid); ck_session_leader_set_cookie (leader, cookie); + ck_session_leader_set_override_parameters (leader, parameters); /* need to store the leader info first so the pending request can be revoked */ g_hash_table_insert (manager->priv->leaders, g_strdup (cookie), g_object_ref (leader)); - if (parameters == NULL) { - generate_session_for_leader (manager, - leader, - context); - } else { - verify_and_open_session_for_leader (manager, - leader, - parameters, - context); - } + generate_session_for_leader (manager, + leader, + context); g_free (cookie); g_free (ssid); diff --git a/src/ck-session-leader.c b/src/ck-session-leader.c index 48df0b8..b0faf89 100644 --- a/src/ck-session-leader.c +++ b/src/ck-session-leader.c @@ -58,6 +58,7 @@ struct CkSessionLeaderPrivate char *cookie; GList *pending_jobs; gboolean cancelled; + GHashTable *override_parameters; }; enum { @@ -190,6 +191,33 @@ add_param_string (GPtrArray *parameters, g_ptr_array_add (parameters, g_value_get_boxed (¶m_val)); } +static gboolean +maybe_add_override_parameter (CkSessionLeader *leader, + const char *prop_name, + GPtrArray *parameters) +{ + gpointer data; + gpointer data_copy; + + if (leader->priv->override_parameters == NULL) { + return FALSE; + } + + if (prop_name == NULL) { + return FALSE; + } + + data = g_hash_table_lookup (leader->priv->override_parameters, prop_name); + if (data == NULL) { + return FALSE; + } + + data_copy = g_boxed_copy (CK_TYPE_PARAMETER_STRUCT, data); + g_ptr_array_add (parameters, data_copy); + + return TRUE; +} + typedef void (* CkAddParamFunc) (GPtrArray *arr, const char *key, const char *value); @@ -209,7 +237,8 @@ static struct { }; static GPtrArray * -parse_output (const char *output) +parse_output (CkSessionLeader *leader, + const char *output) { GPtrArray *parameters; char **lines; @@ -232,6 +261,11 @@ parse_output (const char *output) continue; } + if (maybe_add_override_parameter (leader, vals[0], parameters)) { + g_strfreev (vals); + continue; + } + for (j = 0; j < G_N_ELEMENTS (parse_ops); j++) { if (strcmp (vals[0], parse_ops[j].key) == 0) { parse_ops[j].func (parameters, vals[0], vals[1]); @@ -246,7 +280,6 @@ parse_output (const char *output) return parameters; } - static void parameters_free (GPtrArray *parameters) { @@ -263,6 +296,59 @@ parameters_free (GPtrArray *parameters) g_ptr_array_free (parameters, TRUE); } +static void +save_parameters (CkSessionLeader *leader, + const GPtrArray *parameters) +{ + int i; + + for (i = 0; i < parameters->len; i++) { + gpointer data; + data = g_ptr_array_index (parameters, i); + + /* filter out the nulls? - sure why not */ + + if (data != NULL) { + gpointer data_copy; + GValue val_struct = { 0, }; + char *prop_name; + gboolean res; + + g_value_init (&val_struct, CK_TYPE_PARAMETER_STRUCT); + g_value_set_static_boxed (&val_struct, g_ptr_array_index (parameters, i)); + + res = dbus_g_type_struct_get (&val_struct, + 0, &prop_name, + G_MAXUINT); + if (! res) { + g_debug ("Unable to extract parameter input"); + g_free (prop_name); + continue; + } + + if (prop_name == NULL) { + g_debug ("Skipping NULL parameter"); + g_free (prop_name); + continue; + } + + if (strcmp (prop_name, "id") == 0 + || strcmp (prop_name, "cookie") == 0) { + g_debug ("Skipping restricted parameter: %s", prop_name); + g_free (prop_name); + continue; + } + + data_copy = g_boxed_copy (CK_TYPE_PARAMETER_STRUCT, data); + + /* takes ownership */ + g_hash_table_insert (leader->priv->override_parameters, + prop_name, + data_copy); + } + } +} + typedef struct { CkSessionLeader *leader; CkSessionLeaderDoneFunc done_cb; @@ -284,7 +370,7 @@ job_completed (CkJob *job, ck_job_get_stdout (job, &output); g_debug ("Job output: %s", output); - parameters = parse_output (output); + parameters = parse_output (data->leader, output); g_free (output); data->done_cb (data->leader, @@ -448,6 +534,21 @@ ck_session_leader_set_service_name (CkSessionLeader *session_leader, session_leader->priv->service_name = g_strdup (service_name); } +void +ck_session_leader_set_override_parameters (CkSessionLeader *session_leader, + const GPtrArray *parameters) +{ + g_return_if_fail (CK_IS_SESSION_LEADER (session_leader)); + + if (session_leader->priv->override_parameters != NULL) { + g_hash_table_remove_all (session_leader->priv->override_parameters); + } + + if (parameters != NULL) { + save_parameters (session_leader, parameters); + } +} + static void ck_session_leader_set_property (GObject *object, guint prop_id, @@ -513,9 +614,20 @@ ck_session_leader_class_init (CkSessionLeaderClass *klass) } static void +parameter_free (gpointer data) +{ + g_boxed_free (CK_TYPE_PARAMETER_STRUCT, data); +} + +static void ck_session_leader_init (CkSessionLeader *session_leader) { session_leader->priv = CK_SESSION_LEADER_GET_PRIVATE (session_leader); + + session_leader->priv->override_parameters = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + (GDestroyNotify)parameter_free); } static void @@ -537,6 +649,8 @@ ck_session_leader_finalize (GObject *object) g_free (session_leader->priv->service_name); session_leader->priv->service_name = NULL; + g_hash_table_destroy (session_leader->priv->override_parameters); + G_OBJECT_CLASS (ck_session_leader_parent_class)->finalize (object); } diff --git a/src/ck-session-leader.h b/src/ck-session-leader.h index 4eb8857..ff17644 100644 --- a/src/ck-session-leader.h +++ b/src/ck-session-leader.h @@ -60,36 +60,39 @@ typedef void (* CkSessionLeaderDoneFunc) (CkSessionLeader *session_leader DBusGMethodInvocation *context, gpointer data); -GQuark ck_session_leader_error_quark (void); -GType ck_session_leader_get_type (void); -CkSessionLeader * ck_session_leader_new (void); - -void ck_session_leader_set_pid (CkSessionLeader *session_leader, - pid_t pid); -void ck_session_leader_set_uid (CkSessionLeader *session_leader, - uid_t uid); -void ck_session_leader_set_session_id (CkSessionLeader *session_leader, - const char *session_id); -void ck_session_leader_set_cookie (CkSessionLeader *session_leader, - const char *cookie); -void ck_session_leader_set_service_name (CkSessionLeader *session_leader, - const char *sender); - -const char * ck_session_leader_peek_session_id (CkSessionLeader *session_leader); -const char * ck_session_leader_peek_cookie (CkSessionLeader *session_leader); -const char * ck_session_leader_peek_service_name (CkSessionLeader *session_leader); -uid_t ck_session_leader_get_uid (CkSessionLeader *session_leader); -pid_t ck_session_leader_get_pid (CkSessionLeader *session_leader); - - -gboolean ck_session_leader_collect_parameters (CkSessionLeader *session_leader, - DBusGMethodInvocation *context, - CkSessionLeaderDoneFunc done_cb, - gpointer data); -void ck_session_leader_cancel (CkSessionLeader *session_leader); - -void ck_session_leader_dump (CkSessionLeader *session_leader, - GKeyFile *key_file); +GQuark ck_session_leader_error_quark (void); +GType ck_session_leader_get_type (void); +CkSessionLeader * ck_session_leader_new (void); + +void ck_session_leader_set_pid (CkSessionLeader *session_leader, + pid_t pid); +void ck_session_leader_set_uid (CkSessionLeader *session_leader, + uid_t uid); +void ck_session_leader_set_session_id (CkSessionLeader *session_leader, + const char *session_id); +void ck_session_leader_set_cookie (CkSessionLeader *session_leader, + const char *cookie); +void ck_session_leader_set_service_name (CkSessionLeader *session_leader, + const char *sender); + +void ck_session_leader_set_override_parameters (CkSessionLeader *session_leader, + const GPtrArray *parameters); + +const char * ck_session_leader_peek_session_id (CkSessionLeader *session_leader); +const char * ck_session_leader_peek_cookie (CkSessionLeader *session_leader); +const char * ck_session_leader_peek_service_name (CkSessionLeader *session_leader); +uid_t ck_session_leader_get_uid (CkSessionLeader *session_leader); +pid_t ck_session_leader_get_pid (CkSessionLeader *session_leader); + + +gboolean ck_session_leader_collect_parameters (CkSessionLeader *session_leader, + DBusGMethodInvocation *context, + CkSessionLeaderDoneFunc done_cb, + gpointer data); +void ck_session_leader_cancel (CkSessionLeader *session_leader); + +void ck_session_leader_dump (CkSessionLeader *session_leader, + GKeyFile *key_file); G_END_DECLS diff --git a/src/ck-vt-monitor.c b/src/ck-vt-monitor.c index d21026b..17b8299 100644 --- a/src/ck-vt-monitor.c +++ b/src/ck-vt-monitor.c @@ -313,7 +313,6 @@ vt_thread_start (ThreadData *data) { CkVtMonitor *vt_monitor; gboolean res; - int ret; gint32 num; vt_monitor = data->vt_monitor; |