#! /usr/bin/perl -w # # $Id$ # External mount command for mount(8) to interface lufsd(1) # Copyright (C) 2003 Jan Kratochvil # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; exactly version 2 of June 1991 is required # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA use strict; use Carp qw(cluck confess); use Getopt::Long; # Do not use any non-core Perl modules here. # Be perl-5.0 compatible (is it needed if we require Linux kernel >= 2.4 ?) my $vardir='@localstatedir@/lib/captive'; $vardir=~s#\$\Q{prefix}\E#'@prefix@';#ge; $vardir="/var/lib/captive" if $vardir=~/^@/; my $lufsd_bin='@PATH_LUFSD@'; $lufsd_bin="/usr/bin/lufsd" if $lufsd_bin=~/^@/; my $captive_sandbox_server_bin='@libexecdir@/captive-sandbox-server'; $captive_sandbox_server_bin=~s#\$\Q{exec_prefix}\E#'@exec_prefix@';#ge; $captive_sandbox_server_bin=~s#\$\Q{prefix}\E#'@prefix@';#ge; $captive_sandbox_server_bin="/usr/libexec/captive-sandbox-server" if $captive_sandbox_server_bin=~/^@/; my $ME=($0=~m#([^/]*)$#)[0] or die "Cannot detetect my basename from: $0"; my $fsname=$ME; $fsname=~s/^mount[.]captive-// or die "Cannot detect captive filesystem module from my name: $fsname"; my $image=shift @ARGV or die "Missing argv[1]: device or image pathname"; -r $image or die "Image pathname not readable: $image"; warn "warning: '-o loop' is not neccessary for Captive filesystem mounts" if $image=~m#^/dev/loop#; my $dir=shift @ARGV or die "Missing argv[2]: mount point directory"; -d $dir or die "Mount point directory not a valid directory: $dir"; shift @ARGV if my $nomtab =$ARGV[0] && $ARGV[0] eq "-n"; shift @ARGV if my $verbose=$ARGV[0] && $ARGV[0] eq "-v"; my $oo=""; do { shift @ARGV; $oo=shift @ARGV; } if $ARGV[0] && $ARGV[0] eq "-o"; die "Excessive arguments: @ARGV" if @ARGV; sub die_install { die "You should run captive-install-acquire(1) of 'captive-install' package, otherwise you can also acquire this file from URL: http://www.microsoft.com/WindowsXP/pro/downloads/servicepacks/sp1/checkedbuild.asp "; } my $filesystem=$vardir."/".$fsname.".sys"; if (!-r $filesystem) { warn "W32 filesystem .sys module not found: $filesystem"; die_install(); } my $ntoskrnl=$vardir."/ntoskrnl.exe"; if (!-r $ntoskrnl) { warn "W32 ntoskrnl.exe not found: $ntoskrnl"; die_install(); } # Keep @opt_captive ordering # to let the options be overridable by user (such as 'ro'). my @opt_captive=(); my @opt_lufs=(); my $opt_force; my $opt_rwmode="--blind"; for (split /,/,$oo) { $_="--$_" if $_ eq "ro" || $_ eq "rw"; $opt_rwmode=$_ if /^--(?:ro|rw|blind)$/; $opt_force=1 if $_ eq "force"; push @opt_captive,$_ if /^--/; push @opt_lufs,$_ if !/^--/; } # Shameless advertisement: if ($fsname eq "ntfs") { for my $fh (*STDERR,*STDOUT) { if (-t $fh) { print $fh 'Captive NTFS v@VERSION@. Check a new version at: http://www.jankratochvil.net/'."\n"; last; } } } if (!$opt_force) { local *MTAB; if (!open MTAB,"/etc/mtab") { warn "Cannot open /etc/mtab: $!"; } else { local $/=undef(); my $mtab=; close MTAB; die "" ."$ME: $image already mounted\n" ."$ME: according to mtab, $image is mounted on $1\n" ."$ME: Use '-o force' to mount the image notwithstanding.\n" if $mtab=~/^\Q$image\E\s+(\S+)/m; } } $oo="" ."fs=captivefs," ."mntent.mnt_fsname=$image,mntent.mnt_type=captive-$fsname," # Double-dashes forbidden. ."dir_cache_entries=0," ."image=$image," .join(",",@opt_lufs)."," ."captive_options=" .($fsname eq "cdfs" ? "--cdrom;--ro;" : "--disk;--rw;") ."--load-module=$ntoskrnl;--filesystem=$filesystem;" ."--sandbox-server=$captive_sandbox_server_bin;" ."--bug-pathname=$vardir/bug-%FT%T.captivebug.xml.gz;" ."--syslog;" .join(";",@opt_captive); warn "$0: '-n' not supported - ignored" if $nomtab; # Use "'$oo'" to permit another expansion by bash(1) during lufsmnt(8) execution. my @argv=($lufsd_bin,"none",$dir,"-o",$oo); print STDERR "$0: @argv\n" if $verbose; exec $lufsd_bin @argv; die "Failed to execute: @argv";