The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Build.PL 1250
CREDITS 11
Changes 85129
MANIFEST 34
MANIFEST.SKIP 01
META.json 6839
META.yml 6129
Makefile.PL 27143
README 1032
lib/Sys/Filesystem/Aix.pm 2230
lib/Sys/Filesystem/Cygwin.pm 813
lib/Sys/Filesystem/Darwin.pm 1324
lib/Sys/Filesystem/Dummy.pm 24
lib/Sys/Filesystem/Freebsd.pm 813
lib/Sys/Filesystem/Hpux.pm 69
lib/Sys/Filesystem/Linux.pm 3033
lib/Sys/Filesystem/Mswin32.pm 2122
lib/Sys/Filesystem/Netbsd.pm 1016
lib/Sys/Filesystem/Solaris.pm 1621
lib/Sys/Filesystem/Unix.pm 1531
lib/Sys/Filesystem.pm 113111
t/01_load.t 210
t/02_basic.t 3845
t/03_whereami.t 49
t/04_special.t 110
t/05_error.t 023
t/06_settings.t 064
27 files changed (This is a version diff) 689866
@@ -1,125 +0,0 @@
-# vim:ts=4:sw=4:tw=78
-# $Id$
-
-use 5.006;
-
-use strict;
-use Module::Build;
-use vars qw($build);
-use FindBin;
-use lib $FindBin::Bin . '/lib';
-
-$@ = undef;
-my @fs;
-eval {
-    require Sys::Filesystem;
-    my $fs = Sys::Filesystem->new();
-    @fs = $fs->filesystems();
-};
-if ($@)
-{
-    printf( STDERR "Can't be used ($@) - OS not supported or bad maintained?" );
-    exit(0);
-}
-
-my %prereqs = (
-                'perl'              => '5.008',
-                'Carp'              => 0,
-                'FindBin'           => 0,
-                'IO'                => 0,
-                'IPC::Cmd'          => '0.80',
-                'Module::Pluggable' => '4.5',
-                'Params::Util'      => '1.00',
-                ( $^O eq 'MSWin32' ? ( 'Win32::DriveInfo' => 0, ) : () ),
-              );
-
-$build = Module::Build->new(
-     module_name        => 'Sys::Filesystem',
-     license            => 'apache',
-     dist_author        => 'Jens Rehsack <rehsack@cpan.org>',
-     create_makefile_pl => 'passthrough',
-     create_readme      => 1,
-     create_packlist    => 1,
-     sign               => 0,
-     configure_requires => {
-                             'Module::Build' => '0.2800',
-                             %prereqs,
-                           },
-     requires       => \%prereqs,
-     build_requires => { 'Test::More' => 0.90, },
-     recommends     => {
-                     'perl'                => '5.018001',
-                     'Module::Pluggable'   => '4.8',
-                     'Test::Pod'           => 0,
-                     'Test::Pod::Coverage' => 0,
-                   },
-     meta_merge => { resources => { repository => "https://github.com/rehsack/Sys-Filesystem", }, },
-     test_files => join( ' ' => 't/*.t xt/*.t' ),
-);
-
-$build->create_build_script();
-
-# Send perl and module version information home if we've been given
-# permission to do so by a human being - default to not send for automated
-# testing environments, of if the user does not respond within 20 seconds.
-
-#my $url = $ENV{AUTOMATED_TESTING} ? undef : may_send_version_information();
-#if ($url) {
-#	my @resp = ();
-#	eval {
-#		local $SIG{ALRM} = sub { die; };
-#		alarm 10;
-#		my $ua = LWP::UserAgent->new(
-#				agent => 'Build.PL $Revision: 380 $',
-#				timeout => 9,
-#				max_size => 500,
-#			);
-#		$ua->env_proxy;
-#		my $response = $ua->get($url);
-#		if ($response->is_success()) {
-#			for (split(/\s*\n+\s*/, $response->content())) {
-#				push @resp, $_ if $_;
-#			}
-#		}
-#		alarm 0;
-#	};
-#	print substr($resp[0],0,79) || "Thank you for sending this information.";
-#	print "\n\n";
-#}
-#
-#sub may_send_version_information {
-#	eval {
-#		require Config;
-#		require LWP::UserAgent;
-#	};
-#	return undef if $@;
-#
-#	my $str = sprintf('%s?%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s=%s',
-#			'http://perlgirl.org.uk/lib/usage.cgi',
-#			'name',     $build->dist_name(),
-#			'version',  $build->dist_version(),
-#			'osname',   $Config::Config{osname},
-#			'archname', $Config::Config{archname},
-#			'osver',    $^O,
-#			'perlver',  $]
-#		);
-#
-#	print "\nThank you for downloading ".$build->dist_name()."\n\n";
-#	print "I would like to find out how many people are using this software,\n";
-#	print "and on what operating systems and Perl versions. If you have an\n";
-#	print "internet connection, may I transmit the following information:\n\n";
-#	print "$str\n\n";
-#
-#	my $send = 0;
-#	eval {
-#		local $SIG{ALRM} = sub { die; };
-#		alarm 20;
-#		$send = $build->y_n('Send this anonymous information?','n');
-#		alarm 0;
-#	};
-#
-#	return $send ? $str : undef;
-#}
-
-1;
-
@@ -6,5 +6,5 @@ Ying-Chieh Liao <ijliao@csie.nctu.edu.tw>
 Dintelmann, Peter <Peter.Dintelmann@Dresdner-Bank.com>
 Artur Penttinen <arto-p@yandex.ru>
 Dirk Langer <dirk.langer@vvovgonik.de>
-Jens Rehsack <rehsack@web.de>
+Jens Rehsack <rehsack@cpan.org>
 H.Merijn Brand <h.m.brand@xs4all.nl>
@@ -1,138 +1,182 @@
+Revision history for CPAN distribution Sys-Filesystem
+
+1.406 2014-05-13
+    - always use global kernel mount table (/proc/mounts), not the process
+      mirror
+    - add support for getting canonical device path
+    - add support for package wide settings to tune Sys::Filesystem even
+      when used indirectly
+
+1.405 2013-10-28
+    - Fix Mswin32 mounted/unmounted support (thanks to Christian "Mithaldu"
+      Walde for remote testing support)
+    - skip format test in case of unmounted device (unmounted devices might
+      or might not know in before the fstype)
+    - clean up basic tests and BAIL_OUT when unsupported environment
+      encountered
+
+1.404 2013-10-26
+    - move to Makefile.PL in favour of developer reqs
+    - change required perl version to 5.8.1
+    - rewrite core routines of Sys::Filesystem
+    - don't search for Darwin tools in path, rely on some
+      well known paths
+    - general, minor code cleanup
+
+1.403 2013-10-23
+    - Honor PATH_FSTAB in the environment on a NetBSD system if present
+      (Thanks to dholland@NetBSD.org)
+    - try improve error handling on Darwin to avoid smoke errors
+    - be noisy about where we're running on during tests
+    - remove runtime recommends for author tests
+    - bump required version of Module::Pluggable to avoid blead whining
+    - include p5-toolchain gang recommended way to declare developer
+      dependencies
+    - use proper indenting for Changes
+
+1.402 2013-09-24
+    - remove Makefile.PL passthrough
+    - don't prove whether Win32 is supported - we know it (should fix
+      RT#88901 - thanks Michiel Beijen)
+    - try to improve supported control
+    - put Win32::DriveInfo into feature "Win32" (I'd like to get feedback
+      whether it helps)
+
 1.401 2013-09-08
- - Fix MacOS X / Darwin without diskutil
- - Changes reformatted as per CPAN::Changes::Spec
+    - Fix MacOS X / Darwin without diskutil
+    - Changes reformatted as per CPAN::Changes::Spec
 
 1.400 2013-09-03
