From d9fec76b594fccc6eda3ce04a74beae1c8b8c1d2 Mon Sep 17 00:00:00 2001 From: Ondrej Holy Date: Fri, 12 Jul 2024 11:14:10 +0200 Subject: [PATCH] gfile: Add support for x-gvfs-trash mount option Currently, the trash functionality is disabled for system internal mounts. That might be a problem in some cases. The `x-gvfs-notrash` mount option allows disabling the trash functionality for certain mounts. Let's add support for the `x-gvfs-trash` mount option to allow the opposite. See: https://issues.redhat.com/browse/RHEL-46828 --- gio/gfile.c | 7 +++++-- gio/glocalfile.c | 22 +++++++++++++--------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/gio/gfile.c b/gio/gfile.c index 4f9b9c6750..5ac73c03e8 100644 --- a/gio/gfile.c +++ b/gio/gfile.c @@ -4744,10 +4744,13 @@ g_file_delete_finish (GFile *file, * * Sends @file to the "Trashcan", if possible. This is similar to * deleting it, but the user can recover it before emptying the trashcan. - * Not all file systems support trashing, so this call can return the + * Trashing is disabled for system mounts by default (see + * g_unix_mount_is_system_internal()), so this call can return the * %G_IO_ERROR_NOT_SUPPORTED error. Since GLib 2.66, the `x-gvfs-notrash` unix - * mount option can be used to disable g_file_trash() support for certain + * mount option can be used to disable g_file_trash() support for particular * mounts, the %G_IO_ERROR_NOT_SUPPORTED error will be returned in that case. + * Since 2.82, the `x-gvfs-trash` unix mount option can be used to enable + * g_file_trash() support for particular system mounts. * * If @cancellable is not %NULL, then the operation can be cancelled by * triggering the cancellable object from another thread. If the operation diff --git a/gio/glocalfile.c b/gio/glocalfile.c index 7b70c614c6..ac918d25e3 100644 --- a/gio/glocalfile.c +++ b/gio/glocalfile.c @@ -1807,10 +1807,6 @@ ignore_trash_mount (GUnixMountEntry *mount) { GUnixMountPoint *mount_point = NULL; const gchar *mount_options; - gboolean retval = TRUE; - - if (g_unix_mount_is_system_internal (mount)) - return TRUE; mount_options = g_unix_mount_get_options (mount); if (mount_options == NULL) @@ -1819,15 +1815,23 @@ ignore_trash_mount (GUnixMountEntry *mount) NULL); if (mount_point != NULL) mount_options = g_unix_mount_point_get_options (mount_point); + + g_clear_pointer (&mount_point, g_unix_mount_point_free); } - if (mount_options == NULL || - strstr (mount_options, "x-gvfs-notrash") == NULL) - retval = FALSE; + if (mount_options != NULL) + { + if (strstr (mount_options, "x-gvfs-trash") != NULL) + return FALSE; + + if (strstr (mount_options, "x-gvfs-notrash") != NULL) + return TRUE; + } - g_clear_pointer (&mount_point, g_unix_mount_point_free); + if (g_unix_mount_is_system_internal (mount)) + return TRUE; - return retval; + return FALSE; } static gboolean -- GitLab