From eb98d37f4a2ff614889f70f0dfa639ac8600a920 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Sat, 2 Oct 2010 06:20:52 +0100 Subject: [PATCH] relativise symbolic links --- lib/ID3FS/DB.pm | 38 ++++++++++++++++++++++++++++++++++++-- lib/ID3FS/Fuse.pm | 5 +++-- lib/ID3FS/Path.pm | 5 ++--- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/lib/ID3FS/DB.pm b/lib/ID3FS/DB.pm index 15855b2..9930609 100644 --- a/lib/ID3FS/DB.pm +++ b/lib/ID3FS/DB.pm @@ -385,7 +385,7 @@ sub tracks sub filename { - my($self, @constraints)=@_; + my($self, $mountpoint, @constraints)=@_; if(ref($constraints[$#constraints]) eq "ID3FS::PathElement::File") { my $id=$constraints[$#constraints]->{id}; @@ -395,11 +395,45 @@ sub filename "GROUP BY paths.name, files.name"); print "FILENAME SQL: $sql\n"; my ($path, $name)=$self->cmd_onerow($sql, $id); - return($self->{absbase} . "/$path/$name"); + my $id3fs_path=join('/', map { $_->{name}; } @constraints); + return($self->relativise($path, $name, $mountpoint, $id3fs_path)); } die("DB::filename: unhandled case\n"); #FIXME } +sub relativise +{ + my($self, $path, $name, $mountpoint, $id3fs_path)=@_; + $id3fs_path=~s/(.*)\/.*/$1/; + my $rpath="$self->{absbase}/$path"; + my $vpath="$mountpoint/$id3fs_path"; + my @path=split(/\//,$rpath); + my @rel=split(/\//,$vpath); + #absolute paths have empty first element due to leading / + shift(@path) if($path[0] eq ""); + shift(@rel) if($rel[0] eq ""); + if($path[0] ne $rel[0]) + { + #no path in common, return absolute + print "FAIL: NO PATHS IN COMMON\n"; + return $name; + } + # f: /home/foo/bar/baz.mp3 + # r: /home/ianb/music/albums + while(@path && @rel && ($path[0] eq $rel[0])) + { + shift(@path); + shift(@rel); + print "POP "; + } + print "\n"; + my $upcount=scalar(@rel); + my $result="../" x $upcount; + $result .= join("/",@path); + $result .= "/$name"; + return $result; +} + sub bare_tags { my($self)=@_; diff --git a/lib/ID3FS/Fuse.pm b/lib/ID3FS/Fuse.pm index 2a02276..bbf6f34 100644 --- a/lib/ID3FS/Fuse.pm +++ b/lib/ID3FS/Fuse.pm @@ -4,6 +4,7 @@ use strict; use warnings; use ID3FS::Path; use Fuse; +use Cwd; use POSIX qw(EINVAL EROFS ENOENT EOPNOTSUPP S_IRUSR S_IRGRP S_IROTH S_IXUSR S_IXGRP S_IXOTH); our ($TYPE_DIR, $TYPE_SYMLINK)=(0040, 0120); @@ -16,7 +17,7 @@ sub new $self->{db}=shift; $self->{source}=shift; - $self->{mountpoint}=shift; + $self->{mountpoint}=Cwd::abs_path(shift); $self->{debug}=shift; $self->{perms} = S_IRUSR() | S_IXUSR() | S_IRGRP() | S_IXGRP() | S_IROTH() | S_IXOTH(); @@ -83,7 +84,7 @@ sub readlink # print "**READLINK: $filename\n"; my $path=ID3FS::Path->new($self->{db}, $filename); return(-EINVAL()) unless($path->isfile()); - return $path->dest(); + return $path->dest($self->{mountpoint}); } sub getdir diff --git a/lib/ID3FS/Path.pm b/lib/ID3FS/Path.pm index fdef5c3..25e4092 100644 --- a/lib/ID3FS/Path.pm +++ b/lib/ID3FS/Path.pm @@ -53,10 +53,10 @@ sub isvalid sub dest { - my($self)=@_; + my($self, $mountpoint)=@_; if($self->state() == $STATE_FILE) { - return $self->{db}->filename(@{$self->{elements}}); + return $self->{db}->filename($mountpoint, @{$self->{elements}}); } return "ERROR"; #should never happen? } @@ -271,7 +271,6 @@ sub parse { # print "SM: TRACKLIST: $name\n"; my $track=ID3FS::PathElement::File->new($self->{db}, $name); - push(@{$self->{elements}}, $track); if($track) { push(@{$self->{elements}}, $track); -- 2.11.0