- - Moving to GitHub for easier contributing
- - Pod typo / encoding fixes (rt#85898, rt#77699), thanks to Slaven Rezić,
-   Andreas J. König and Gregor Herrmann
- - Fix MacOS X 10.8 (diskutil vs. disktool)
- - Update requirements / recommendations
- - Fix AIX (rt#79188) - thanks to David Lee
- - Fix Solaris debug leftover (rt#72717) - thanks to Kenneth Ölwing
- - Fix Tests (rt#62248) - thanks to Daphne Pfister
- - Fix configure_requires (rt#62249) - thanks to Daphne Pfister
+    - Moving to GitHub for easier contributing
+    - Pod typo / encoding fixes (rt#85898, rt#77699), thanks to Slaven
+      Rezić, Andreas J. König and Gregor Herrmann
+    - Fix MacOS X 10.8 (diskutil vs. disktool)
+    - Update requirements / recommendations
+    - Fix AIX (rt#79188) - thanks to David Lee
+    - Fix Solaris debug leftover (rt#72717) - thanks to Kenneth Ölwing
+    - Fix Tests (rt#62248) - thanks to Daphne Pfister
+    - Fix configure_requires (rt#62249) - thanks to Daphne Pfister
 
 1.30 2010-07-15
- - Fixing MSWin32
+    - Fixing MSWin32
 
 1.29 2010-07-02
- - Fixing MacOS X
+    - Fixing MacOS X
 
 1.28 2010-05-14
- - Adding more special file systems for Linux (looks in Linux soon
-   everything is a file system), Fixes RT#55059 (Thanks to Reed Loden)
- - Improving documentation about selections in filesystems method,
- - Fixes RT#55058 (Thanks to Reed Loden)
- - Fixes RT#65504 (Thanks to Brett Gersekowski)
- - Improve MSWin32 support
+    - Adding more special file systems for Linux (looks in Linux soon
+      everything is a file system), Fixes RT#55059 (Thanks to Reed Loden)
+    - Improving documentation about selections in filesystems method,
+    - Fixes RT#55058 (Thanks to Reed Loden)
+    - Fixes RT#65504 (Thanks to Brett Gersekowski)
+    - Improve MSWin32 support
 
 1.27 2010-02-20
- - Fixing RT#54406 (patch from Robert Bohne with some modifications)
- - Fixing RT#54599 (patch from Jonathan Yu)
- - Fixing wrong dependencies detection on Windows
- - Fixing generic fstab/mnttab reading
+    - Fixing RT#54406 (patch from Robert Bohne with some modifications)
+    - Fixing RT#54599 (patch from Jonathan Yu)
+    - Fixing wrong dependencies detection on Windows
+    - Fixing generic fstab/mnttab reading
 
 1.26 2010-02-12
- - Adding more special file systems for Linux
- - Prefer /proc/self/mounts over /etc/mtab (when available), fixes RT
-   #51151 (Thanks Tyler MacDonald)
- - Fix some tests to skip when no regular file systems could be found
- - Some Win32 fixes
- - Switch to Module::Pluggable to load OS-plugins
+    - Adding more special file systems for Linux
+    - Prefer /proc/self/mounts over /etc/mtab (when available), fixes RT
+      #51151 (Thanks Tyler MacDonald)
+    - Fix some tests to skip when no regular file systems could be found
+    - Some Win32 fixes
+    - Switch to Module::Pluggable to load OS-plugins
 
 1.25 2009-10-30
- - Fixed support for FreeBSD and generalize BSD support
- - Fixed support for AIX
- - Fixed aliased attribute support for Sys::Filesystem->filesystems
- - Fix "Sys::Filesystem->filesystems ()" and "Sys::Filesystem::filesystems"
-   (reported by H.Merijn Brand) by using Params::Util
- - Add keyword "Id" to be used/expanded by svn
- - Explain how restrictions on method filesystem works in Sys::Filesystem
- - Add a version method to all fs plugins
- - Update documentation
- - Correct t/03test.t to use format instead of type (recommended)
+    - Fixed support for FreeBSD and generalize BSD support
+    - Fixed support for AIX
+    - Fixed aliased attribute support for Sys::Filesystem->filesystems
+    - Fix "Sys::Filesystem->filesystems ()" and "Sys::Filesystem::filesystems"
+      (reported by H.Merijn Brand) by using Params::Util
+    - Add keyword "Id" to be used/expanded by svn
+    - Explain how restrictions on method filesystem works in Sys::Filesystem
+    - Add a version method to all fs plugins
+    - Update documentation
+    - Correct t/03test.t to use format instead of type (recommended)
 
 1.24 2009-10-17
- - Added support for NetBSD (Jens Rehsack)
- - Added support for HP-UX (H.Merijn Brand)
- - Fixed POD a little
- - Add a simple test to see whether it's working or not - Increased
-   required perl version (suggested by H.Merijn Brand)
+    - Added support for NetBSD (Jens Rehsack)
+    - Added support for HP-UX (H.Merijn Brand)
+    - Fixed POD a little
+    - Add a simple test to see whether it's working or not - Increased
+      required perl version (suggested by H.Merijn Brand)
 
 1.23 2009-05-10
- - Fixed Aix.pm (RT #34577), patches from LEMBARK, REHSACK
- - Fixed failing on OS X (RT #7958, RT #43681), patch from Dirk Langer
- - Taking Co-Maintainership (Jens Rehsack, CPAN Id: REHSACK)
- - Changing debug environment flag from DEBUG to SYS_FILESYSTEM_DEBUG
+    - Fixed Aix.pm (RT #34577), patches from LEMBARK, REHSACK
+    - Fixed failing on OS X (RT #7958, RT #43681), patch from Dirk Langer
+    - Taking Co-Maintainership (Jens Rehsack, CPAN Id: REHSACK)
+    - Changing debug environment flag from DEBUG to SYS_FILESYSTEM_DEBUG
 
 1.22 2006-06-01
- - Added CREDITS.
- - Fixed logic in Filesystem.pm:filesystems() where the inversion of the
-   'regaular' and 'special' paramaters was not being handled correctly,
-   causing an incorrect selection of filesystems to be returned sometimes.
- - Added fd ctfs devfs objfs and procfs as special filesystem types in
-   Solaris.pm.
- - Added procfs as a special filesyetem type to Aix.pm.
- - Changed Aix.pm to extract the filesystem type from the vfs field in
-   /etc/filesystems.
- - Added note in main POD warning people not to confuse "type" and "vfs"
-   when querying values under AIX.
- - Altered unit tests to be more reliable over different setups.
+    - Added CREDITS.
+    - Fixed logic in Filesystem.pm:filesystems() where the inversion of the
+      'regaular' and 'special' paramaters was not being handled correctly,
+      causing an incorrect selection of filesystems to be returned sometimes.
+    - Added fd ctfs devfs objfs and procfs as special filesystem types in
+      Solaris.pm.
+    - Added procfs as a special filesyetem type to Aix.pm.
+    - Changed Aix.pm to extract the filesystem type from the vfs field in
+      /etc/filesystems.
+    - Added note in main POD warning people not to confuse "type" and "vfs"
+      when querying values under AIX.
+    - Altered unit tests to be more reliable over different setups.
 
 1.21 2006-05-23
- - Typo in Build.PL. Changed "build_requires" to be "recommends".
+    - Typo in Build.PL. Changed "build_requires" to be "recommends".
 
 1.20 2006-05-23
- - Fixed POD to reflect functionality that existed but wasn't documented,
-   or that was documented incorrectly.
+    - Fixed POD to reflect functionality that existed but wasn't documented,
+      or that was documented incorrectly.
 
 1.19 2006-05-23
- - Changed license to Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0
- - Fixed a couple of module file names.
- - Added additional unit tests.
- - Fixed loading of failover modules.
- - A few small bug fixes in parsing of some tab files.
+    - Changed license to Apache 2.0 http://www.apache.org/licenses/LICENSE-2.0
+    - Fixed a couple of module file names.
+    - Added additional unit tests.
+    - Fixed loading of failover modules.
+    - A few small bug fixes in parsing of some tab files.
 
 1.18 2005-12-29
- - Modified Makefile.PL to submit information to perlgirl.org.uk if the
-   user agrees. Tweaked the POD slightly.
+    - Modified Makefile.PL to submit information to perlgirl.org.uk if the
+      user agrees. Tweaked the POD slightly.
 
 1.16 2005-12-08
- - Modified POD
+    - Modified POD
 
 1.15 2005-12-02
- - Updated for revision number and email address
+    - Updated for revision number and email address
 
 1.14 2005-01-30
- - Added some new filesystem property aliases and reference to AIX helper
-   module
+    - Added some new filesystem property aliases and reference to AIX helper
+      module
 
 1.13 2005-01-26
- - Added extra documentation and the device option for the filesystems
-   method.
+    - Added extra documentation and the device option for the filesystems
+      method.
 
 1.12 2005-01-13
- - Updated POD
+    - Updated POD
 
 1.11 2004-10-06
 
 1.10 2004-10-06
- - Fix from Win32 to MSWin32
+    - Fix from Win32 to MSWin32
 
 1.09 2004-10-05
- - Updated Linux.pm to properly detect some more special fs types
+    - Updated Linux.pm to properly detect some more special fs types
 
 1.08 2004-09-30
- - Added regular_filesystems() method
- - Added autofs and mntfs as special filesystems for Solaris
+    - Added regular_filesystems() method
+    - Added autofs and mntfs as special filesystems for Solaris
 
 1.07 2004-09-30
- - Added solaris mnttab support
- - Fixed an AUTOLOAD and DESTROY issue
+    - Added solaris mnttab support
+    - Fixed an AUTOLOAD and DESTROY issue
 
 1.06 2004-09-29
- - Added alias support and more POD docs
+    - Added alias support and more POD docs
 
 1.04 2004-09-29
- - Initial release to get the code out there
+    - Initial release to get the code out there
@@ -1,4 +1,3 @@
-Build.PL
 Changes
 CREDITS
 INSTALL
@@ -18,12 +17,14 @@ LICENSE
 Makefile.PL
 MANIFEST
 MANIFEST.SKIP
-META.yml
 NOTICE
 README
 t/01_load.t
 t/02_basic.t
 t/03_whereami.t
 t/04_special.t
+t/05_error.t
+t/06_settings.t
 TODO
-META.json
+META.yml                                 Module YAML meta-data (added by MakeMaker)
+META.json                                Module JSON meta-data (added by MakeMaker)
@@ -27,3 +27,4 @@ _Inline/.*
 Sys-Filesystem-.*
 ^MYMETA\..*$
 \bxt
+\.travis.yml
@@ -1,10 +1,11 @@
 {
    "abstract" : "Retrieve list of filesystems and their properties",
    "author" : [
+      "Nicola Worthington <nicolaw@cpan.org>",
       "Jens Rehsack <rehsack@cpan.org>"
    ],
    "dynamic_config" : 1,
-   "generated_by" : "Module::Build version 0.4007, CPAN::Meta::Converter version 2.132140",
+   "generated_by" : "ExtUtils::MakeMaker version 6.98, CPAN::Meta::Converter version 2.141170",
    "license" : [
       "apache_2_0"
    ],
@@ -13,100 +14,70 @@
       "version" : "2"
    },
    "name" : "Sys-Filesystem",
+   "no_index" : {
+      "directory" : [
+         "t",
+         "inc"
+      ]
+   },
    "prereqs" : {
       "build" : {
-         "requires" : {
-            "Test::More" : "0.9"
-         }
+         "requires" : {}
       },
       "configure" : {
          "requires" : {
             "Carp" : "0",
+            "Cwd" : "0",
+            "ExtUtils::MakeMaker" : "0",
+            "File::Spec" : "0",
             "FindBin" : "0",
             "IO" : "0",
             "IPC::Cmd" : "0.80",
-            "Module::Build" : "0.2800",
-            "Module::Pluggable" : "4.5",
-            "Params::Util" : "1.00",
-            "perl" : "5.008"
+            "Module::Pluggable" : "4.8",
+            "Params::Util" : "1.00"
          }
       },
-      "runtime" : {
-         "recommends" : {
-            "Module::Pluggable" : "4.8",
+      "develop" : {
+         "requires" : {
+            "Test::CPAN::Changes" : "0",
+            "Test::CheckManifest" : "0",
             "Test::Pod" : "0",
             "Test::Pod::Coverage" : "0",
+            "Test::Pod::Spelling::CommonMistakes" : "0"
+         }
+      },
+      "runtime" : {
+         "recommends" : {
             "perl" : "5.018001"
          },
          "requires" : {
             "Carp" : "0",
+            "Cwd" : "0",
+            "File::Spec" : "0",
             "FindBin" : "0",
             "IO" : "0",
             "IPC::Cmd" : "0.80",
-            "Module::Pluggable" : "4.5",
-            "Params::Util" : "1.00",
-            "perl" : "5.008"
+            "Module::Pluggable" : "4.8",
+            "Params::Util" : "1.00"
          }
-      }
-   },
-   "provides" : {
-      "Sys::Filesystem" : {
-         "file" : "lib/Sys/Filesystem.pm",
-         "version" : "1.401"
-      },
-      "Sys::Filesystem::Aix" : {
-         "file" : "lib/Sys/Filesystem/Aix.pm",
-         "version" : "1.401"
-      },
-      "Sys::Filesystem::Cygwin" : {
-         "file" : "lib/Sys/Filesystem/Cygwin.pm",
-         "version" : "1.401"
-      },
-      "Sys::Filesystem::Darwin" : {
-         "file" : "lib/Sys/Filesystem/Darwin.pm",
-         "version" : "1.401"
-      },
-      "Sys::Filesystem::Dummy" : {
-         "file" : "lib/Sys/Filesystem/Dummy.pm",
-         "version" : "1.401"
-      },
-      "Sys::Filesystem::Freebsd" : {
-         "file" : "lib/Sys/Filesystem/Freebsd.pm",
-         "version" : "1.401"
-      },
-      "Sys::Filesystem::Hpux" : {
-         "file" : "lib/Sys/Filesystem/Hpux.pm",
-         "version" : "1.401"
-      },
-      "Sys::Filesystem::Linux" : {
-         "file" : "lib/Sys/Filesystem/Linux.pm",
-         "version" : "1.401"
       },
-      "Sys::Filesystem::Mswin32" : {
-         "file" : "lib/Sys/Filesystem/Mswin32.pm",
-         "version" : "1.401"
-      },
-      "Sys::Filesystem::Netbsd" : {
-         "file" : "lib/Sys/Filesystem/Netbsd.pm",
-         "version" : "1.401"
-      },
-      "Sys::Filesystem::Solaris" : {
-         "file" : "lib/Sys/Filesystem/Solaris.pm",
-         "version" : "1.401"
-      },
-      "Sys::Filesystem::Unix" : {
-         "file" : "lib/Sys/Filesystem/Unix.pm",
-         "version" : "1.401"
+      "test" : {
+         "requires" : {
+            "Test::More" : "0.9"
+         }
       }
    },
    "release_status" : "stable",
    "resources" : {
-      "license" : [
-         "http://apache.org/licenses/LICENSE-2.0"
-      ],
+      "bugtracker" : {
+         "mailto" : "fsys-filesystem@rt.cpan.org",
+         "web" : "http://rt.cpan.org/Public/Dist/Display.html?Name=Sys-Filesystem"
+      },
+      "homepage" : "https://metacpan.org/release/Sys-Filesystem",
       "repository" : {
-         "url" : "https://github.com/rehsack/Sys-Filesystem"
+         "type" : "git",
+         "web" : "https://github.com/rehsack/Sys-Filesystem"
       }
    },
-   "version" : "1.401"
+   "version" : "1.406"
 }
@@ -1,76 +1,44 @@
 ---
 abstract: 'Retrieve list of filesystems and their properties'
 author:
+  - 'Nicola Worthington <nicolaw@cpan.org>'
   - 'Jens Rehsack <rehsack@cpan.org>'
 build_requires:
-  Test::More: 0.9
+  Test::More: '0.9'
 configure_requires:
-  Carp: 0
-  FindBin: 0
-  IO: 0
-  IPC::Cmd: 0.80
-  Module::Build: 0.2800
-  Module::Pluggable: 4.5
-  Params::Util: 1.00
-  perl: 5.008
+  Carp: '0'
+  Cwd: '0'
+  ExtUtils::MakeMaker: '0'
+  File::Spec: '0'
+  FindBin: '0'
+  IO: '0'
+  IPC::Cmd: '0.80'
+  Module::Pluggable: '4.8'
+  Params::Util: '1.00'
 dynamic_config: 1
-generated_by: 'Module::Build version 0.4007, CPAN::Meta::Converter version 2.132140'
+generated_by: 'ExtUtils::MakeMaker version 6.98, CPAN::Meta::Converter version 2.141170'
 license: apache
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
+  version: '1.4'
 name: Sys-Filesystem
-provides:
-  Sys::Filesystem:
-    file: lib/Sys/Filesystem.pm
-    version: 1.401
-  Sys::Filesystem::Aix:
-    file: lib/Sys/Filesystem/Aix.pm
-    version: 1.401
-  Sys::Filesystem::Cygwin:
-    file: lib/Sys/Filesystem/Cygwin.pm
-    version: 1.401
-  Sys::Filesystem::Darwin:
-    file: lib/Sys/Filesystem/Darwin.pm
-    version: 1.401
-  Sys::Filesystem::Dummy:
-    file: lib/Sys/Filesystem/Dummy.pm
-    version: 1.401
-  Sys::Filesystem::Freebsd:
-    file: lib/Sys/Filesystem/Freebsd.pm
-    version: 1.401
-  Sys::Filesystem::Hpux:
-    file: lib/Sys/Filesystem/Hpux.pm
-    version: 1.401
-  Sys::Filesystem::Linux:
-    file: lib/Sys/Filesystem/Linux.pm
-    version: 1.401
-  Sys::Filesystem::Mswin32:
-    file: lib/Sys/Filesystem/Mswin32.pm
-    version: 1.401
-  Sys::Filesystem::Netbsd:
-    file: lib/Sys/Filesystem/Netbsd.pm
-    version: 1.401
-  Sys::Filesystem::Solaris:
-    file: lib/Sys/Filesystem/Solaris.pm
-    version: 1.401
-  Sys::Filesystem::Unix:
-    file: lib/Sys/Filesystem/Unix.pm
-    version: 1.401
+no_index:
+  directory:
+    - t
+    - inc
 recommends:
-  Module::Pluggable: 4.8
-  Test::Pod: 0
-  Test::Pod::Coverage: 0
-  perl: 5.018001
+  perl: '5.018001'
 requires:
-  Carp: 0
-  FindBin: 0
-  IO: 0
-  IPC::Cmd: 0.80
-  Module::Pluggable: 4.5
-  Params::Util: 1.00
-  perl: 5.008
+  Carp: '0'
+  Cwd: '0'
+  File::Spec: '0'
+  FindBin: '0'
+  IO: '0'
+  IPC::Cmd: '0.80'
+  Module::Pluggable: '4.8'
+  Params::Util: '1.00'
 resources:
-  license: http://apache.org/licenses/LICENSE-2.0
+  bugtracker: http://rt.cpan.org/Public/Dist/Display.html?Name=Sys-Filesystem
+  homepage: https://metacpan.org/release/Sys-Filesystem
   repository: https://github.com/rehsack/Sys-Filesystem
-version: 1.401
+version: '1.406'
@@ -1,35 +1,151 @@
-# Note: this file was auto-generated by Module::Build::Compat version 0.4007
-require 5.008;
+# vim:ts=4:sw=4:tw=78
+# $Id$
 
-    unless (eval "use Module::Build::Compat 0.02; 1" ) {
-      print "This module requires Module::Build to install itself.\n";
+use 5.008001;
 
-      require ExtUtils::MakeMaker;
-      my $yn = ExtUtils::MakeMaker::prompt
-	('  Install Module::Build now from CPAN?', 'y');
+use strict;
+use vars qw($build);
+use FindBin;
+use File::Spec;
+use lib File::Spec->catdir( $FindBin::Bin, 'lib' );
 
-      unless ($yn =~ /^y/i) {
-	die " *** Cannot install without Module::Build.  Exiting ...\n";
-      }
+use ExtUtils::MakeMaker;
 
-      require Cwd;
-      require File::Spec;
-      require CPAN;
+$@ = undef;
+my @fs;
+$^O eq 'MSWin32' or eval {
+    require Sys::Filesystem;
+    unless ( Sys::Filesystem->supported )
+    {
+        printf( STDERR "Can't be used ($@) - OS not supported or bad maintained?" );
+        exit(0);
+    }
+};
+
+my %RUN_DEPS = (
+    'Carp'              => 0,
+    'Cwd'               => 0,
+    'File::Spec'        => 0,
+    'FindBin'           => 0,
+    'IO'                => 0,
+    'IPC::Cmd'          => '0.80',
+    'Module::Pluggable' => '4.8',
+    'Params::Util'      => '1.00',
+    (
+        $^O eq 'MSWin32'
+        ? (
+            'Win32::DriveInfo' => 0,
+          )
+        : ()
+    ),
+);
+my %CONFIGURE_DEPS = (
+    'ExtUtils::MakeMaker' => 0,
+    %RUN_DEPS
+);
+my %BUILD_DEPS = ();
+
+my %TEST_DEPS = (
+    'Test::More' => 0.90,
+);
 
-      # Save this 'cause CPAN will chdir all over the place.
-      my $cwd = Cwd::cwd();
+WriteMakefile1(
+    MIN_PERL_VERSION => '5.008001',
+    META_ADD         => {
+        'meta-spec' => { version => 2 },
+        resources   => {
+            homepage   => 'https://metacpan.org/release/Sys-Filesystem',
+            repository => {
+                url  => 'git@github.com:rehsack/Sys-Filesystem.git',
+                web  => 'https://github.com/rehsack/Sys-Filesystem',
+                type => 'git',
+            },
+            bugtracker => {
+                web    => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Sys-Filesystem',
+                mailto => 'fsys-filesystem@rt.cpan.org',
+            },
+        },
+        prereqs => {
+            develop => {
+                requires => {
+                    'Test::CPAN::Changes'                 => 0,
+                    'Test::CheckManifest'                 => 0,
+                    'Test::Pod'                           => 0,
+                    'Test::Pod::Coverage'                 => 0,
+                    'Test::Pod::Spelling::CommonMistakes' => 0,
+                },
+            },
+            configure => {
+                requires => {%CONFIGURE_DEPS},
+            },
+            build   => { requires => {%BUILD_DEPS} },
+            test    => { requires => {%TEST_DEPS} },
+            runtime => {
+                recommends => {
+                    'perl' => '5.018001',
+                },
+                requires => { %RUN_DEPS, },
+            },
+        },
+    },
+    NAME           => 'Sys::Filesystem',
+    VERSION_FROM   => 'lib/Sys/Filesystem.pm',
+    ABSTRACT_FROM  => 'lib/Sys/Filesystem.pm',
+    LICENSE        => 'Apache',
+    AUTHOR         => [ q{Nicola Worthington <nicolaw@cpan.org>}, q{Jens Rehsack <rehsack@cpan.org>} ],
+    PREREQ_PM      => \%RUN_DEPS,
+    BUILD_REQUIRES => \%BUILD_DEPS,
+    TEST_REQUIRES  => \%TEST_DEPS,
+    test           => { TESTS => 't/*.t xt/*.t' },
+);
 
-      CPAN::Shell->install('Module::Build::Compat');
-      CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate
-	or die "Couldn't install Module::Build, giving up.\n";
+sub WriteMakefile1
+{    # originally written by Alexandr Ciornii, version 0.21. Added by eumm-upgrade.
+    my %params       = @_;
+    my $eumm_version = $ExtUtils::MakeMaker::VERSION;
+    $eumm_version = eval $eumm_version;
+    die "EXTRA_META is deprecated" if ( exists( $params{EXTRA_META} ) );
+    die "License not specified"    if ( !exists( $params{LICENSE} ) );
+    if ( $params{TEST_REQUIRES} and ( $eumm_version < 6.6303 ) )
+    {
+        if ( $params{BUILD_REQUIRES} )
+        {
+            $params{BUILD_REQUIRES} = { %{ $params{BUILD_REQUIRES} }, %{ $params{TEST_REQUIRES} } };
+        }
+        else
+        {
+            $params{BUILD_REQUIRES} = delete $params{TEST_REQUIRES};
+        }
+    }
+    if ( $params{BUILD_REQUIRES} and ( $eumm_version < 6.5503 ) )
+    {
+        #EUMM 6.5502 has problems with BUILD_REQUIRES
+        $params{PREREQ_PM} = { %{ $params{PREREQ_PM} || {} }, %{ $params{BUILD_REQUIRES} } };
+        delete $params{BUILD_REQUIRES};
+    }
+    delete $params{CONFIGURE_REQUIRES}    if ( $eumm_version < 6.52 );
+    delete $params{MIN_PERL_VERSION}      if ( $eumm_version < 6.48 );
+    delete $params{META_MERGE}            if ( $eumm_version < 6.46 );
+    delete $params{META_ADD}{prereqs}     if ( $eumm_version < 6.58 );
+    delete $params{META_ADD}{'meta-spec'} if ( $eumm_version < 6.58 );
+    delete $params{META_ADD}              if ( $eumm_version < 6.46 );
+    delete $params{LICENSE}               if ( $eumm_version < 6.31 );
+    delete $params{AUTHOR}                if ( $] < 5.005 );
+    delete $params{ABSTRACT_FROM}         if ( $] < 5.005 );
+    delete $params{BINARY_LOCATION}       if ( $] < 5.005 );
 
-      chdir $cwd or die "Cannot chdir() back to $cwd: $!";
+    # more or less taken from Moose' Makefile.PL
+    if ( $params{CONFLICTS} )
+    {
+        my $ok = CheckConflicts(%params);
+        exit(0) if ( $params{PREREQ_FATAL} and not $ok );
+        my $cpan_smoker = grep { $_ =~ m/(?:CR_SMOKER|CPAN_REPORTER|AUTOMATED_TESTING)/ } keys %ENV;
+        unless ( $cpan_smoker || $ENV{PERL_MM_USE_DEFAULT} )
+        {
+            sleep 4 unless ($ok);
+        }
+        delete $params{CONFLICTS};
     }
-    eval "use Module::Build::Compat 0.02; 1" or die $@;
-    
-    Module::Build::Compat->run_build_pl(args => \@ARGV);
-    my $build_script = 'Build';
-    $build_script .= '.com' if $^O eq 'VMS';
-    exit(0) unless(-e $build_script); # cpantesters convention
-    require Module::Build;
-    Module::Build::Compat->write_makefile(build_class => 'Module::Build');
+
+    WriteMakefile(%params);
+}
@@ -41,27 +41,49 @@ INHERITANCE
       ISA UNIVERSAL
 
 METHODS
-    new Creates a new Sys::Filesystem object. new() accepts 3 optional key
-        pair values to help or force where mount information is gathered
-        from. These values are not otherwise defaulted by the main
+    new Creates a new Sys::Filesystem object. "new" accepts following
+        optional key value pairs to help or force where mount information is
+        gathered from. These values are not otherwise defaulted by the main
         Sys::Filesystem object, but left to the platform specific helper
         modules to determine as an exercise of common sense.
 
+        canondev
+            Specify whether device path's shall be resolved when they're a
+            symbolic link.
+
+            $Sys::Filesystem::CANONDEV is used when no key "canondev" is
+            passed.
+
         fstab
             Specify the full path and filename of the filesystem table (or
-            fstab for short).
+            fstab for short). Not all platforms have such a file and so this
+            option may be ignored on some systems.
+
+            $Sys::Filesystem::FSTAB is used when no key "fstab" is passed.
 
         mtab
             Specify the full path and filename of the mounted filesystem
             table (or mtab for short). Not all platforms have such a file
             and so this option may be ignored on some systems.
 
+            $Sys::Filesystem::MTAB is used when no key "mtab" is passed.
+
         xtab
-            Specify the full path and filename of the mounted NFS filesystem
-            table (or xtab for short). This is usually only pertinant to
-            Unix bases systems. Not all helper modules will query NFS mounts
-            as a separate exercise, and therefore this option may be ignored
-            on some systems.
+            DEPRECIATED Specify the full path and filename of the mounted
+            NFS filesystem table (or xtab for short). This is usually only
+            pertinant to Unix bases systems. Not all helper modules will
+            query NFS mounts as a separate exercise, and therefore this
+            option may be ignored on some systems.
+
+            None of the OS plugins use that tunable (anymore?), so it now a
+            warning is raised when it's used. The entire support will be
+            removed not before 2015. Once that happened, using "xtab" will
+            raise an exception.
+
+        aliases
+            Overrides internal aliasing table used to match queries against
+            OS plugin. This should be used only when dealing with closed
+            source platform helper module(s).
 
     supported
         Returns true if the operating system is supported by
@@ -284,7 +306,7 @@ ACKNOWLEDGEMENTS
 COPYRIGHT
     Copyright 2004,2005,2006 Nicola Worthington.
 
-    Copyright 2008-2013 Jens Rehsack.
+    Copyright 2008-2014 Jens Rehsack.
 
     This software is licensed under The Apache Software License, Version
     2.0.
@@ -24,14 +24,17 @@ package Sys::Filesystem::Aix;
 
 # vim:ts=4:sw=4:tw=78
 
+use 5.008001;
+
 use strict;
 use warnings;
 use vars qw($VERSION);
 
 use Carp qw(croak);
+use Cwd 'abs_path';
 use IO::File;
 
-$VERSION = '1.401';
+$VERSION = '1.406';
 
 sub version()
 {
@@ -40,13 +43,13 @@ sub version()
 
 my @fstab_keys = qw(account boot check dev mount nodename size type vfs vol log);
 my %special_fs = (
-                   swap   => 1,
-                   procfs => 1,
-                   proc   => 1,
-                   tmpfs  => 1,
-                   mntfs  => 1,
-                   autofs => 1,
-                 );
+    swap   => 1,
+    procfs => 1,
+    proc   => 1,
+    tmpfs  => 1,
+    mntfs  => 1,
+    autofs => 1,
+);
 
 # see AIX commands at
 # http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.doc/doc/base/alphabeticallistofcommands.htm
@@ -66,7 +69,8 @@ sub new
     } qx( /usr/sbin/mount );
 
     my %fs_info = map {
-        my ( $path, $device, $vfs, $nodename, $type, $size, $options, $mount, $account ) = split( m/:/, $_ );
+        my ( $path, $device, $vfs, $nodename, $type, $size, $options, $mount, $account ) =
+          split( m/:/, $_ );
 
         ( $path => [ $device, $vfs, $nodename, $type, $size, $options, $mount, $account ] )
       }
@@ -76,8 +80,10 @@ sub new
     {
         $self->{$current_filesystem}->{filesystem} = $current_filesystem;
 
-        my ( $device, $vfs, $nodename, $type, $size, $options, $mount, $account ) = @{ $fs_info{$current_filesystem} };
+        my ( $device, $vfs, $nodename, $type, $size, $options, $mount, $account ) =
+          @{ $fs_info{$current_filesystem} };
 
+        $args{canondev} and -l $device and $device = abs_path($device);
         $self->{$current_filesystem}->{dev}      = $device;
         $self->{$current_filesystem}->{vfs}      = $vfs;
         $self->{$current_filesystem}->{options}  = $options;
@@ -86,7 +92,8 @@ sub new
         $self->{$current_filesystem}->{size}     = $size;
         $self->{$current_filesystem}->{mount}    = $mount;
         $self->{$current_filesystem}->{account}  = $account;
-        $self->{$current_filesystem}->{special}  = 1 if ( defined($vfs) && defined( $special_fs{$vfs} ) );
+        $self->{$current_filesystem}->{special}  = 1
+          if ( defined($vfs) && defined( $special_fs{$vfs} ) );
 
         # the filesystem is either currently mounted or is not,
         # this does not need to be checked for each individual
@@ -112,13 +119,15 @@ sub new
 
         my ( $lvname, $type, $lps, $pps, $pvs, $lvstate ) = @{ $fs_info{$current_filesystem} };
 
+        $args{canondev} and -l $lvname and $lvname = abs_path($lvname);
         $self->{$current_filesystem}->{dev}     = $lvname;
         $self->{$current_filesystem}->{vfs}     = $type;
         $self->{$current_filesystem}->{LPs}     = $lps;
         $self->{$current_filesystem}->{PPs}     = $pps;
         $self->{$current_filesystem}->{PVs}     = $pvs;
         $self->{$current_filesystem}->{lvstate} = $lvstate;
-        $self->{$current_filesystem}->{special} = 1 if ( defined($type) && defined( $special_fs{$type} ) );
+        $self->{$current_filesystem}->{special} = 1
+          if ( defined($type) && defined( $special_fs{$type} ) );
 
         # the filesystem is either currently mounted or is not,
         # this does not need to be checked for each individual
@@ -133,7 +142,6 @@ sub new
         my $current_filesystem = '*UNDEFINED*';
         while (<$fstab>)
         {
-
             # skip comments and blank lines.
             next if m{^ [*] }x || m{^ \s* $}x;
 
@@ -153,15 +161,15 @@ sub new
             }
             elsif ( my ( $key, $value ) = $_ =~ /^\s*([a-z]{3,8})\s+=\s+"?(.+)"?\s*$/ )
             {
-                unless ( defined( $self->{$current_filesystem}->{$key} ) )
-                {
+                # do not overwrite already known data
+                defined $self->{$current_filesystem}->{$key} and next;
 
-                    # do not overwrite already known data
-                    $self->{$current_filesystem}->{$key} = $value;
-                    if ( ( $key eq 'vfs' ) && defined( $special_fs{$value} ) )
-                    {
-                        $self->{$current_filesystem}->{special} = 1;
-                    }
+                $key eq "dev" and $args{canondev} and -l $value and $value = abs_path($value);
+
+                $self->{$current_filesystem}->{$key} = $value;
+                if ( ( $key eq 'vfs' ) && defined( $special_fs{$value} ) )
+                {
+                    $self->{$current_filesystem}->{special} = 1;
                 }
             }
         }
@@ -344,7 +352,7 @@ Jens Rehsack <rehsack@cpan.org> - L<http://www.rehsack.de/>
 
 Copyright 2004,2005,2006 Nicola Worthington.
 
-Copyright 2008-2013 Jens Rehsack.
+Copyright 2008-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -23,6 +23,8 @@ package Sys::Filesystem::Cygwin;
 
 # vim:ts=4:sw=4:tw=78
 
+use 5.008001;
+
 use strict;
 use warnings;
 use vars qw($VERSION @ISA);
@@ -30,7 +32,7 @@ use vars qw($VERSION @ISA);
 use Carp qw(croak);
 require Sys::Filesystem::Unix;
 
-$VERSION = '1.401';
+$VERSION = '1.406';
 @ISA     = qw(Sys::Filesystem::Unix);
 
 sub version()
@@ -38,13 +40,13 @@ sub version()
     return $VERSION;
 }
 
-my @keys = qw(fs_spec fs_file fs_vfstype fs_mntops);
+my @keys       = qw(fs_spec fs_file fs_vfstype fs_mntops);
 my %special_fs = (
-                   swap   => 1,
-                   proc   => 1,
-                   devpts => 1,
-                   tmpfs  => 1,
-                 );
+    swap   => 1,
+    proc   => 1,
+    devpts => 1,
+    tmpfs  => 1,
+);
 my $mount_rx = qr/^\s*(.+?)\s+on\s+(\/.+?)\s+type\s+(\S+)\s+\((\S+)\)\s*$/;
 
 sub new
@@ -52,11 +54,14 @@ sub new
     ref( my $class = shift ) && croak 'Class name required';
     my %args = @_;
     my $self = bless( {}, $class );
+    $args{canondev} and $self->{canondev} = 1;
 
     local $/ = "\n";
     my @mounts = qx( mount );
     $self->readMounts( $mount_rx, [ 0, 1, 2 ], \@keys, \%special_fs, @mounts );
 
+    delete $self->{canondev};
+
     $self;
 }
 
@@ -145,7 +150,7 @@ Jens Rehsack <rehsack@cpan.org> - L<http://www.rehsack.de/>
 
 Copyright 2004,2005,2006 Nicola Worthington.
 
-Copyright 2008-2013 Jens Rehsack.
+Copyright 2008-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -24,7 +24,7 @@ package Sys::Filesystem::Darwin;
 
 # vim:ts=4:sw=4:tw=78
 
-use 5.006;
+use 5.008001;
 
 use strict;
 use warnings;
@@ -35,7 +35,7 @@ use IPC::Cmd ();
 
 use Carp qw(croak);
 
-$VERSION = '1.401';
+$VERSION = '1.406';
 @ISA     = qw(Sys::Filesystem::Unix);
 
 sub version()
@@ -46,10 +46,10 @@ sub version()
 my @dt_keys     = qw(fs_spec fs_file fs_vfstype fs_name);
 my @mount_keys1 = qw(fs_spec fs_file fs_vfstype);
 my @mount_keys2 = qw(fs_spec fs_file fs_mntops);
-my %special_fs = (
-                   devfs  => 1,
-                   autofs => 1,
-                 );
+my %special_fs  = (
+    devfs  => 1,
+    autofs => 1,
+);
 
 my $dt_rx = qr/Disk\sAppeared\s+\('([^']+)',\s*
                Mountpoint\s*=\s*'([^']+)',\s*
@@ -62,19 +62,28 @@ sub new
 {
     my ( $class, %args ) = @_;
     my $self = bless( {}, $class );
+    $args{canondev} and $self->{canondev} = 1;
 
-    $args{diskutil} ||= IPC::Cmd::can_run("diskutil");
-    $args{disktool} ||= IPC::Cmd::can_run("disktool");
-    $args{mount}    ||= IPC::Cmd::can_run("mount");
+    foreach my $prog (qw(diskutil disktool mount))
+    {
+        defined $args{$prog}
+          or $args{$prog} = ( grep { defined $_ and -x $_ } ( "/usr/sbin/$prog", "/sbin/$prog" ) )[0];
+    }
 
     my @list_fs_cmd;
-    defined $args{diskutil} and $args{diskutil} and @list_fs_cmd = ($args{diskutil}, "list");
-    @list_fs_cmd or @list_fs_cmd = ($args{disktool}, "-l");
+    defined $args{diskutil} and $args{diskutil} and @list_fs_cmd = ( $args{diskutil}, "list" );
+    ( 0 == scalar @list_fs_cmd )
+      and defined $args{disktool}
+      and $args{disktool}
+      and @list_fs_cmd = ( $args{disktool}, "-l" );
+    @list_fs_cmd or croak("No command to list file systems ...");
 
     # don't use backticks, don't use the shell
     my @fslist  = ();
     my @mntlist = ();
-    open( my $dt_fh, '-|' ) or exec( @list_fs_cmd ) or croak("Cannot execute " . join(" ", @list_fs_cmd) . ": $!");
+    open( my $dt_fh, '-|' )
+      or exec(@list_fs_cmd)
+      or croak( "Cannot execute " . join( " ", @list_fs_cmd ) . ": $!" );
     @fslist = <$dt_fh>;
     close($dt_fh);
     open( my $m_fh, '-|' ) or exec( $args{mount} ) or croak("Cannot execute $args{mount}: $!");
@@ -113,6 +122,8 @@ sub new
     #    }
     #}
 
+    delete $self->{canondev};
+
     $self;
 }
 
@@ -222,7 +233,7 @@ Jens Rehsack <rehsack@cpan.org> - L<http://www.rehsack.de/>
 =head1 COPYRIGHT
 
 Copyright 2004,2005,2006 Nicola Worthington.
-Copyright 2009,2013 Jens Rehsack.
+Copyright 2009-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -23,11 +23,13 @@ package Sys::Filesystem::Dummy;
 
 # vim:ts=4:sw=4:tw=78
 
+use 5.008001;
+
 use strict;
 use Carp qw(croak);
 
 use vars qw($VERSION);
-$VERSION = '1.401';
+$VERSION = '1.406';
 
 sub version()
 {
@@ -84,7 +86,7 @@ Jens Rehsack <rehsack@cpan.org> - L<http://www.rehsack.de/>
 
 Copyright 2004,2005,2006 Nicola Worthington.
 
-Copyright 2009,2013 Jens Rehsack.
+Copyright 2009-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -24,6 +24,8 @@ package Sys::Filesystem::Freebsd;
 
 # vim:ts=4:sw=4:tw=78
 
+use 5.008001;
+
 use strict;
 use warnings;
 use vars qw(@ISA $VERSION);
@@ -31,7 +33,7 @@ use vars qw(@ISA $VERSION);
 require Sys::Filesystem::Unix;
 use Carp qw(croak);
 
-$VERSION = '1.401';
+$VERSION = '1.406';
 @ISA     = qw(Sys::Filesystem::Unix);
 
 sub version()
@@ -39,13 +41,13 @@ sub version()
     return $VERSION;
 }
 
-my @keys = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno);
+my @keys       = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno);
 my %special_fs = (
-                   swap   => 1,
-                   proc   => 1,
-                   devpts => 1,
-                   tmpfs  => 1,
-                 );
+    swap   => 1,
+    proc   => 1,
+    devpts => 1,
+    tmpfs  => 1,
+);
 
 my $mount_rx = qr|^([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)|;
 my $swap_rx  = qr|^(/[/\w]+)\s+|;
@@ -55,6 +57,7 @@ sub new
     ref( my $class = shift ) && croak 'Class name required';
     my %args = @_;
     my $self = bless( {}, $class );
+    $args{canondev} and $self->{canondev} = 1;
 
     $args{fstab} ||= $ENV{PATH_FSTAB} || '/etc/fstab';
 
@@ -66,6 +69,8 @@ sub new
         croak "Unable to open fstab file ($args{fstab})\n";
     }
 
+    delete $self->{canondev};
+
     $self;
 }
 
@@ -170,7 +175,7 @@ Jens Rehsack <rehsack@cpan.org> - L<http://www.rehsack.de>
 
 Copyright 2004,2005,2006 Nicola Worthington.
 
-Copyright 2009,2013 Jens Rehsack.
+Copyright 2009-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -20,7 +20,7 @@
 
 package Sys::Filesystem::Hpux;
 
-use 5.006;
+use 5.008001;
 
 use strict;
 use warnings;
@@ -30,7 +30,7 @@ require Sys::Filesystem::Unix;
 
 use Carp qw(croak);
 
-$VERSION = '1.401';
+$VERSION = '1.406';
 @ISA     = qw(Sys::Filesystem::Unix);
 
 sub version()
@@ -42,9 +42,9 @@ sub version()
 my @fstabkeys  = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno);
 my @mnttabkeys = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno mount_time);
 my %special_fs = (
-                   swap => 1,
-                   proc => 1
-                 );
+    swap => 1,
+    proc => 1
+);
 
 sub new
 {
@@ -52,6 +52,7 @@ sub new
     my $class = ref($proto) || $proto or croak 'Class name required';
     my %args  = @_;
     my $self  = bless( {}, $class );
+    $args{canondev} and $self->{canondev} = 1;
 
     # Defaults
     $args{fstab} ||= '/etc/fstab';
@@ -67,6 +68,8 @@ sub new
         croak "Unable to open fstab file ($args{mtab})\n";
     }
 
