From 0cd0034a3935f56a2a91e63185da84a150b20832 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Mon, 18 Oct 2010 10:54:22 +0100 Subject: [PATCH] reworked DB::new et al *again* --- bin/id3fs-index | 20 ++++++++++++++++---- lib/ID3FS/DB.pm | 52 +++++++++++++++++++--------------------------------- sbin/id3fsd | 2 +- 3 files changed, 36 insertions(+), 38 deletions(-) diff --git a/bin/id3fs-index b/bin/id3fs-index index 88959f7..22cdf79 100755 --- a/bin/id3fs-index +++ b/bin/id3fs-index @@ -30,15 +30,27 @@ my $optret=GetOptions( "list|l" => \$list, ); +if($list && !@ARGV) +{ + push(@ARGV, "."); +} usage() if(!@ARGV || !$optret || $help); $init=1 unless($list); -if(@ARGV > 1 && !defined($basedir)) +unless(defined($basedir) && defined($dbpath)) { - die("$me: --basedir must be specified if multiple paths are supplied\n"); + $basedir=ID3FS::DB::find_db($me, $init, @ARGV); + exit unless($basedir); + my $absbase=Cwd::abs_path($basedir); + for my $dir (@ARGV) + { + if(Cwd::abs_path($dir) !~ /^\Q$absbase\E/) + { + die("$me: $dir: must be under basedir $absbase - use --basedir to specify\n"); + } + } } - -my $db=ID3FS::DB->new($me, $verbose, $init, $dbpath, $basedir, $ARGV[0]); +my $db=ID3FS::DB->new($me, $verbose, $init, $basedir, $dbpath); exit unless($db); if($list) diff --git a/lib/ID3FS/DB.pm b/lib/ID3FS/DB.pm index 246cd92..6b3cd99 100644 --- a/lib/ID3FS/DB.pm +++ b/lib/ID3FS/DB.pm @@ -19,12 +19,8 @@ sub new $self->{me}=shift; $self->{verbose}=shift; my $init=shift; - my $dbpath=shift; $self->{base}=shift; - my $fallbackdir=shift; - - $self->{dbpath}=$self->find_db($init, $dbpath, $fallbackdir); - return undef unless($self->{dbpath}); + $self->{dbpath}=shift || ($self->{base} . "/" . $dbfile); $self->{absbase}=Cwd::abs_path($self->{base}); my $connectstr="dbi:SQLite:dbname=$self->{dbpath}"; @@ -50,46 +46,36 @@ sub new sub find_db { - my($self, $init, $dbpath, $fallbackdir)=@_; - my $file=undef; + # class method + shift if(ref($_[0]) eq "ID3FS::DB"); + + my($me, $init, @dirs)=@_; my $base=undef; - if(defined($dbpath)) - { - $file=$dbpath; - } - if(defined ($self->{base})) - { - $file="$self->{base}/$dbfile" unless defined($file); - $base=$self->{base}; - } - elsif(defined($fallbackdir) && -d $fallbackdir) + for my $dir (@dirs) { - my $path=Cwd::abs_path($fallbackdir); + my $path=Cwd::abs_path($dir); do { - $file="$path/$dbfile"; $base=$path; $path=~s/(.*)\/.*/$1/; } - while(! -f $file && length($path) && -d $path); - if(! -f $file) + while(! -f "$base/$dbfile" && length($path) && -d $path); + if(-f "$base/$dbfile") { - $file="$fallbackdir/$dbfile"; - $base=$fallbackdir; + return $base; } } - else - { - print "$self->{me}: $fallbackdir: not a directory\n"; - return undef; - } - if(!-f $file && !$init) + if(!-f "$base/$dbfile") { - print "$self->{me}: db not found at $file\n"; - return undef; + unless($init) + { + print "$me: db not found at $base/$dbfile\n"; + return undef; + } + $base=$dirs[0]; + } - $self->{base}=$base; - return $file; + return $base; } sub base_dir { return shift->{base}; } diff --git a/sbin/id3fsd b/sbin/id3fsd index b46706a..1c36e66 100755 --- a/sbin/id3fsd +++ b/sbin/id3fsd @@ -29,7 +29,7 @@ usage() if(scalar(@ARGV) != 2 || !$optret || $help); my $source=shift; my $mountpoint=shift; -my $db=ID3FS::DB->new($me, $verbose, 0, $dbpath, $source); +my $db=ID3FS::DB->new($me, $verbose, 0, $source, $dbpath); exit unless($db); my $fuse=ID3FS::Fuse->new($db, $source, $mountpoint, $verbose, $tagdepth); -- 2.11.0