mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-03 01:36:17 +01:00
gio-tool: Hold GVolumeMonitor reference during operations
Releasing GVolumeMonitor before g_volume_mount finish cause that g_volume_get_mount returns NULL, because the mount is not correctly propagated to the volume. https://gitlab.gnome.org/GNOME/glib/issues/1458
This commit is contained in:
parent
9b6b282e0a
commit
88b8ebb5dd
@ -39,6 +39,7 @@ typedef enum {
|
|||||||
|
|
||||||
static int outstanding_mounts = 0;
|
static int outstanding_mounts = 0;
|
||||||
static GMainLoop *main_loop;
|
static GMainLoop *main_loop;
|
||||||
|
static GVolumeMonitor *volume_monitor;
|
||||||
|
|
||||||
static gboolean mount_mountable = FALSE;
|
static gboolean mount_mountable = FALSE;
|
||||||
static gboolean mount_unmount = FALSE;
|
static gboolean mount_unmount = FALSE;
|
||||||
@ -484,12 +485,9 @@ stop_with_device_file_cb (GObject *object,
|
|||||||
static void
|
static void
|
||||||
stop_with_device_file (const char *device_file)
|
stop_with_device_file (const char *device_file)
|
||||||
{
|
{
|
||||||
GVolumeMonitor *volume_monitor;
|
|
||||||
GList *drives;
|
GList *drives;
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
volume_monitor = g_volume_monitor_get ();
|
|
||||||
|
|
||||||
drives = g_volume_monitor_get_connected_drives (volume_monitor);
|
drives = g_volume_monitor_get_connected_drives (volume_monitor);
|
||||||
for (l = drives; l != NULL; l = l->next)
|
for (l = drives; l != NULL; l = l->next)
|
||||||
{
|
{
|
||||||
@ -524,8 +522,6 @@ stop_with_device_file (const char *device_file)
|
|||||||
print_error ("%s: %s", device_file, _("No drive for device file"));
|
print_error ("%s: %s", device_file, _("No drive for device file"));
|
||||||
success = FALSE;
|
success = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref (volume_monitor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -905,11 +901,8 @@ list_drives (GList *drives,
|
|||||||
static void
|
static void
|
||||||
list_monitor_items (void)
|
list_monitor_items (void)
|
||||||
{
|
{
|
||||||
GVolumeMonitor *volume_monitor;
|
|
||||||
GList *drives, *volumes, *mounts;
|
GList *drives, *volumes, *mounts;
|
||||||
|
|
||||||
volume_monitor = g_volume_monitor_get();
|
|
||||||
|
|
||||||
/* populate gvfs network mounts */
|
/* populate gvfs network mounts */
|
||||||
iterate_gmain();
|
iterate_gmain();
|
||||||
|
|
||||||
@ -924,19 +917,14 @@ list_monitor_items (void)
|
|||||||
mounts = g_volume_monitor_get_mounts (volume_monitor);
|
mounts = g_volume_monitor_get_mounts (volume_monitor);
|
||||||
list_mounts (mounts, 0, TRUE);
|
list_mounts (mounts, 0, TRUE);
|
||||||
g_list_free_full (mounts, g_object_unref);
|
g_list_free_full (mounts, g_object_unref);
|
||||||
|
|
||||||
g_object_unref (volume_monitor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unmount_all_with_scheme (const char *scheme)
|
unmount_all_with_scheme (const char *scheme)
|
||||||
{
|
{
|
||||||
GVolumeMonitor *volume_monitor;
|
|
||||||
GList *mounts;
|
GList *mounts;
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
volume_monitor = g_volume_monitor_get();
|
|
||||||
|
|
||||||
/* populate gvfs network mounts */
|
/* populate gvfs network mounts */
|
||||||
iterate_gmain();
|
iterate_gmain();
|
||||||
|
|
||||||
@ -952,8 +940,6 @@ unmount_all_with_scheme (const char *scheme)
|
|||||||
g_object_unref (root);
|
g_object_unref (root);
|
||||||
}
|
}
|
||||||
g_list_free_full (mounts, g_object_unref);
|
g_list_free_full (mounts, g_object_unref);
|
||||||
|
|
||||||
g_object_unref (volume_monitor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1004,12 +990,9 @@ mount_with_device_file_cb (GObject *object,
|
|||||||
static void
|
static void
|
||||||
mount_with_device_file (const char *device_file)
|
mount_with_device_file (const char *device_file)
|
||||||
{
|
{
|
||||||
GVolumeMonitor *volume_monitor;
|
|
||||||
GList *volumes;
|
GList *volumes;
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
volume_monitor = g_volume_monitor_get();
|
|
||||||
|
|
||||||
volumes = g_volume_monitor_get_volumes (volume_monitor);
|
volumes = g_volume_monitor_get_volumes (volume_monitor);
|
||||||
for (l = volumes; l != NULL; l = l->next)
|
for (l = volumes; l != NULL; l = l->next)
|
||||||
{
|
{
|
||||||
@ -1044,8 +1027,6 @@ mount_with_device_file (const char *device_file)
|
|||||||
print_error ("%s: %s", device_file, _("No volume for device file"));
|
print_error ("%s: %s", device_file, _("No volume for device file"));
|
||||||
success = FALSE;
|
success = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref (volume_monitor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1199,10 +1180,6 @@ monitor_drive_eject_button (GVolumeMonitor *volume_monitor, GDrive *drive)
|
|||||||
static void
|
static void
|
||||||
monitor (void)
|
monitor (void)
|
||||||
{
|
{
|
||||||
GVolumeMonitor *volume_monitor;
|
|
||||||
|
|
||||||
volume_monitor = g_volume_monitor_get ();
|
|
||||||
|
|
||||||
g_signal_connect (volume_monitor, "mount-added", (GCallback) monitor_mount_added, NULL);
|
g_signal_connect (volume_monitor, "mount-added", (GCallback) monitor_mount_added, NULL);
|
||||||
g_signal_connect (volume_monitor, "mount-removed", (GCallback) monitor_mount_removed, NULL);
|
g_signal_connect (volume_monitor, "mount-removed", (GCallback) monitor_mount_removed, NULL);
|
||||||
g_signal_connect (volume_monitor, "mount-changed", (GCallback) monitor_mount_changed, NULL);
|
g_signal_connect (volume_monitor, "mount-changed", (GCallback) monitor_mount_changed, NULL);
|
||||||
@ -1255,6 +1232,7 @@ handle_mount (int argc, char *argv[], gboolean do_help)
|
|||||||
}
|
}
|
||||||
|
|
||||||
main_loop = g_main_loop_new (NULL, FALSE);
|
main_loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
volume_monitor = g_volume_monitor_get ();
|
||||||
|
|
||||||
if (mount_list)
|
if (mount_list)
|
||||||
list_monitor_items ();
|
list_monitor_items ();
|
||||||
@ -1284,6 +1262,7 @@ handle_mount (int argc, char *argv[], gboolean do_help)
|
|||||||
{
|
{
|
||||||
show_help (context, _("No locations given"));
|
show_help (context, _("No locations given"));
|
||||||
g_option_context_free (context);
|
g_option_context_free (context);
|
||||||
|
g_object_unref (volume_monitor);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1292,5 +1271,7 @@ handle_mount (int argc, char *argv[], gboolean do_help)
|
|||||||
if (outstanding_mounts > 0)
|
if (outstanding_mounts > 0)
|
||||||
g_main_loop_run (main_loop);
|
g_main_loop_run (main_loop);
|
||||||
|
|
||||||
|
g_object_unref (volume_monitor);
|
||||||
|
|
||||||
return success ? 0 : 2;
|
return success ? 0 : 2;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user