+    delete $self->{canondev};
+
     $self;
 }
 
@@ -110,7 +113,7 @@ H.Merijn Brand, PROCURA B.V.
 
 Copyright 2009 H.Merijn Brand PROCURA B.V.
 
-Copyright 2009,2013 Jens Rehsack.
+Copyright 2009-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -23,15 +23,18 @@ package Sys::Filesystem::Linux;
 
 # vim:ts=4:sw=4:tw=78
 
+use 5.008001;
+
 use strict;
 use warnings;
 use vars qw($VERSION @ISA);
 
 use Carp qw(croak);
-require IO::File;
-require Sys::Filesystem::Unix;
+use Cwd 'abs_path';
+use IO::File              ();
+use Sys::Filesystem::Unix ();
 
-$VERSION = '1.401';
+$VERSION = '1.406';
 @ISA     = qw(Sys::Filesystem::Unix);
 
 sub version()
@@ -40,23 +43,23 @@ sub version()
 }
 
 # Default fstab and mtab layout
-my @keys = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno);
+my @keys       = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno);
 my %special_fs = (
-                   binfmt_misc             => 1,
-                   debugfs                 => 1,
-                   devpts                  => 1,
-                   fusectl                 => 1,
-                   'fuse.gvfs-fuse-daemon' => 1,
-		   mini_fo                 => 1,
-                   nfsd                    => 1,
-                   proc                    => 1,
-                   procbususb              => 1,
-                   securityfs              => 1,
-                   swap                    => 1,
-                   sysfs                   => 1,
-                   tmpfs                   => 1,
-                   udev                    => 1,
-                 );
+    binfmt_misc             => 1,
+    debugfs                 => 1,
+    devpts                  => 1,
+    fusectl                 => 1,
+    'fuse.gvfs-fuse-daemon' => 1,
+    mini_fo                 => 1,
+    nfsd                    => 1,
+    proc                    => 1,
+    procbususb              => 1,
+    securityfs              => 1,
+    swap                    => 1,
+    sysfs                   => 1,
+    tmpfs                   => 1,
+    udev                    => 1,
+);
 
 sub new
 {
@@ -66,8 +69,9 @@ sub new
 
     # Defaults
     $args{fstab} ||= '/etc/fstab';
-    $args{mtab} ||= -r '/proc/self/mounts' ? '/proc/self/mounts' : '/etc/mtab';
+    $args{mtab} ||= -r '/proc/mounts' ? '/proc/mounts' : '/etc/mtab';
     #$args{xtab}  ||= '/etc/lib/nfs/xtab';
+    $args{canondev} and $self->{canondev} = 1;
 
     local $/ = "\n";
 
@@ -78,18 +82,15 @@ sub new
         {
             next if ( /^\s*#/ || /^\s*$/ );
             my @vals = split( ' ', $_ );
-            if ( $vals[0] =~ /^\s*LABEL=(.+)\s*$/ )
-            {
-                $self->{ $vals[1] }->{label} = $1;
-            }
+            $vals[0] =~ /^\s*LABEL=(.+)\s*$/
+              and $self->{ $vals[1] }->{label} = $1;
+            $args{canondev} and -l $vals[0] and $vals[0] = abs_path( $vals[0] );
             $self->{ $vals[1] }->{mount_point} = $vals[1];
             $self->{ $vals[1] }->{device}      = $vals[0];
             $self->{ $vals[1] }->{unmounted}   = 1;
-            $self->{ $vals[1] }->{special}     = 1 if ( defined( $special_fs{ $vals[2] } ) );
-            for ( my $i = 0; $i < @keys; ++$i )
-            {
-                $self->{ $vals[1] }->{ $keys[$i] } = $vals[$i];
-            }
+            defined $special_fs{ $vals[2] }
+              and $self->{ $vals[1] }->{special} = 1;
+            @{ $self->{ $vals[1] } }{@keys} = @vals;
         }
         $fstab->close();
     }
@@ -104,6 +105,8 @@ sub new
         croak "Unable to open fstab file ($args{mtab})\n";
     }
 
