101
103
UDisksCrypttabEntry *entry,
102
104
gpointer user_data);
106
static void on_etc_udisks2_dir_monitor_changed (GFileMonitor *monitor,
109
GFileMonitorEvent event_type,
104
112
G_DEFINE_TYPE (UDisksLinuxProvider, udisks_linux_provider, UDISKS_TYPE_PROVIDER);
112
120
daemon = udisks_provider_get_daemon (UDISKS_PROVIDER (provider));
122
if (provider->etc_udisks2_dir_monitor != NULL)
124
g_signal_handlers_disconnect_by_func (provider->etc_udisks2_dir_monitor,
125
G_CALLBACK (on_etc_udisks2_dir_monitor_changed),
127
g_object_unref (provider->etc_udisks2_dir_monitor);
114
130
g_hash_table_unref (provider->sysfs_to_block);
115
131
g_hash_table_unref (provider->vpd_to_drive);
116
132
g_hash_table_unref (provider->sysfs_path_to_drive);
154
170
udisks_linux_provider_init (UDisksLinuxProvider *provider)
156
172
const gchar *subsystems[] = {"block", "iscsi_connection", "scsi", NULL};
174
GError *error = NULL;
158
176
/* get ourselves an udev client */
159
177
provider->gudev_client = g_udev_client_new (subsystems);
162
180
G_CALLBACK (on_uevent),
183
file = g_file_new_for_path (PACKAGE_SYSCONF_DIR "/udisks2");
184
provider->etc_udisks2_dir_monitor = g_file_monitor_directory (file,
188
if (provider->etc_udisks2_dir_monitor != NULL)
190
g_signal_connect (provider->etc_udisks2_dir_monitor,
192
G_CALLBACK (on_etc_udisks2_dir_monitor_changed),
197
udisks_warning ("Error monitoring directory %s: %s (%s, %d)",
198
PACKAGE_SYSCONF_DIR "/udisks2",
199
error->message, g_quark_to_string (error->domain), error->code);
200
g_clear_error (&error);
202
g_object_unref (file);
207
update_drive_with_id (UDisksLinuxProvider *provider,
211
UDisksLinuxDriveObject *drive_object;
213
/* TODO: could have a GHashTable from id to UDisksLinuxDriveObject */
214
g_hash_table_iter_init (&iter, provider->sysfs_path_to_drive);
215
while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &drive_object))
217
UDisksDrive *drive = udisks_object_get_drive (UDISKS_OBJECT (drive_object));
220
if (g_strcmp0 (udisks_drive_get_id (drive), id) == 0)
222
//udisks_debug ("synthesizing change event on drive with id %s", id);
223
udisks_linux_drive_object_uevent (drive_object, "change", NULL);
225
g_object_unref (drive);
231
on_etc_udisks2_dir_monitor_changed (GFileMonitor *monitor,
234
GFileMonitorEvent event_type,
237
UDisksLinuxProvider *provider = UDISKS_LINUX_PROVIDER (user_data);
239
if (event_type == G_FILE_MONITOR_EVENT_CREATED ||
240
event_type == G_FILE_MONITOR_EVENT_DELETED ||
241
event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT)
243
gchar *filename = g_file_get_basename (file);
244
if (g_str_has_suffix (filename, ".conf"))
247
id = g_strndup (filename, strlen (filename) - strlen(".conf"));
248
update_drive_with_id (provider, id);
388
477
devices = udisks_linux_drive_object_get_devices (object);
389
478
if (devices == NULL)
392
vpd = g_object_get_data (G_OBJECT (object), "x-vpd");
480
const gchar *existing_vpd;
481
existing_vpd = g_object_get_data (G_OBJECT (object), "x-vpd");
393
482
g_dbus_object_manager_server_unexport (udisks_daemon_get_object_manager (daemon),
394
483
g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
395
g_warn_if_fail (g_hash_table_remove (provider->vpd_to_drive, vpd));
484
g_warn_if_fail (g_hash_table_remove (provider->vpd_to_drive, existing_vpd));
397
486
g_list_foreach (devices, (GFunc) g_object_unref, NULL);
398
487
g_list_free (devices);