https://bugzilla.gnome.org/show_bug.cgi?id=653555 Index: gio/gunixmount.c --- gio/gunixmount.c.orig +++ gio/gunixmount.c @@ -29,6 +29,10 @@ #include #include +#ifdef __OpenBSD__ +#include /* g_access */ +#endif + #include #include "gsubprocess.h" #include "gioenums.h" @@ -334,12 +338,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"); } @@ -360,12 +387,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"); }