+    delete $self->{canondev};
+
     $self;
 }
 
@@ -231,7 +234,7 @@ Jens Rehsack <rehsack@cpan.org> - L<http://www.rehsack.de/>
 
 Copyright 2004,2005,2006 Nicola Worthington.
 
-Copyright 2009,2013 Jens Rehsack.
+Copyright 2009-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -23,23 +23,25 @@ package Sys::Filesystem::Mswin32;
 
 # vim:ts=4:sw=4:tw=78
 
+use 5.008001;
+
 use strict;
 use warnings;
+use vars qw($VERSION);
+
 use Params::Util qw(_STRING);
 use Win32::DriveInfo;
 use Carp qw(croak);
 
-use vars qw($VERSION);
-$VERSION = '1.401';
+$VERSION = '1.406';
 
 sub version()
 {
     return $VERSION;
 }
 
-my @volInfoAttrs =
-  ( 'n/a', 'preserve case', 'case sensitive', 'unicode', 'acl', 'file compression', 'compressed volume' );
-my @typeExplain = ( 'not determined', 'not available', 'removeable', 'fixed', 'network', 'cdrom', 'ram disk' );
+my @volInfoAttrs = ( 'n/a', 'preserve case', 'case sensitive', 'unicode', 'acl', 'file compression', 'compressed volume' );
+my @typeExplain = ( 'unable to determine', 'no root directory', 'removeable', 'fixed', 'network', 'cdrom', 'ram disk' );
 
 sub new
 {
@@ -56,26 +58,25 @@ sub new
           Win32::DriveInfo::VolumeInfo($drvletter);
 
         my $drvRoot = $drvletter . ":/";
-        if ( defined( _STRING($VolumeName) ) )
-        {
-            $VolumeName =~ s/\\/\//g;
-            $VolumeName = ucfirst($VolumeName);
-        }
-        else
-        {
-            $VolumeName = $drvRoot;
-        }
+        defined( _STRING($VolumeName) ) and $VolumeName =~ s/\\/\//g;
+        defined( _STRING($VolumeName) ) or $VolumeName = $drvRoot;
+        $VolumeName = ucfirst($VolumeName);
 
         $FileSystemName ||= 'CDFS' if ( $type == 5 );
 
-        $self->{$drvRoot}->{mount_point} = $drvRoot;        # XXX Win32::DriveInfo gives no details here ...
+        # XXX Win32::DriveInfo gives no details here ...
+        $self->{$drvRoot}->{mount_point} = $drvRoot;
         $self->{$drvRoot}->{device}      = $VolumeName;
-        $self->{$drvRoot}->{format}      = $FileSystemName; # XXX Win32::DriveInfo gives sometime wrong information here
+        # XXX Win32::DriveInfo gives sometime wrong information here
+        $self->{$drvRoot}->{format} = $FileSystemName;
         $self->{$drvRoot}->{options} = join( ',', map { $volInfoAttrs[$_] } @attr );
-        if ( $self->{$drvRoot}->{mounted} = $type > 1 )
-        {
-            $self->{$drvRoot}->{type} = $typeExplain[$type];
-        }
+        my $mntstate = ( ( defined $FileSystemName ) and $type > 1 );
+        $mntstate
+          and 2 == $type
+          and $mntstate = Win32::DriveInfo::IsReady($drvletter);
+        $mntstate = $mntstate ? "mounted" : "unmounted";
+        $self->{$drvRoot}->{$mntstate} = 1;
+        $type > 0 and $self->{$drvRoot}->{type} = $typeExplain[$type];
     }
 
     bless( $self, $class );
