Cosmetic: Include suggestion for W32 drivers acquire possibilities.
[captive.git] / src / client / lufs / mount.captive.in
1 #! /usr/bin/perl -w
2
3 # $Id$
4 # External mount command for mount(8) to interface lufsmount(1)
5 # Copyright (C) 2003 Jan Kratochvil <project-captive@jankratochvil.net>
6
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; exactly version 2 of June 1991 is required
10
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20
21 use strict;
22 use Carp qw(cluck confess);
23 use Getopt::Long;
24 # Do not use any non-core Perl modules here.
25 # Be perl-5.0 compatible (is it needed if we require Linux kernel >= 2.4 ?)
26
27
28 my $vardir='@localstatedir@/lib/captive';
29 $vardir=~s#\$\Q{prefix}\E#'@prefix@';#ge;
30 $vardir="/var/lib/captive" if $vardir=~/^@/;
31 my $lufsmount_bin='@bindir@/lufsmount';
32 $lufsmount_bin=~s#\$\Q{exec_prefix}\E#'@exec_prefix@';#ge;
33 $lufsmount_bin=~s#\$\Q{prefix}\E#'@prefix@';#ge;
34 $lufsmount_bin="/usr/bin/lufsmount" if $lufsmount_bin=~/^@/;
35 my $captive_sandbox_server_bin='@sbindir@/captive-sandbox-server';
36 $captive_sandbox_server_bin=~s#\$\Q{exec_prefix}\E#'@exec_prefix@';#ge;
37 $captive_sandbox_server_bin=~s#\$\Q{prefix}\E#'@prefix@';#ge;
38 $captive_sandbox_server_bin="/usr/sbin/captive-sandbox-server" if $captive_sandbox_server_bin=~/^@/;
39
40
41 my $fsname=($0=~m#([^/]*)$#)[0] or die "Cannot detetect my basename from: $0";
42 $fsname=~s/^mount[.]captive-// or die "Cannot detect captive filesystem module from my name: $fsname";
43 my $image=shift @ARGV or die "Missing argv[1]: device or image pathname";
44 -r $image or die "Image pathname not readable: $image";
45 my $dir=shift @ARGV or die "Missing argv[2]: mount point directory";
46 -d $dir or die "Mount point directory not a valid directory: $dir";
47 shift @ARGV if my $nomtab =$ARGV[0] && $ARGV[0] eq "-n";
48 shift @ARGV if my $verbose=$ARGV[0] && $ARGV[0] eq "-v";
49 my $oo="";
50 do { shift @ARGV; $oo=shift @ARGV; } if $ARGV[0] && $ARGV[0] eq "-o";
51 die "Excessive arguments: @ARGV" if @ARGV;
52
53 sub die_install
54 {
55         die
56 "You should run captive-install-acquire(1) of 'captive-install' package,
57 otherwise you can also acquire this file from URL:
58 http://www.microsoft.com/WindowsXP/pro/downloads/servicepacks/sp1/checkedbuild.asp
59 ";
60 }
61
62 my $filesystem=$vardir."/".$fsname.".sys";
63 if (!-r $filesystem) {
64         warn "W32 filesystem .sys module not found: $filesystem";
65         die_install();
66         }
67 my $ntoskrnl=$vardir."/ntoskrnl.exe";
68 if (!-r $ntoskrnl) {
69         warn "W32 ntoskrnl.exe not found: $ntoskrnl";
70         die_install();
71         }
72
73 # Shameless advertisement:
74 if ($fsname eq "ntfs") {
75         for my $fh (*STDERR,*STDOUT) {
76                 if (-t $fh) {
77                         print $fh "Captive NTFS activated. Updates: http://www.jankratochvil.net/project/captive/\n";
78                         last;
79                         }
80                 }
81         }
82
83
84 # Double-dashes are generally optional here.
85 $oo=""
86                 .($fsname eq "cdfs" ? "--cdrom,--ro," : "--disk,--rw,")
87                 ."--load-module=$ntoskrnl,--filesystem=$filesystem,"
88                 ."--sandbox-server=$captive_sandbox_server_bin,"
89                 ."--bug-pathname=$vardir/bug-%FT%T.captivebug.xml.gz,"
90                 ."--syslog,"
91                 ."mntent.mnt_fsname=$image,mntent.mnt_type=captive-$fsname,"    # Double-dashes forbidden.
92                 ."dir_cache_entries=0,"
93                 ."image=$image,"
94                 .$oo;
95
96 warn "$0: '-n' not supported - ignored" if $nomtab;
97
98 # Use "'$oo'" to permit another expansion by bash(1) during lufsmnt(8) execution.
99 my @argv=($lufsmount_bin,"captivefs://",$dir,"-o","'$oo'");
100
101 print STDERR "$0: @argv\n" if $verbose;
102 exec $lufsmount_bin @argv;
103 die "Failed to execute: @argv";