SOURCES: libexo-teardown-crypto-on-eject.patch (NEW) - encrypted volumes su...
baggins
baggins at pld-linux.org
Fri Oct 24 00:59:11 CEST 2008
Author: baggins Date: Thu Oct 23 22:59:11 2008 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- encrypted volumes support
---- Files affected:
SOURCES:
libexo-teardown-crypto-on-eject.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/libexo-teardown-crypto-on-eject.patch
diff -u /dev/null SOURCES/libexo-teardown-crypto-on-eject.patch:1.1
--- /dev/null Fri Oct 24 00:59:11 2008
+++ SOURCES/libexo-teardown-crypto-on-eject.patch Fri Oct 24 00:59:05 2008
@@ -0,0 +1,135 @@
+Index: exo-mount/exo-mount-hal.c
+===================================================================
+--- exo-mount/exo-mount-hal.c (revision 27040)
++++ exo-mount/exo-mount-hal.c (working copy)
+@@ -547,10 +547,20 @@
+ DBusMessage *message;
+ DBusMessage *result;
+ DBusError derror;
++ const gchar *backing_udi = NULL;
+
+ g_return_val_if_fail (device != NULL, FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
++ /* see if the udi is a crypto fs, in which case we'll have to tear down the crypto layer. */
++ backing_udi = libhal_volume_crypto_get_backing_volume_udi(device->volume);
++
++ if (backing_udi)
++ {
++ /* never eject a LUKS-encrypted device */
++ return exo_mount_hal_device_unmount(device, error);
++ }
++
+ /* allocate the D-Bus message for the "Eject" method */
+ message = dbus_message_new_method_call ("org.freedesktop.Hal", device->udi, "org.freedesktop.Hal.Device.Volume", "Eject");
+ if (G_UNLIKELY (message == NULL))
+@@ -873,8 +883,73 @@
+ }
+
+
++static gboolean
++exo_mount_teardown_crypto_volume(const gchar *udi, GError **error)
++{
++ DBusMessage *message = NULL;
++ DBusMessage *result = NULL;
++ DBusError derror;
+
++ message = dbus_message_new_method_call ("org.freedesktop.Hal", udi,
++ "org.freedesktop.Hal.Device.Volume.Crypto",
++ "Teardown");
+
++ if (G_UNLIKELY (message == NULL))
++ {
++ /* out of memory */
++oom: g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM, g_strerror (ENOMEM));
++ return FALSE;
++ }
++
++ if (!dbus_message_append_args (message,
++ DBUS_TYPE_INVALID)) {
++ dbus_message_unref (message);
++ goto oom;
++ }
++
++ dbus_error_init (&derror);
++
++ result = dbus_connection_send_with_reply_and_block (dbus_connection, message, -1, &derror);
++ if (G_LIKELY (result != NULL))
++ {
++ /* check if an error was returned */
++ if (dbus_message_get_type (result) == DBUS_MESSAGE_TYPE_ERROR)
++ dbus_set_error_from_message (&derror, result);
++
++ /* release the result */
++ dbus_message_unref (result);
++ }
++
++ /* release the message */
++ dbus_message_unref (message);
++
++ if (G_UNLIKELY (dbus_error_is_set (&derror)))
++ {
++ /* try to translate the error appropriately */
++ if (strcmp (derror.name, "org.freedesktop.Hal.Device.Volume.PermissionDenied") == 0)
++ {
++ /* TRANSLATORS: The user tried to eject a device although he's not privileged to do so. */
++ g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("You are not privileged to teardown the crypto layer"));
++ }
++ else if (strcmp (derror.name, "org.freedesktop.Hal.Device.Volume.Busy") == 0)
++ {
++ /* TRANSLATORS: An application is blocking a mounted volume from being ejected. */
++ g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, _("An application is preventing the crypto layer from being torn down"));
++ }
++ else
++ {
++ /* no precise error message, use the HAL one */
++ exo_mount_hal_propagate_error (error, &derror);
++ }
++
++ /* release the DBus error */
++ dbus_error_free (&derror);
++ return FALSE;
++ }
++ return TRUE;
++}
++
++
+ /**
+ * exo_mount_hal_device_unmount:
+ * @device : an #ExoMountHalDevice.
+@@ -894,10 +969,14 @@
+ DBusMessage *message;
+ DBusMessage *result;
+ DBusError derror;
++ const gchar *backing_udi = NULL;
+
+ g_return_val_if_fail (device != NULL, FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
++ /* see if the udi is a crypto fs, in which case we'll have to teardown the crypto layer. */
++ backing_udi = libhal_volume_crypto_get_backing_volume_udi(device->volume);
++
+ /* allocate the D-Bus message for the "Unmount" method */
+ message = dbus_message_new_method_call ("org.freedesktop.Hal", device->udi, "org.freedesktop.Hal.Device.Volume", "Unmount");
+ if (G_UNLIKELY (message == NULL))
+@@ -955,7 +1034,7 @@
+ {
+ /* Ups, volume not mounted, we succeed! */
+ dbus_error_free (&derror);
+- return TRUE;
++ goto finish;
+ }
+ else
+ {
+@@ -968,6 +1047,11 @@
+ return FALSE;
+ }
+
++finish:
++ if (G_UNLIKELY(backing_udi != NULL))
++ {
++ return exo_mount_teardown_crypto_volume(backing_udi, error);
++ }
+ return TRUE;
+ }
+
================================================================
More information about the pld-cvs-commit
mailing list