@@ -146,7 +147,7 @@ drives are recognized, no UNC names neither file systems mounted to a path.
 
 Copyright 2004,2005,2006 Nicola Worthington.
 
-Copyright 2009,2013 Jens Rehsack.
+Copyright 2009-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -23,13 +23,16 @@ package Sys::Filesystem::Netbsd;
 
 # vim:ts=4:sw=4:tw=78
 
+use 5.008001;
+
 use strict;
+use warnings;
 use vars qw(@ISA $VERSION);
 
 require Sys::Filesystem::Unix;
 use Carp qw(croak);
 
-$VERSION = '1.401';
+$VERSION = '1.406';
 @ISA     = qw(Sys::Filesystem::Unix);
 
 sub version()
@@ -38,14 +41,14 @@ sub version()
 }
 
 # Default fstab and mtab layout
-my @keys = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno);
+my @keys       = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno);
 my %special_fs = (
-                   swap   => 1,
-                   procfs => 1,
-                   kernfs => 1,
-                   ptyfs  => 1,
-                   tmpfs  => 1,
-                 );
+    swap   => 1,
+    procfs => 1,
+    kernfs => 1,
+    ptyfs  => 1,
+    tmpfs  => 1,
+);
 
 my $mount_rx = qr|^([/:\w]+)\s+on\s+([/\w]+)\s+type\s+(\w+)|;
 my $swap_rx  = qr|^(/[/\w]+)\s+|;
