# $Id: tmfs,v 1.4 2009-12-09 07:10:45 az Exp $ 
use strict;
use Fuse::TM;
use TM 1.43;
use Getopt::Std;
use File::Basename;


=head1 NAME

tmfs - Mount Topic Map as Filesystem

=head1 SYNOPSIS 

 tmfs [options] <mapfile> </path/to/mountpoint>


tmfs is a frontend for L<Fuse::TM> for mounting a Topic Map
at a particular mountpoint. Any map format known to 
L<TM> is supported (e.g. AsTMa, LTM, CTM, XTM and MLDBM).

When run without options, tmfs mounts the given mapfile read-only
at the ountpoint and blocks until an unmount is triggered 
(see L<fusermount>).

See L<Fuse::TM> for description of the filesystem layout.

=head1 OPTIONS


=item -d N

Debugging. Set N=1 for internal debugging, N=2 for Fuse debugging as well.

=item -b

Fork and Background before mounting.

=item -h 

Hide infrastructure topics.

=item -w

Read-write mode.

=item -W

Read-write mode with topic autogeneration for implied topics.

=item -o URI

Sets the output URI for write mode. See L<Fuse::TM> and L<TM::Serializable> for details.


Overrides the file extension-based guessing of the input driver backend.
Must be the name of a TM class that supports sync_in.

=item -l

Shows the default list of file extensions and associated input drivers, then


Overrides the output driver backend. If not given the input driver will
be used. 

Note that if you override this, you B<must> use
TM::Synchronizable::XX (for MLDBM) and TM::Serializable::XX (for text-based formats) 
drivers instead of TM::Materialized::XX. This makes little sense, but that's the
way the TM module universe is structured (see L<TM::FAQ>).



my $usage="usage: ".basename($0)." [-d N] [-bhl] [-w|-W] [-o uri] [-i driver] [-e driver] <mapfile> <mountpoint>
-b: background before mounting
-d: 1 internal debug info, 2+ fuse also
-h: hide infrastructure topics
-w: read-write mode
-W: ditto with topic autocreation
-o: sets output uri for saving in r/w mode (e.g. io:stdout, file:./x.atm).
    see man TM::Resourceable for url format.
-i: argument overrules import TM driver defaults 
-l: show file extensions / TM driver defaults
-o: argument overrules output TM driver (defaults to input driver. 
    You must use TM::Serializable::XX for text-based formats 
    and TM::Synchronizable::MLDBM for db, TM::Materialized::XX will NOT WORK.)

my %opts;
die $usage if (!getopts("bd:hwWo:i:e:l",\%opts)) ;

my %defdrivers=("atm"=>"TM::Materialized::AsTMa",

if ($opts{l})
    print "\nDefault TM drivers:\nExt\tDriver\n==============\n";
    print map { ".$_\t$defdrivers{$_}\n" } sort keys(%defdrivers);
    print "\n";
    exit 0;

my ($mapfile,$mountpt)=@ARGV;
die $usage if (!-e $mapfile || !-d $mountpt);

my $indriver=$opts{i};
if (!$indriver)
    for my $k (keys %defdrivers)
	if ($mapfile=~/\.$k$/)
die "can't find input driver!\n" if (!$indriver);

eval "require $indriver";
die "can't load input driver module \"$indriver\": $@" if ($@);

my $tm=$indriver->new(file=>$mapfile)
    || die "can't create map object!\n";

my $tmfs=Fuse::TM->new(tm=>$tm,

if ($opts{b})
    exit 0 if (fork);

exit 0;


=head1 SEE ALSO

L<Fuse::TM(3)>, L<TM(3)>

=head1 AUTHOR

Alexander Zangerl, <alphazulu@cpan.org>


Copyright 2009 Alexander Zangerl

This library is free software; you can redistribute it and/or modify it under the same terms as Perl