~ubuntu-branches/ubuntu/trusty/udisks2/trusty-proposed

« back to all changes in this revision

Viewing changes to src/udiskslinuxprovider.c

  • Committer: Package Import Robot
  • Author(s): Martin Pitt
  • Date: 2012-07-28 13:35:04 UTC
  • mfrom: (1.1.2)
  • Revision ID: package-import@ubuntu.com-20120728133504-jmxgy789jegi5vmo
Tags: 1.99.0-1
* New upstream release (LP: #1030268)
  - Support Realtek rts5229 SD/MMC card readers. (LP: #1022497)
* Drop 00git_no_polkit_fallback.patch, upstream now.
* Drop debian/local/integration-test, shipped in upstream tarball now.
* debian/tests/upstream-system: Run test suite from upstream source.
* debian/tests/control: Simplify Depends: line using "@".
* debian/tests/control: Drop undefined "no-build-needed" feature.

Show diffs side-by-side

added added

removed removed

Lines of Context:
64
64
  GHashTable *vpd_to_drive;
65
65
  GHashTable *sysfs_path_to_drive;
66
66
 
 
67
  GFileMonitor *etc_udisks2_dir_monitor;
 
68
 
67
69
  /* set to TRUE only in the coldplug phase */
68
70
  gboolean coldplug;
69
71
 
101
103
                                               UDisksCrypttabEntry   *entry,
102
104
                                               gpointer               user_data);
103
105
 
 
106
static void on_etc_udisks2_dir_monitor_changed (GFileMonitor     *monitor,
 
107
                                                GFile            *file,
 
108
                                                GFile            *other_file,
 
109
                                                GFileMonitorEvent event_type,
 
110
                                                gpointer          user_data);
 
111
 
104
112
G_DEFINE_TYPE (UDisksLinuxProvider, udisks_linux_provider, UDISKS_TYPE_PROVIDER);
105
113
 
106
114
static void
111
119
 
112
120
  daemon = udisks_provider_get_daemon (UDISKS_PROVIDER (provider));
113
121
 
 
122
  if (provider->etc_udisks2_dir_monitor != NULL)
 
123
    {
 
124
      g_signal_handlers_disconnect_by_func (provider->etc_udisks2_dir_monitor,
 
125
                                            G_CALLBACK (on_etc_udisks2_dir_monitor_changed),
 
126
                                            provider);
 
127
      g_object_unref (provider->etc_udisks2_dir_monitor);
 
128
    }
 
129
 
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)
155
171
{
156
172
  const gchar *subsystems[] = {"block", "iscsi_connection", "scsi", NULL};
 
173
  GFile *file;
 
174
  GError *error = NULL;
157
175
 
158
176
  /* get ourselves an udev client */
159
177
  provider->gudev_client = g_udev_client_new (subsystems);
161
179
                    "uevent",
162
180
                    G_CALLBACK (on_uevent),
163
181
                    provider);
 
182
 
 
183
  file = g_file_new_for_path (PACKAGE_SYSCONF_DIR "/udisks2");
 
184
  provider->etc_udisks2_dir_monitor = g_file_monitor_directory (file,
 
185
                                                                G_FILE_MONITOR_NONE,
 
186
                                                                NULL,
 
187
                                                                &error);
 
188
  if (provider->etc_udisks2_dir_monitor != NULL)
 
189
    {
 
190
      g_signal_connect (provider->etc_udisks2_dir_monitor,
 
191
                        "changed",
 
192
                        G_CALLBACK (on_etc_udisks2_dir_monitor_changed),
 
193
                        provider);
 
194
    }
 
195
  else
 
196
    {
 
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);
 
201
    }
 
202
  g_object_unref (file);
 
203
 
 
204
}
 
205
 
 
206
static void
 
207
update_drive_with_id (UDisksLinuxProvider *provider,
 
208
                      const gchar         *id)
 
209
{
 
210
  GHashTableIter iter;
 
211
  UDisksLinuxDriveObject *drive_object;
 
212
 
 
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))
 
216
    {
 
217
      UDisksDrive *drive = udisks_object_get_drive (UDISKS_OBJECT (drive_object));
 
218
      if (drive != NULL)
 
219
        {
 
220
          if (g_strcmp0 (udisks_drive_get_id (drive), id) == 0)
 
221
            {
 
222
              //udisks_debug ("synthesizing change event on drive with id %s", id);
 
223
              udisks_linux_drive_object_uevent (drive_object, "change", NULL);
 
224
            }
 
225
          g_object_unref (drive);
 
226
        }
 
227
    }
 
228
}
 
229
 
 
230
static void
 
231
on_etc_udisks2_dir_monitor_changed (GFileMonitor     *monitor,
 
232
                                    GFile            *file,
 
233
                                    GFile            *other_file,
 
234
                                    GFileMonitorEvent event_type,
 
235
                                    gpointer          user_data)
 
236
{
 
237
  UDisksLinuxProvider *provider = UDISKS_LINUX_PROVIDER (user_data);
 
238
 
 
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)
 
242
    {
 
243
      gchar *filename = g_file_get_basename (file);
 
244
      if (g_str_has_suffix (filename, ".conf"))
 
245
        {
 
246
          gchar *id;
 
247
          id = g_strndup (filename, strlen (filename) - strlen(".conf"));
 
248
          update_drive_with_id (provider, id);
 
249
          g_free (id);
 
250
        }
 
251
      g_free (filename);
 
252
    }
164
253
}
165
254
 
166
255
static guint
388
477
          devices = udisks_linux_drive_object_get_devices (object);
389
478
          if (devices == NULL)
390
479
            {
391
 
              const gchar *vpd;
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));
396
485
            }
397
486
          g_list_foreach (devices, (GFunc) g_object_unref, NULL);
398
487
          g_list_free (devices);