@@ -55,9 +58,10 @@ sub new
     ref( my $class = shift ) && croak 'Class name required';
     my %args = @_;
     my $self = bless( {}, $class );
+    $args{canondev} and $self->{canondev} = 1;
 
     # Defaults
-    $args{fstab} ||= '/etc/fstab';
+    $args{fstab} ||= $ENV{PATH_FSTAB} || '/etc/fstab';
 
     my @mounts = qx( /sbin/mount );
     $self->readMounts( $mount_rx, [ 0, 1, 2 ], [qw(fs_spec fs_file fs_vfstype fs_mntops)], \%special_fs, @mounts );
@@ -67,6 +71,8 @@ sub new
         croak "Unable to open fstab file ($args{fstab})\n";
     }
 
+    delete $self->{canondev};
+
     return $self;
 }
 
@@ -145,7 +151,7 @@ Jens Rehsack <rehsack@cpan.org> - L<http://www.rehsack.de/>
 
 =head1 COPYRIGHT
 
-Copyright 2009,2013 Jens Rehsack.
+Copyright 2009-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -24,6 +24,8 @@ package Sys::Filesystem::Solaris;
 
 # vim:ts=4:sw=4:tw=78
 
+use 5.008001;
+
 use strict;
 use warnings;
 use vars qw($VERSION @ISA);
@@ -32,7 +34,7 @@ use Carp qw(croak);
 use Data::Dumper;
 require Sys::Filesystem::Unix;
 
-$VERSION = '1.401';
+$VERSION = '1.406';
 @ISA     = qw(Sys::Filesystem::Unix);
 
 sub version()
@@ -43,26 +45,27 @@ sub version()
 my @fstab_keys = qw(device device_to_fsck mount_point fs_vfstype fs_freq mount_at_boot fs_mntops);
 my @mtab_keys  = qw(device mount_point fs_vfstype fs_mntops time);
 my %special_fs = (
-                   swap    => 1,
-                   proc    => 1,
-                   procfs  => 1,
-                   tmpfs   => 1,
-                   mntfs   => 1,
-                   autofs  => 1,
-                   lofs    => 1,
-                   fd      => 1,
-                   ctfs    => 1,
-                   devfs   => 1,
-                   dev     => 1,
-                   objfs   => 1,
-                   cachefs => 1,
-                 );
+    swap    => 1,
+    proc    => 1,
+    procfs  => 1,
+    tmpfs   => 1,
+    mntfs   => 1,
+    autofs  => 1,
+    lofs    => 1,
+    fd      => 1,
+    ctfs    => 1,
+    devfs   => 1,
+    dev     => 1,
+    objfs   => 1,
+    cachefs => 1,
+);
 
 sub new
 {
     ref( my $class = shift ) && croak 'Class name required';
     my %args = @_;
     my $self = bless( {}, $class );
+    $args{canondev} and $self->{canondev} = 1;
 
     $args{fstab} ||= '/etc/vfstab';
     $args{mtab}  ||= '/etc/mnttab';
@@ -77,6 +80,8 @@ sub new
         croak "Unable to open mtab file ($args{mtab})\n";
     }
 
+    delete $self->{canondev};
+
     $self;
 }
 
@@ -167,7 +172,7 @@ Jens Rehsack <rehsack@cpan.org> - L<http://www.rehsack.de/>
 =head1 COPYRIGHT
 
 Copyright 2004,2005,2006 Nicola Worthington.
-Copyright 2009,2013 Jens Rehsack.
+Copyright 2009-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -24,13 +24,18 @@ package Sys::Filesystem::Unix;
 
 # vim:ts=4:sw=4:tw=78
 
+use 5.008001;
+
 use strict;
+use warnings;
+use vars qw($VERSION);
+
 use Carp qw(croak);
+use Cwd 'abs_path';
 use Fcntl qw(:flock);
 use IO::File;
 
-use vars qw($VERSION);
-$VERSION = '1.401';
+$VERSION = '1.406';
 
 sub version()
 {
@@ -38,27 +43,28 @@ sub version()
 }
 
 # Default fstab and mtab layout
-my @keys = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno);
+my @keys       = qw(fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno);
 my %special_fs = (
-                   swap => 1,
-                   proc => 1
-                 );
+    swap => 1,
+    proc => 1
+);
 
 sub new
 {
     ref( my $class = shift ) && croak 'Class name required';
     my %args = @_;
     my $self = bless( {}, $class );
+    $args{canondev} and $self->{canondev} = 1;
 
     # Defaults
     $args{fstab} ||= '/etc/fstab';
     $args{mtab}  ||= '/etc/mtab';
 
-    # $args{xtab}  ||= '/etc/lib/nfs/xtab';
-
     $self->readFsTab( $args{fstab}, \@keys, [ 0, 1, 2 ], \%special_fs );
     $self->readMntTab( $args{mtab}, \@keys, [ 0, 1, 2 ], \%special_fs );
 
+    delete $self->{canondev};
+
     $self;
 }
 
@@ -78,6 +84,7 @@ sub readFsTab($\@\@\%)
             # next if( /^\s*$/ );
 
             my @vals = split( ' ', $_ );
+            $self->{canondev} and -l $vals[ $pridx->[0] ] and $vals[ $pridx->[0] ] = abs_path( $vals[ $pridx->[0] ] );
             $self->{ $vals[ $pridx->[1] ] }->{mount_point} = $vals[ $pridx->[1] ];
             $self->{ $vals[ $pridx->[1] ] }->{device}      = $vals[ $pridx->[0] ];
             $self->{ $vals[ $pridx->[1] ] }->{unmounted}   = 1
@@ -86,7 +93,8 @@ sub readFsTab($\@\@\%)
             if ( defined( $pridx->[2] ) )
             {
                 my $vfs_type = $self->{ $vals[ $pridx->[1] ] }->{fs_vfstype} = $vals[ $pridx->[2] ];
-                $self->{ $vals[ $pridx->[1] ] }->{special} = 1 if ( defined( $special_fs->{$vfs_type} ) );
+                $self->{ $vals[ $pridx->[1] ] }->{special} = 1
+                  if ( defined( $special_fs->{$vfs_type} ) );
             }
             else
             {
@@ -96,7 +104,8 @@ sub readFsTab($\@\@\%)
 
             for ( my $i = 0; $i < @{$fstabKeys}; ++$i )
             {
-                $self->{ $vals[ $pridx->[1] ] }->{ $fstabKeys->[$i] } = defined( $vals[$i] ) ? $vals[$i] : '';
+                $self->{ $vals[ $pridx->[1] ] }->{ $fstabKeys->[$i] } =
+                  defined( $vals[$i] ) ? $vals[$i] : '';
             }
         }
         $fstab->close();
@@ -125,6 +134,7 @@ sub readMntTab($\@\@\%)
             # next if( /^\s*$/ );
 
             my @vals = split( /\s+/, $_ );
+            $self->{canondev} and -l $vals[ $pridx->[0] ] and $vals[ $pridx->[0] ] = abs_path( $vals[ $pridx->[0] ] );
             delete $self->{ $vals[ $pridx->[1] ] }->{unmounted}
               if ( exists( $self->{ $vals[ $pridx->[1] ] }->{unmounted} ) );
             $self->{ $vals[ $pridx->[1] ] }->{mounted}     = 1;
@@ -134,7 +144,8 @@ sub readMntTab($\@\@\%)
             if ( defined( $pridx->[2] ) )
             {
                 my $vfs_type = $self->{ $vals[ $pridx->[1] ] }->{fs_vfstype} = $vals[ $pridx->[2] ];
-                $self->{ $vals[ $pridx->[1] ] }->{special} = 1 if ( defined( $special_fs->{$vfs_type} ) );
+                $self->{ $vals[ $pridx->[1] ] }->{special} = 1
+                  if ( defined( $special_fs->{$vfs_type} ) );
             }
             else
             {
@@ -144,7 +155,8 @@ sub readMntTab($\@\@\%)
 
             for ( my $i = 0; $i < @{$mnttabKeys}; ++$i )
             {
-                $self->{ $vals[ $pridx->[1] ] }->{ $mnttabKeys->[$i] } = defined( $vals[$i] ) ? $vals[$i] : '';
+                $self->{ $vals[ $pridx->[1] ] }->{ $mnttabKeys->[$i] } =
+                  defined( $vals[$i] ) ? $vals[$i] : '';
             }
         }
         $mtab->close();
