diff options
author | Gianni Ceccarelli <gianni.ceccarelli@broadbean.com> | 2017-04-25 17:04:17 +0100 |
---|---|---|
committer | Gianni Ceccarelli <gianni.ceccarelli@broadbean.com> | 2017-04-25 17:04:17 +0100 |
commit | 234dceb44d076b033fc456a5235a1ec1e76dcf6a (patch) | |
tree | de09670c6cb8c1e3de95263aa0fe7adf35caec2c | |
parent | brewed perl lib (diff) | |
parent | made it use UDisks2 instead of the old UDisks (diff) | |
download | hal-automounter-234dceb44d076b033fc456a5235a1ec1e76dcf6a.tar.gz hal-automounter-234dceb44d076b033fc456a5235a1ec1e76dcf6a.tar.bz2 hal-automounter-234dceb44d076b033fc456a5235a1ec1e76dcf6a.zip |
Merge branch 'udisks2'
-rwxr-xr-x | hal-automounter.pl | 65 |
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 |