getattr => sub { $self->getattr(@_); },
readlink => sub { $self->readlink(@_); },
getdir => sub { $self->getdir(@_); },
+
# Not used
# mknod => sub { $self->mknod(@_); },
# mkdir => sub { $self->mkdir(@_); },
# print "**GETDIR: $filename\n";
my $path=ID3FS::Path->new($self->{db}, $filename);
return(-ENOENT()) unless($path->isvalid());
- if($path->isdir())
+ return(-ENOTDIR()) unless($path->isdir());
+ my @dents=();
+ my($dirs, $files)=$path->dirents();
+ push(@dents, $self->filter($filename, @$dirs));
+ push(@dents, @$files);
+ if(@dents)
+ {
+ return( (".", "..", @dents, 0) );
+ }
+ return(0);
+}
+
+sub filter
+{
+ my($self, $base, @dirs)=@_;
+ my @outdirs=();
+ for my $dir (@dirs)
{
- return(".", "..", $path->dirents(), 0);
+ print "hascontents: $base / $dir\n";
+ my $path=ID3FS::Path->new($self->{db}, "$base/$dir");
+ next unless($path->isvalid());
+ my($subdirs,$subfiles)=$path->dirents();
+ print "SUBDENTS: ", join(", ", @$subdirs, @$subfiles), "\n";
+ next unless(@$subdirs || @$subfiles);
+ if(!@$subfiles || scalar(@$subdirs) < 3)
+ {
+ my $subdirents=0;
+ for my $subdir (@$subdirs)
+ {
+ if(grep { $_ eq $subdir; } qw(AND OR NOT))
+ {
+ my $subsubpath=ID3FS::Path->new($self->{db}, "$base/$dir/$subdir");
+ if($path->isvalid())
+ {
+ my($subsubdirs,$subsubfiles)=$subsubpath->dirents();
+ $subdirents++ if(@$subsubdirs || @$subsubfiles);
+ }
+ }
+ else
+ {
+ $subdirents++;
+ }
+ }
+ next unless($subdirents);
+ }
+ push(@outdirs, $dir);
}
- return -ENOTDIR();
+ return(@outdirs)
}
# unused stubs