static void add_config_file (const gchar *path, GHashTable *group_name_to_key_file_data, GList **key_files_to_free) { GKeyFile *key_file; GError *error; key_file = g_key_file_new (); error = NULL; if (!g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error)) { if (!(error->domain == G_FILE_ERROR && error->code == G_FILE_ERROR_NOENT)) { goa_warning ("Error loading %s: %s (%s, %d)", path, error->message, g_quark_to_string (error->domain), error->code); } g_error_free (error); g_key_file_free (key_file); } else { gchar **groups; gsize num_groups; guint n; groups = g_key_file_get_groups (key_file, &num_groups); for (n = 0; n < num_groups; n++) { if (g_str_has_prefix (groups[n], "Account ")) { g_hash_table_insert (group_name_to_key_file_data, groups[n], /* steals string */ key_file_data_new (key_file, path)); } else { goa_warning ("Unexpected group \"%s\" in file %s", groups[n], path); g_free (groups[n]); } } g_free (groups); *key_files_to_free = g_list_prepend (*key_files_to_free, key_file); } }
static void add_config_file (GoaDaemon *daemon, const gchar *path, GHashTable *group_name_to_key_file_data, GList **key_files_to_free) { GKeyFile *key_file; GError *error; key_file = g_key_file_new (); error = NULL; if (!g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error)) { if (!(error->domain == G_FILE_ERROR && error->code == G_FILE_ERROR_NOENT)) { g_warning ("Error loading %s: %s (%s, %d)", path, error->message, g_quark_to_string (error->domain), error->code); } g_error_free (error); g_key_file_free (key_file); } else { gchar **groups; const char *guid; gsize num_groups; guint n; guid = g_dbus_connection_get_guid (daemon->connection); groups = g_key_file_get_groups (key_file, &num_groups); for (n = 0; n < num_groups; n++) { if (g_str_has_prefix (groups[n], "Account ")) { gboolean is_temporary; char *session_id; is_temporary = g_key_file_get_boolean (key_file, groups[n], "IsTemporary", NULL); if (is_temporary) { session_id = g_key_file_get_string (key_file, groups[n], "SessionId", NULL); /* discard temporary accounts from older sessions */ if (session_id != NULL && g_strcmp0 (session_id, guid) != 0) { g_debug ("ignoring account \"%s\" in file %s because it's stale", groups[n], path); g_free (groups[n]); g_free (session_id); continue; } g_free (session_id); } else { g_key_file_remove_key (key_file, groups[n], "SessionId", NULL); } g_hash_table_insert (group_name_to_key_file_data, groups[n], /* steals string */ key_file_data_new (key_file, path)); } else { g_warning ("Unexpected group \"%s\" in file %s", groups[n], path); g_free (groups[n]); } } g_free (groups); *key_files_to_free = g_list_prepend (*key_files_to_free, key_file); } }