summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xhal-automounter.pl65
1 files changed, 25 insertions, 40 deletions
diff --git a/hal-automounter.pl b/hal-automounter.pl
index f5a373d..55a49ea 100755
--- a/hal-automounter.pl
+++ b/hal-automounter.pl
@@ -84,9 +84,6 @@ sub remove_from_fstab {
}
}
-my $bus=Net::DBus->system();
-my $udisks=$bus->get_service('org.freedesktop.UDisks');
-
my %mounted;
sub sanitize {
@@ -98,28 +95,30 @@ sub sanitize {
return $path;
}
-sub safe_get_property {
- my ($dev,$prop)=@_;
+sub str_from_bytearray {
+ my ($aref) = @_;
+
+ return $aref unless ref($aref);
- local $@;
- return eval { $dev->$prop };
+ return pack 'C*',@{$aref||[]};
}
sub device_added {
- my ($node,$dev) = @_;
+ my ($node,$interfaces_and_properties) = @_;
- $dev ||= $udisks->get_object($node,'org.freedesktop.UDisks.Device');
+ p @_;
- return unless safe_get_property($dev,'IdUsage') eq 'filesystem';
- #return unless safe_get_property($dev,'DeviceIsRemovable');
- return unless safe_get_property($dev,'DeviceIsMediaAvailable');
- return if safe_get_property($dev,'DeviceIsMounted');
+ my $fs = $interfaces_and_properties->{'org.freedesktop.UDisks2.Filesystem'};
+ return unless $fs;
+ return if @{ $fs->{MountPoints} || [] }; # mounted already
return if exists $mounted{$node};
- my $uuid=safe_get_property($dev,'IdUuid');
- my $dev_path=safe_get_property($dev,'DeviceFile')
- ||($uuid?'/dev/disk/by-uuid/'.$uuid:undef)
+ my $block = $interfaces_and_properties->{'org.freedesktop.UDisks2.Block'};
+
+ my $uuid = str_from_bytearray($block->{IdUuid});
+ my $dev_path= str_from_bytearray($block->{Device})
+ || ($uuid?'/dev/disk/by-uuid/'.$uuid:undef)
|| 'unknown';
if ($dev_path eq 'unknown') {
@@ -127,8 +126,8 @@ sub device_added {
return;
}
- my $label=safe_get_property($dev,'IdLabel');
- my $fstype=safe_get_property($dev,'IdType');
+ my $label = str_from_bytearray($block->{IdLabel});
+ my $fstype = str_from_bytearray($block->{IdType});
return unless defined $fstype;
@@ -152,7 +151,7 @@ sub device_added {
}
sub device_removed {
- my ($node,$dev) = @_;
+ my ($node,$interfaces) = @_;
if (exists $mounted{$node}) {
system('umount',$mounted{$node});
@@ -164,28 +163,14 @@ sub device_removed {
return;
}
-sub device_changed {
- my ($node) = @_;
-
- my $dev=$udisks->get_object($node,'org.freedesktop.UDisks.Device');
- my $has_media = safe_get_property($dev,'DeviceIsMediaAvailable');
-
- if ($has_media) {
- device_added($node,$dev);
- }
- else {
- device_removed($node,$dev);
- }
-}
-
my $reactor=Net::DBus::Reactor->main();
-my $manager = $udisks->get_object('/org/freedesktop/UDisks',
- 'org.freedesktop.UDisks');
+my $bus=Net::DBus->system();
+my $udisks=$bus->get_service('org.freedesktop.UDisks2');
+my $manager = $udisks->get_object('/org/freedesktop/UDisks2');
-$manager->connect_to_signal('DeviceAdded',\&device_added);
-$manager->connect_to_signal('DeviceChanged',\&device_changed);
-$manager->connect_to_signal('DeviceRemoved',\&device_removed);
+$manager->connect_to_signal('InterfacesAdded',\&device_added);
+$manager->connect_to_signal('InterfacesRemoved',\&device_removed);
$reactor->run();
@@ -193,7 +178,7 @@ __END__
=head1 NAME
-hal-automounter - a simple UDisks-DBUS client that creates fstab entries for hot-plugged volumes
+hal-automounter - a simple UDisks2-DBUS client that creates fstab entries for hot-plugged volumes
=head1 SYNOPSIS
@@ -205,7 +190,7 @@ Gianni Ceccarelli <dakkar@thenautilus.net>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2012 by Gianni Ceccarelli.
+This software is copyright (c) 2012-2017 by Gianni Ceccarelli.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as