drewk has asked for the wisdom of the Perl Monks concerning the following question:

Is there an easy way to determine if a given path is on a network drive vs a local drive?

The environment is OS X (BSD), but I am looking for the Perl Unix way of doing it. I know how to do it on Windows.

I have looked at stat, and there is the method of looking at the device number like this:
if (-x $file && (($d) = stat(_)) && $d < 0) { print "$file is executable NFS file\n"; }
I am looking for a more general way to detect if the file is on a network device, and the type of network if so. Respectfully submitted with thanks...

Replies are listed 'Best First'.
Re: Network Drive?
by Tanktalus (Canon) on Sep 29, 2005 at 23:21 UTC

    To be honest, I'm not sure how to do that, either. For example, you can check the filesystem driver, but NFS is far from the only non-local filesystem there is. There's AFS and DFS, off the top of my head. Then there are drivers that sit on top of other drivers, such as Rational's MVFS. Next way is to check against known local filesystems - but there are even more varieties here. ext3, ext2, ntfs, hpfs, fat, vfat, jfs, jfs2, vfs, resierfs, ... And then there's drivers that sit on top of these as well, such as IBM's Datalinks product's dlfs (sits on jfs, vfs, or ntfs, depending on the OS). So that's no good.

    The only way I can think of is to check the output from mount or df. e.g., "df -k /some/dir" will report on /some/dir if that's the mountpoint, or /some, or /, depending on where the filesystem is mounted. If the filesystem it reports has a colon, it's remote. If there is no slash in there, then it's a pseudo-filesystem.

    Personally, we've always gone for the documentation approach on this. "Don't use an NFS partition." If they try it, it may work, great. But if it doesn't work, we point to the documentation. ;-)

      This was kinda the way I was going:

      1) lsvfs produces a list of all file systems and their count

      2) df -t (fs) produces mount points for each given fs type

      I can then associate them in Perl. However, before I go though all that work, I just wanted to know if there was an easier way.
Re: Network Drive?
by talexb (Chancellor) on Sep 30, 2005 at 02:28 UTC

    I think if you ran the df command that might give you the information you needed -- either it leads with /dev or /mnt and it's local, or it's something else and it's a network drive.

    That's a not a cut-and-dried solution, but it might get you started.

    Alex / talexb / Toronto

    "Groklaw is the open-source mentality applied to legal research" ~ Linus Torvalds

      Have you read the source for df and mount to see how they do it? Then presumably you could take that little snippet of C and wrap it up in a module. You may need to make the C bit platform-specific.
Re: Network Drive?
by spatterson (Pilgrim) on Sep 30, 2005 at 15:46 UTC
    If its close enough to regular BSD, the mount command will give you a list of mounted devices and network drives.
    just another cpan module author