Config-Model
view release on metacpan or search on metacpan
lib/Config/Model/FuseUI.pm view on Meta::CPAN
sub fetch_as_line ($obj) {
my $v = $obj->fetch( check => 'no' );
$v = '' unless defined $v;
# let's append a \n so that returned files always have a line ending
$v .= "\n" unless $v =~ /\n$/;
return $v;
}
sub get_object ($name) {
return _get_object( $name, 0 );
}
sub get_or_create_object {
my $name = shift;
return _get_object( $name, 1 );
}
sub _get_object ($name, $autoadd) {
my $obj = $fuseui->root->get(
path => $name,
check => 'skip',
get_obj => 1,
autoadd => $autoadd,
dir_char_mockup => $dir_char_mockup
);
$logger->debug( "FuseUI _get_object on $name returns ",
( defined $obj ? $obj->name : '<undef>' ) );
return $obj;
}
sub getattr ($name) {
$logger->trace("FuseUI getattr called with $name");
my $obj = get_object($name);
return -&ENOENT() unless ref $obj;
my $type = $obj->get_type;
# return -ENOENT() unless exists($files{$file});
my $size;
if ( $type eq 'leaf' or $type eq 'check_list' ) {
$size = length( fetch_as_line($obj) );
}
else {
# fuseui_obj->children does not return the right data in scalar context
my @c = $obj->children;
$size = @c;
}
my $mode;
if ( $type eq 'leaf' or $type eq 'check_list' ) {
$mode = S_IFREG | oct(644);
}
else {
$mode = S_IFDIR | oct(755);
}
my ( $dev, $ino, $rdev, $blocks, $gid, $uid, $nlink, $blksize ) =
( 0, 0, 0, 1, $EGID, $EUID, 1, 1024 );
my ( $atime, $ctime, $mtime );
$atime = $ctime = $mtime = time;
# 2 possible types of return values:
#return -ENOENT(); # or any other error you care to
#print(join(",",($dev,$ino,$modes,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)),"\n");
my @r = (
$dev, $ino, $mode, $nlink, $uid, $gid, $rdev,
$size, $atime, $mtime, $ctime, $blksize, $blocks
);
$logger->trace( "FuseUI getattr returns '" . join( "','", @r ) . "'" );
return @r;
}
## no critic (Subroutines::ProhibitBuiltinHomonyms)
sub open ($name, $flags, $info) {
$logger->trace("FuseUI open called on $name");
my $obj = $fuseui->root->get( path => $name, check => 'skip', get_obj => 1 );
return -ENOENT() unless defined $obj;
my $type = $obj->get_type;
return -EISDIR() unless ( $type eq 'leaf' or $type eq 'check_list' );
if ($flags & O_TRUNC) {
# must be able to clear a mandatory value
$obj->clear(check => 'no');
$logger->debug("FuseUI open with truncate on $name ok");
return 0;
}
$logger->debug("FuseUI open on $name ok");
return 0;
}
## no critic (Subroutines::ProhibitBuiltinHomonyms)
sub read ($name, $buf, $off, $) {
# return an error numeric, or binary/text string. (note: 0 means EOF, "0" will
# give a byte (ascii "0") to the reading program)
$logger->trace("FuseUI read called on $name");
my $obj = get_or_create_object($name);
my $type = $obj->get_type;
return -ENOENT() unless defined $obj;
return -EISDIR() unless ( $type eq 'leaf' or $type eq 'check_list' );
my $v = fetch_as_line($obj);
return -EINVAL() if $off > length($v);
return 0 if $off == length($v);
my $ret = substr( $v, $off, $buf );
$logger->debug("FuseUI read returns '$ret'");
return "$ret";
}
## no critic (Subroutines::ProhibitBuiltinHomonyms)
sub truncate ($name, $off) {
$logger->trace("FuseUI truncate called on $name with length $off");
my $obj = get_or_create_object($name);
my $type = $obj->get_type;
return -ENOENT() unless defined $obj;
return -EISDIR() unless ( $type eq 'leaf' or $type eq 'check_list' );
my $v = substr fetch_as_line($obj), 0, $off;
( run in 2.600 seconds using v1.01-cache-2.11-cpan-5735350b133 )