From 4ce0ed4b826b351f1f25918c3c3f16cdcf187699 Mon Sep 17 00:00:00 2001 From: dakkar Date: Mon, 24 Oct 2011 21:24:00 +0100 Subject: make it work with optical drives and other things that change their "media available" bit instead of being added / removed --- hal-automounter.pl | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/hal-automounter.pl b/hal-automounter.pl index b26f998..d8c8b4e 100755 --- a/hal-automounter.pl +++ b/hal-automounter.pl @@ -106,15 +106,16 @@ sub safe_get_property { } sub device_added { - my $dev=$udisks->get_object($_[0],'org.freedesktop.UDisks.Device'); + my ($node,$dev) = @_; + $dev ||= $udisks->get_object($node,'org.freedesktop.UDisks.Device'); 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'); - return if exists $mounted{$_[0]}; + return if exists $mounted{$node}; my $uuid=safe_get_property($dev,'IdUuid'); my $dev_path=safe_get_property($dev,'DeviceFile') @@ -122,7 +123,7 @@ sub device_added { || 'unknown'; if ($dev_path eq 'unknown') { - warn "unknown path for $_[0]\n"; + warn "unknown path for $node\n"; return; } @@ -142,7 +143,7 @@ sub device_added { $mountpoint=$manual_mountpoint if defined $manual_mountpoint; - $mounted{$_[0]}=$mountpoint; + $mounted{$node}=$mountpoint; mkdir $mountpoint; chown -1,scalar(getgrnam('plugdev')),$mountpoint; chmod 0775,$mountpoint; @@ -151,23 +152,39 @@ sub device_added { } sub device_removed { - if (exists $mounted{$_[0]}) { - system('umount',$mounted{$_[0]}); - if (remove_from_fstab($mounted{$_[0]})) { - rmdir $mounted{$_[0]}; + my ($node,$dev) = @_; + + if (exists $mounted{$node}) { + system('umount',$mounted{$node}); + if (remove_from_fstab($mounted{$node})) { + rmdir $mounted{$node}; } - delete $mounted{$_[0]}; + delete $mounted{$node}; } 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'); $manager->connect_to_signal('DeviceAdded',\&device_added); -$manager->connect_to_signal('DeviceChanged',\&device_added); +$manager->connect_to_signal('DeviceChanged',\&device_changed); $manager->connect_to_signal('DeviceRemoved',\&device_removed); $reactor->run(); -- cgit v1.2.3