@@ -164,6 +176,7 @@ sub readMounts
     {
         if ( my @vals = $line =~ $mount_rx )
         {
+            $self->{canondev} and -l $vals[ $pridx->[0] ] and $vals[ $pridx->[0] ] = abs_path( $vals[ $pridx->[0] ] );
             $self->{ $vals[ $pridx->[1] ] }->{mount_point} = $vals[ $pridx->[1] ];
             $self->{ $vals[ $pridx->[1] ] }->{device}      = $vals[ $pridx->[0] ];
             $self->{ $vals[ $pridx->[1] ] }->{mounted}     = 1;
@@ -173,7 +186,8 @@ sub readMounts
             if ( defined( $pridx->[2] ) )
             {
                 my $vfs_type = $self->{ $vals[ $pridx->[1] ] }->{fs_vfstype} = $vals[ $pridx->[2] ];
-                $self->{ $vals[ $pridx->[1] ] }->{special} = 1 if ( defined( $special->{$vfs_type} ) );
+                $self->{ $vals[ $pridx->[1] ] }->{special} = 1
+                  if ( defined( $special->{$vfs_type} ) );
             }
             elsif ( !defined( $self->{ $vals[ $pridx->[1] ] }->{special} ) )
             {
@@ -182,7 +196,8 @@ sub readMounts
 
             for ( my $i = 0; $i < @{$keys}; ++$i )
             {
-                $self->{ $vals[ $pridx->[1] ] }->{ $keys->[$i] } = defined( $vals[$i] ) ? $vals[$i] : '';
+                $self->{ $vals[ $pridx->[1] ] }->{ $keys->[$i] } =
+                  defined( $vals[$i] ) ? $vals[$i] : '';
             }
         }
     }
@@ -197,6 +212,7 @@ sub readSwap
     {
         if ( my ($dev) = $line =~ $swap_rx )
         {
+            $self->{canondev} and -l $dev and $dev = abs_path($dev);
             $self->{none}->{mount_point} ||= 'none';
             $self->{none}->{device}     = $dev;
             $self->{none}->{fs_vfstype} = 'swap';
@@ -351,7 +367,7 @@ Jens Rehsack <rehsack@cpan.org> - L<http://www.rehsack.de/>
 =head1 COPYRIGHT
 
 Copyright 2004,2005,2006 Nicola Worthington.
-Copyright 2008-2013 Jens Rehsack.
+Copyright 2008-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -24,34 +24,34 @@ package Sys::Filesystem;
 
 # vim:ts=4:sw=4:tw=78
 
-use 5.006;
+use 5.008001;
 
 my @query_order;
 
 use strict;
 use warnings;
-use vars qw($VERSION $AUTOLOAD);
+use vars qw($VERSION $AUTOLOAD $CANONDEV $FSTAB $MTAB);
 use Carp qw(croak cluck confess);
 use Module::Pluggable
   require => 1,
-  only =>
-  [ @query_order = map { __PACKAGE__ . '::' . $_ } ucfirst( lc($^O) ), $^O =~ m/Win32/i ? 'Win32' : 'Unix', 'Dummy' ],
-  inner       => 0,
-  search_path => ['Sys::Filesystem'];
+  only  => [ @query_order = map { __PACKAGE__ . '::' . $_ } ( ucfirst( lc $^O ), $^O =~ m/Win32/i ? 'Win32' : 'Unix', 'Dummy' ) ],
+  inner => 0,
+  search_path => ['Sys::Filesystem'],
+  sub_name    => '_plugins';
 use Params::Util qw(_INSTANCE);
 use Scalar::Util qw(blessed);
+use List::Util qw(first);
 
-use constant DEBUG => $ENV{SYS_FILESYSTEM_DEBUG} ? 1 : 0;
-use constant SPECIAL => ( 'darwin' eq $^O ) ? 0 : undef;
-#use constant SPECIAL => undef;
+use constant DEBUG   => $ENV{SYS_FILESYSTEM_DEBUG} ? 1 : 0;
+use constant SPECIAL => ( 'darwin' eq $^O )        ? 0 : undef;
 
-$VERSION = '1.401';
+$VERSION = '1.406';
 
 my ( $FsPlugin, $Supported );
 
 BEGIN
 {
-    Sys::Filesystem->plugins();
+    Sys::Filesystem->_plugins();
 
     foreach my $qo (@query_order)
     {
@@ -60,48 +60,51 @@ BEGIN
         last;
     }
 
-    $Supported = ( $FsPlugin ne 'Sys::Filesystem::Unix' ) && ( $FsPlugin ne 'Sys::Filesystem::Dummy' );
+    $Supported = $FsPlugin ne 'Sys::Filesystem::Unix' and $FsPlugin ne 'Sys::Filesystem::Dummy';
 }
 
 sub new
 {
     # Check we're being called correctly with a class name
-    ref( my $class = shift ) && croak 'Class name required';
+    ref( my $class = shift ) and croak 'Class name required';
 
     # Check we've got something sane passed
     croak 'Odd number of elements passed when even number was expected' if ( @_ % 2 );
     my %args = @_;
 
-    # Double check the key pairs for stuff we recognise
-    while ( my ( $k, $v ) = each(%args) )
-    {
-        unless ( grep( /^$k$/i, qw(fstab mtab xtab) ) )
-        {
-            croak("Unrecognised paramater '$k' passed to module $class");
-        }
-    }
+    exists $args{xtab} and carp("Using xtab is depreciated") and delete $args{xtab};
+    defined $FSTAB    and not exists $args{fstab}    and $args{fstab}    = $FSTAB;
+    defined $MTAB     and not exists $args{mtab}     and $args{mtab}     = $MTAB;
+    defined $CANONDEV and not exists $args{canondev} and $args{canondev} = $CANONDEV;
 
-    my $self = {%args};
-
-    # Filesystem property aliases
-    $self->{aliases} = {
-                         device          => [qw(fs_spec dev)],
-                         filesystem      => [qw(fs_file mount_point)],
-                         mount_point     => [qw(fs_file filesystem)],
-                         type            => [qw(fs_vfstype vfs)],
-                         format          => [qw(fs_vfstype vfs vfstype)],
-                         options         => [qw(fs_mntops)],
-                         check_frequency => [qw(fs_freq)],
-                         check_order     => [qw(fs_passno)],
-                         boot_order      => [qw(fs_mntno)],
-                         volume          => [qw(fs_volume fs_vol vol)],
-                         label           => [qw(fs_label)],
-                       };
+    # Double check the key pairs for stuff we recognise
+    my @sane_keys = qw(aliases canondev fstab mtab);
+    my %sane_args;
+    @sane_args{@sane_keys} = delete @args{@sane_keys};
+    scalar keys %args and croak( "Unrecognised parameter(s) '" . join( "', '", sort keys %args ) . "' passed to module $class" );
+
+    my $self = {%sane_args};
+
+    # Filesystem property aliases - unless caller knows better ...
+    defined $self->{aliases}
+      or $self->{aliases} = {
+        device          => [qw(fs_spec dev)],
+        filesystem      => [qw(fs_file mount_point)],
+        mount_point     => [qw(fs_file filesystem)],
+        type            => [qw(fs_vfstype vfs)],
+        format          => [qw(fs_vfstype vfs vfstype)],
+        options         => [qw(fs_mntops)],
+        check_frequency => [qw(fs_freq)],
+        check_order     => [qw(fs_passno)],
+        boot_order      => [qw(fs_mntno)],
+        volume          => [qw(fs_volume fs_vol vol)],
+        label           => [qw(fs_label)],
+      };
 
     # Debug
     DUMP( '$self', $self ) if (DEBUG);
 
-    $self->{filesystems} = $FsPlugin->new(%args);
+    $self->{filesystems} = $FsPlugin->new(%sane_args);
 
     # Maybe upchuck a little
     croak "Unable to create object for OS type '$self->{osname}'" unless ( $self->{filesystems} );
@@ -121,7 +124,8 @@ sub filesystems
     }
 
     # Check we've got something sane passed
-    croak 'Odd number of elements passed when even number was expected' if ( @_ % 2 );
+    @_ % 2 and croak 'Odd number of elements passed when even number was expected';
+
     my $params = {@_};
     for my $param ( keys %{$params} )
     {
@@ -133,53 +137,34 @@ sub filesystems
     if ( exists $params->{regular} )
     {
         delete $params->{regular};
-        if ( exists( $params->{special} ) )
-        {
-            carp("Both parameters specified, 'special' and 'regular', which are mutually exclusive");
-        }
+        exists( $params->{special} )
+          and carp("Mutual exclusive parameters 'special' and 'regular' specified together");
         $params->{special} = SPECIAL;
     }
 
     my @filesystems = ();
 
     # Return list of all filesystems
-    unless ( keys %{$params} )
-    {
-        @filesystems = sort( keys( %{ $self->{filesystems} } ) );
+    keys %{$params} or return sort( keys( %{ $self->{filesystems} } ) );
 
-        # Return list of specific filesystems
-    }
-    else
+    for my $fsname ( sort( keys( %{ $self->{filesystems} } ) ) )
     {
-        for my $fs ( sort( keys( %{ $self->{filesystems} } ) ) )
+        for my $requirement ( keys( %{$params} ) )
         {
-            for my $requirement ( keys( %{$params} ) )
-            {
-                my $fsreqname = $requirement;
-                if (   !exists( $self->{filesystems}->{$fs}->{$requirement} )
-                     && exists( $self->{aliases}->{$requirement} ) )
-                {
-                    foreach my $fsreqdef ( @{ $self->{aliases}->{$requirement} } )
-                    {
-                        if ( exists( $self->{filesystems}->{$fs}->{$fsreqdef} ) )
-                        {
-                            $fsreqname = $fsreqdef;
-                            last;
-                        }
-                    }
-                }
-                if (
-                     (
-                          ( defined( $params->{$requirement} ) && exists( $self->{filesystems}->{$fs}->{$fsreqname} ) )
-                       && ( $self->{filesystems}->{$fs}->{$fsreqname} eq $params->{$requirement} )
-                     )
-                     || ( !defined( $params->{$requirement} ) && !exists( $self->{filesystems}->{$fs}->{$fsreqname} ) )
-                   )
-                {
-                    push( @filesystems, $fs );
-                    last;
-                }
-            }
+            my $fs = $self->{filesystems}->{$fsname};
+            my $fsreqname =
+              ( !exists $fs->{$requirement} and exists $self->{aliases}->{$requirement} )
+              ? first { exists $fs->{$_} } @{ $self->{aliases}->{$requirement} }
+              : $requirement;
+
+            defined $params->{$requirement}
+              and exists $fs->{$fsreqname}
+              and $fs->{$fsreqname} eq $params->{$requirement}
+              and push( @filesystems, $fsname )
+              and last;
+            push( @filesystems, $fsname ) and last
+              unless defined( $params->{$requirement} )
+              or exists( $fs->{$fsreqname} );
         }
     }
 
@@ -187,7 +172,7 @@ sub filesystems
     return @filesystems;
 }
 
-sub supported()
+sub supported
 {
     return $Supported;
 }
@@ -216,38 +201,27 @@ sub DESTROY { }
 
 sub AUTOLOAD
 {
-    my ( $self, $fs ) = @_;
+    my ( $self, $fsname ) = @_;
 
     croak "$self is not an object" unless ( blessed($self) );
-    croak "No filesystem passed where expected" unless ($fs);
+    croak "No filesystem passed where expected" unless ($fsname);
 
     ( my $name = $AUTOLOAD ) =~ s/.*://;
 
     # No such filesystem
-    unless ( exists $self->{filesystems}->{$fs} )
-    {
-        croak "No such filesystem";
-    }
-    else
-    {
-        # Found the property
-        if ( exists $self->{filesystems}->{$fs}->{$name} )
-        {
-            return $self->{filesystems}->{$fs}->{$name};
-        }
-        elsif ( exists $self->{aliases}->{$name} )
-        {    # Didn't find the property, but check any aliases
-            for my $alias ( @{ $self->{aliases}->{$name} } )
-            {
-                if ( exists $self->{filesystems}->{$fs}->{$alias} )
-                {    # Found the Alias
-                    return $self->{filesystems}->{$fs}->{$alias};
-                }
-            }
-        }
-    }
+    exists $self->{filesystems}->{$fsname} or croak "No such filesystem";
+
+    # Found the property
+    my $fs = $self->{filesystems}->{$fsname};
 
-    return undef;
+    exists $fs->{$name} and return $fs->{$name};
+
+    # Didn't find the property, but check any aliases
+    exists $self->{aliases}->{$name}
+      and $name = first { exists $fs->{$_} } @{ $self->{aliases}->{$name} }
+      and return $fs->{$name};
+
+    return;
 }
 
 sub TRACE
@@ -321,17 +295,28 @@ with common aliases wherever possible.
 
 =item new
 
-Creates a new Sys::Filesystem object. new() accepts 3 optional key pair values
-to help or force where mount information is gathered from. These values are
-not otherwise defaulted by the main Sys::Filesystem object, but left to the
-platform specific helper modules to determine as an exercise of common sense.
+Creates a new Sys::Filesystem object. C<new> accepts following optional key
+value pairs to help or force where mount information is gathered from. These
+values are not otherwise defaulted by the main Sys::Filesystem object, but
+left to the platform specific helper modules to determine as an exercise of
+common sense.
 
 =over 4
 
+=item canondev
+
+Specify whether device path's shall be resolved when they're a symbolic
+link.
+
+C<$Sys::Filesystem::CANONDEV> is used when no key C<canondev> is passed.
+
 =item fstab
 
 Specify the full path and filename of the filesystem table (or fstab for
-short).
+short). Not all platforms have such a file and so this option may be
+ignored on some systems.
+
+C<$Sys::Filesystem::FSTAB> is used when no key C<fstab> is passed.
 
 =item mtab
 
@@ -339,12 +324,25 @@ Specify the full path and filename of the mounted filesystem table (or mtab
 for short). Not all platforms have such a file and so this option may be
 ignored on some systems.
 
+C<$Sys::Filesystem::MTAB> is used when no key C<mtab> is passed.
+
 =item xtab
 
-Specify the full path and filename of the mounted NFS filesystem table
-(or xtab for short). This is usually only pertinant to Unix bases systems.
-Not all helper modules will query NFS mounts as a separate exercise, and
-therefore this option may be ignored on some systems.
+B<DEPRECIATED> Specify the full path and filename of the mounted NFS
+filesystem table (or xtab for short). This is usually only pertinant
+to Unix bases systems.  Not all helper modules will query NFS mounts
+as a separate exercise, and therefore this option may be ignored on
+some systems.
+
+B<None> of the OS plugins use that tunable (anymore?), so it now a warning
+is raised when it's used. The entire support will be removed not before
+2015. Once that happened, using C<xtab> will raise an exception.
+
+=item aliases
+
+Overrides internal aliasing table used to match queries against OS
+plugin. This should be used only when dealing with closed source platform
+helper module(s).
 
 =back
 
@@ -619,7 +617,7 @@ See CREDITS in the distribution tarball.
 
 Copyright 2004,2005,2006 Nicola Worthington.
 
-Copyright 2008-2013 Jens Rehsack.
+Copyright 2008-2014 Jens Rehsack.
 
 This software is licensed under The Apache Software License, Version 2.0.
 
@@ -1,8 +1,16 @@
-# $Id: 00compile.t,v 1.1 2005/12/29 19:49:25 nicolaw Exp $
+#!perl
+
+use strict;
+use warnings;
 
 use Test::More tests => 2;
 
 require_ok('Sys::Filesystem');
 use_ok('Sys::Filesystem');
 
-diag("Testing Sys::Filesystem $Sys::Filesystem::VERSION, Perl $], $^X");
+use Config;
+
+my $os_info = join( "-", $Config{osname}, $Config{osvers} );
+$^O eq "MSWin32" and eval "use Win32;" and $os_info = join( "-", Win32::GetOSName(), Win32::GetOSVersion() );
+
+diag("Testing Sys::Filesystem $Sys::Filesystem::VERSION, Perl $] ($^X) on $os_info");
@@ -1,9 +1,17 @@
+#!perl
+
+use strict;
+use warnings;
+
 use Test::More;
 use Sys::Filesystem;
 
-my $fs;
-eval { $fs = Sys::Filesystem->new(); };
-plan( skip_all => "Cannot initialize Sys::Filesystem" ) if ($@);
+my ( $fs, @filesystems );
+eval { $fs = Sys::Filesystem->new(); @filesystems = $fs->filesystems(); };
+
+$@ and plan skip_all => "Cannot initialize Sys::Filesystem: $@";
+@filesystems or BAIL_OUT("Badly poor supported OS or no file systems found.");
+
 ok( ref($fs) eq 'Sys::Filesystem', 'Create new Sys::Filesystem object' );
 
 my @mounted_filesystems = $fs->mounted_filesystems();
@@ -14,45 +22,44 @@ my @unmounted_filesystems = $fs->unmounted_filesystems();
 my @special_filesystems   = $fs->special_filesystems();
 
 my @regular_filesystems = $fs->regular_filesystems();
-my @filesystems         = $fs->filesystems();
 
-SKIP:
+ok( @regular_filesystems, 'Get list of regular filesystems' );
+ok( @filesystems,         'Get list of all filesystems' );
+
+diag( join( ' - ', qw(filesystem mounted special device options format volume label type) ) );
+for my $filesystem (@filesystems)
 {
-    unless (@filesystems)
-    {
-        skip( 'Badly poor supported OS or no file systems found.', 0 );
-    }
-    else
+    my $mounted = $fs->mounted($filesystem) || 0;
+    my $unmounted = !$mounted;
+    ok( $mounted == grep( /^\Q$filesystem\E$/, @mounted_filesystems ), 'Mounted' );
+    ok( $unmounted == grep( /^\Q$filesystem\E$/, @unmounted_filesystems ), 'Unmounted' );
+
+    my $special = $fs->special($filesystem) || 0;
+    my $regular = !$special;
+    ok( $special == grep( /^\Q$filesystem\E$/, @special_filesystems ), 'Special' );
+    ok( $regular == grep( /^\Q$filesystem\E$/, @regular_filesystems ), 'Regular' );
+
+    my ( $device, $options, $format, $volume, $label, $type );
+    ok( $device = $fs->device($filesystem), "Get device for $filesystem" );
+    ok( defined( $options = $fs->options($filesystem) ), "Get options for $filesystem: $options" );
+  SKIP:
     {
-        ok( @regular_filesystems, 'Get list of regular filesystems' );
-        ok( @filesystems,         'Get list of all filesystems' );
-
-        for my $filesystem (@filesystems)
-        {
-            my $mounted = $fs->mounted($filesystem) || 0;
-            my $unmounted = !$mounted;
-            ok( $mounted == grep( /^\Q$filesystem\E$/, @mounted_filesystems ), 'Mounted' );
-            ok( $unmounted == grep( /^\Q$filesystem\E$/, @unmounted_filesystems ), 'Unmounted' );
-
-            my $special = $fs->special($filesystem) || 0;
-            my $regular = !$special;
-            ok( $special == grep( /^\Q$filesystem\E$/, @special_filesystems ), 'Special' );
-            ok( $regular == grep( /^\Q$filesystem\E$/, @regular_filesystems ), 'Regular' );
-
-            my ( $device, $options, $format, $volume, $label );
-            ok( $device = $fs->device($filesystem), "Get device for $filesystem" );
-            ok( defined( $options = $fs->options($filesystem) ), "Get options for $filesystem: $options" );
-            ok( $format = $fs->format($filesystem), "Get format for $filesystem" );
-            ok( $volume = $fs->volume($filesystem) || 1, "Get volume type for $filesystem" );
-            ok( $label  = $fs->label($filesystem)  || 1, "Get label for $filesystem" );
-            diag(join( ' - ', $filesystem, $mounted, $special, $device, $options, $format, $volume || '', $label || '' )
-                );
-        }
-
-        my $device = $fs->device( $filesystems[0] );
-        ok( my $foo_filesystem = Sys::Filesystem::filesystems( device => $device ),
-            "Get filesystem attached to $device" );
+        $format = $fs->format($filesystem);
+        $mounted or skip( "Format might be unavailable unless mounted", 1 );
+        ok( $format, "Get format for $filesystem" );
     }
+    ok( $volume = $fs->volume($filesystem) || 1, "Get volume type for $filesystem" );
+    ok( $label  = $fs->label($filesystem)  || 1, "Get label for $filesystem" );
+
+    $type = $fs->type($filesystem);
+    diag(
+        join( ' - ',
+            $filesystem, $mounted, $special, $device, $options,
+            $format || 'n/a', $volume || 'n/a', $label || 'n/a', $type || 'n/a' )
+    );
 }
 
+my $device = $fs->device( $filesystems[0] );
+ok( my $foo_filesystem = Sys::Filesystem::filesystems( device => $device ), "Get filesystem attached to $device" );
+
 done_testing();
@@ -1,3 +1,8 @@
+#!perl
+
+use strict;
+use warnings;
+
 use Test::More;
 use Sys::Filesystem;
 use Cwd qw(abs_path);
@@ -14,7 +19,8 @@ $RealTest = ucfirst($RealTest) if ( $^O =~ m/Win32/ );
 
 my $sfs;
 eval { $sfs = Sys::Filesystem->new(); };
-plan( skip_all => "Cannot initialize Sys::Filesystem" ) if ($@);
+$@ and plan skip_all => "Cannot initialize Sys::Filesystem: $@";
+
 ok( ref($sfs) eq 'Sys::Filesystem', 'Create new Sys::Filesystem object' );
 
 my ( $binmount, $mymount );
@@ -47,9 +53,8 @@ SKIP:
   TODO:
     {
         local $TODO = "Known fail for MSWin32, cygwin & Co. - let's make it not so important ...";
-        ok( $mymount, sprintf( q{Found mountpoint for test file '%s' at '%s'}, $RealTest, $mymount || '<n/a>' ) );
-        ok( $binmount,
-            sprintf( q{Found mountpoint for perl executable '%s' at '%s'}, $RealPerl, $binmount || '<n/a>' ) );
+        ok( $mymount,  sprintf( q{Found mountpoint for test file '%s' at '%s'},       $RealTest, $mymount  || '<n/a>' ) );
+        ok( $binmount, sprintf( q{Found mountpoint for perl executable '%s' at '%s'}, $RealPerl, $binmount || '<n/a>' ) );
     }
 }
 
@@ -1,7 +1,16 @@
+#!perl
+
+use strict;
+use warnings;
+
 use Test::More;
 use Sys::Filesystem;
 
-my $fs = Sys::Filesystem->new();
+my $fs;
+eval { $fs = Sys::Filesystem->new(); };
+
+$@ and plan skip_all => "Cannot initialize Sys::Filesystem: $@";
+
 ok( ref($fs) eq 'Sys::Filesystem', 'Create new Sys::Filesystem object' );
 
 my @special_filesystems = $fs->special_filesystems();
@@ -0,0 +1,23 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More;
+use Sys::Filesystem;
+
+my $fs;
+eval { $fs = Sys::Filesystem->new(); };
+
+$@ and plan skip_all => "Cannot initialize Sys::Filesystem: $@";
+
+eval { $fs = $fs->new(); };
+like( $@, qr/Class name required/, "No object new" );
+
+eval { $fs = Sys::Filesystem->new( insane => 1 ); };
+like( $@, qr/Unrecognised.*insane.*/, "No insane parameters" );
+
+eval { $fs = Sys::Filesystem->new('insane'); };
+like( $@, qr/Odd number of elements passed when even number was expected/, "No odd parameter list" );
+
+done_testing();
@@ -0,0 +1,64 @@
+#!perl
+
+use strict;
+use warnings;
+
+use Test::More;
+use Sys::Filesystem;
+
+delete @ENV{qw(CANONDEV FSTAB MTAB)};
+
+my ( $fs, @filesystems );
+eval { $fs = Sys::Filesystem->new(); };
+
+$@ and plan skip_all => "Cannot initialize Sys::Filesystem: $@";
+@filesystems = $fs->filesystems;
+
+my %devsymlinks;
+for my $filesystem (@filesystems)
+{
+    my $device = $fs->device($filesystem);
+    -l $device and $devsymlinks{$filesystem} = $device;
+}
+
+$fs = Sys::Filesystem->new( canondev => 1 );
+@filesystems = $fs->filesystems;
+
+for my $filesystem (@filesystems)
+{
+    my $device = $fs->device($filesystem);
+    ok( !-l $device, "$device is not a symlink (canondev => 1)" );
+}
+
+SCOPE:
+{
+    local $Sys::Filesystem::CANONDEV = 0;
+    $fs          = Sys::Filesystem->new();
+    @filesystems = $fs->filesystems;
+    my %symdevs;
+    for my $filesystem (@filesystems)
+    {
+        my $device = $fs->device($filesystem);
+        -l $device and $symdevs{$filesystem} = $device;
+    }
+    is_deeply( \%symdevs, \%devsymlinks, "\$S::F::CANONDEV = 0 works as expected" );
+}
+
+SCOPE:
+{
+    local $Sys::Filesystem::CANONDEV = 1;
+    $fs          = Sys::Filesystem->new();
+    @filesystems = $fs->filesystems;
+    for my $filesystem (@filesystems)
+    {
+        my $device = $fs->device($filesystem);
+        ok( !-l $device, "$device is not a symlink (\$S::F::CANONDEV = 1)" );
+    }
+}
+
+# Testing $S::F::MTAB and/or $S::F::FSTAB is pointless - half of the
+# plugins ignore at least one, likely both
+
+# devnull
+
+done_testing;