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 /src | |
| parent | e30bc7486fe4e872a7b91f1566bc2c880deb63b7 (diff) | |
always try to detect parameters for session
Treat the parameters passed in via OpenSessionWithParameters
as overrides.
Diffstat (limited to 'src')
| -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;  | 
