From d9fec76b594fccc6eda3ce04a74beae1c8b8c1d2 Mon Sep 17 00:00:00 2001
From: Ondrej Holy <oholy@redhat.com>
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