Fuse-Class

 view release on metacpan or  search on metacpan

test/fuse28.pm  view on Meta::CPAN


    foreach my $name ($dir->readdir) {
	push(@list, [$i++, $name]);
    }

    if ($offset < $#list) {
	return (@list[$offset..$#list], 0);
    }

    return (0);
}

sub readdir_test_type_2 {
    my $self = shift;
    my ($path, $offset, $dh) = @_;

    my $dir = $self->{handle}->{$dh};
    return (-2) unless ($dir);

    # print STDERR "readdir_test_type_2, path=$path, offset=$offset\n";

    my $i = 1;
    my @list;

    foreach my $name ($dir->readdir) {
	my $entity = $self->pickup("$path/$name");
	next unless ($entity);

	push(@list, [$i++, $name, [$entity->attr]]);
    }

    if ($offset < $#list) {
	return (@list[$offset..$#list], 0);
    }

    return (0);
}

sub releasedir {
    my $self = shift;
    my ($path, $dh) = @_;

    if ($self->{handle}->{$dh}) {
	$self->release_handle($dh);
	return 0;
    }

    return -2;
}

sub chmod {
    my $self = shift;
    my ($path, $modes) = @_;

    my $entity = $self->pickup($path);
    return -2 unless ($entity);

    $entity->chmod($modes);
}

sub chown {
    my $self = shift;
    my ($path, $uid, $gid) = @_;

    my $entity = $self->pickup($path);
    return -2 unless ($entity);

    $entity->chown($uid, $gid);
}

sub ftruncate {
    my $self = shift;
    my ($path, $offset, $fh) = @_;

    my $entity = $self->{handle}->{$fh};
    return (-2) unless ($entity);
    return (-1) unless ($entity->can('truncate'));

    $entity->truncate($offset);
}

sub truncate {
    my $self = shift;
    my ($path, $offset) = @_;

    my $entity = $self->pickup($path);
    return -2 unless ($entity);
    return -1 unless ($entity->can('truncate'));

    $entity->truncate($offset);
}

sub utime {
    my $self = shift;
    my ($path, $atime, $mtime) = @_;

    # die "utimens must be called";
    return -1;
}

sub open {
    my $self = shift;
    my ($path, $flags, $fileinfo) = @_;

    my $entity = $self->pickup($path);
    return (-2) unless ($entity);

    return (0, $self->issue_handle($entity));
}

sub write {
    my $self = shift;
    my ($path, $buffer, $offset, $fh) = @_;

    my $entity = $self->{handle}->{$fh};
    return (-2) unless ($entity);
    return (-1) unless ($entity->can('write'));

    $entity->write($buffer, $offset);
}

sub read {
    my $self = shift;
    my ($path, $size, $offset, $fh) = @_;

    my $entity = $self->{handle}->{$fh};
    return (-2) unless ($entity);
    return (-1) unless ($entity->can('read'));

test/fuse28.pm  view on Meta::CPAN

    return Errno::EXISTS if ($self->pickup($path));

    my $ret = $dir->mknod($name, $mask, 0);
    return ($ret) if ($ret != 0);

    my $entity = $self->pickup($path);
    return (-2) unless ($entity);

    return (0, $self->issue_handle($entity));
}

package test::fuse28::Entity;

my $last_ino = 0;

sub new {
    my $class = shift;

    my $t = time;

    my $self = {
	# ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
	# $atime,$mtime,$ctime,$blksize,$blocks)
	attr => [0, $last_ino++, 0, 1, $>+0, $)+0, 0, 0,
		 $t, $t, $t, 1024, 0],
    };

    $self->{attr}->[8] = $t;
    $self->{attr}->[9] = $t;
    $self->{attr}->[10] = $t;

    bless $self, $class;
}

sub attr {
    my $self = shift;
    return @{$self->{attr}};
}

sub chmod {
    my $self = shift;
    my ($modes) = @_;

    my $attr = $self->{attr}->[2] & ~(07777);
    $self->{attr}->[2] = $attr | $modes;

    return 0;
}

sub utimens {
    my $self = shift;
    my ($atime, $mtime) = @_;

    my $attr = $self->{attr};
    $attr->[8] = $atime if ($atime >= 0);
    $attr->[9] = $mtime if ($mtime >= 0);

    return 0;
}

sub chown {
    my $self = shift;
    my ($uid, $gid) = @_;

    $self->{attr}->[4] = $uid if ($uid >= 0);
    $self->{attr}->[5] = $gid if ($gid >= 0);

    return 0;
}

#
# Directory
#
package test::fuse28::Directory;

use Fcntl qw(:mode);
use base qw(test::fuse28::Entity);
use Scalar::Util qw(weaken);

sub new {
    my $class = shift;
    my $parent = shift;

    my $self = $class->SUPER::new;
    $self->{attr}->[2] = S_IFDIR | S_IRWXU;

    if (!defined($parent)) {
	$self->{parent} = $self;
    }
    else {
	$self->{parent} = $parent;
    }

    $self->{children} = {};

    # avoid cyclic reference
    weaken($self->{parent});

    bless $self, $class;
}

sub parent {
    my $self = shift;
    return $self->{parent};
}

sub entity {
  my $self = shift;
  my $name = shift;

  return $self if ($name eq '.');
  return $self->parent if ($name eq '..');

  return $self->{children}->{$name};
}

sub readdir {
  my $self = shift;
  return ('..', '.', keys %{$self->{children}});
}



( run in 1.578 second using v1.01-cache-2.11-cpan-71847e10f99 )