$OpenBSD: patch-gio_gunixmount_c,v 1.20 2020/11/01 08:21:04 ajacoutot Exp $

https://bugzilla.gnome.org/show_bug.cgi?id=653555

Index: gio/gunixmount.c
--- gio/gunixmount.c.orig
+++ gio/gunixmount.c
@@ -27,6 +27,10 @@
 #include <sys/wait.h>
 #include <unistd.h>
 
+#ifdef __OpenBSD__
+#include <glib/gstdio.h> /* g_access */
+#endif
+
 #include <glib.h>
 #include "gsubprocess.h"
 #include "gioenums.h"
@@ -332,12 +336,35 @@ g_unix_mount_unmount (GMount             *mount,
                       gpointer             user_data)
 {
   GUnixMount *unix_mount = G_UNIX_MOUNT (mount);
+
+#ifdef __OpenBSD__
+  char *mntbase, *pkexec;
+  char *argv[] = {"umount", NULL, NULL, NULL};
+  mntbase = g_path_get_dirname (unix_mount->mount_path);
+  if ((getuid() != 0) &&
+      ((pkexec = g_find_program_in_path ("pkexec")) != NULL) &&
+      (g_access (mntbase, X_OK) != -1))
+    {
+      argv[0] = pkexec;
+      argv[1] = "/sbin/umount";
+      argv[2] = unix_mount->mount_path;
+    }
+  else
+    {
+      if (unix_mount->mount_path != NULL)
+        argv[1] = unix_mount->mount_path;
+      else
+        argv[1] = unix_mount->device_path;
+    }
+  g_free (mntbase);
+#else
   char *argv[] = {"umount", NULL, NULL};
 
   if (unix_mount->mount_path != NULL)
     argv[1] = unix_mount->mount_path;
   else
     argv[1] = unix_mount->device_path;
+#endif
 
   eject_unmount_do (mount, cancellable, callback, user_data, argv, "[gio] unmount mount");
 }
@@ -358,12 +385,29 @@ g_unix_mount_eject (GMount             *mount,
                     gpointer             user_data)
 {
   GUnixMount *unix_mount = G_UNIX_MOUNT (mount);
+#ifdef __OpenBSD__
+  char *mntbase, *pkexec;
+  char *argv[] = {"eject", NULL, NULL, NULL};
+  mntbase = g_path_get_dirname (unix_mount->mount_path);
+  /* eject(1) on OpenBSD does not try to unmount first and requires a device */
+  g_unix_mount_unmount (mount, flags, cancellable, NULL, user_data);
+  if ((getuid() != 0) &&
+      ((pkexec = g_find_program_in_path ("pkexec")) != NULL) &&
+      (g_access (mntbase, X_OK) != -1))
+    {
+      argv[0] = pkexec;
+      argv[1] = "/bin/eject";
+      argv[2] = unix_mount->device_path;
+    }
+  g_free (mntbase);
+#else
   char *argv[] = {"eject", NULL, NULL};
 
   if (unix_mount->mount_path != NULL)
     argv[1] = unix_mount->mount_path;
   else
     argv[1] = unix_mount->device_path;
+#endif
 
   eject_unmount_do (mount, cancellable, callback, user_data, argv, "[gio] eject mount");
 }
