empty => [qw(empty nonempty)],
erase => [qw(erase erase_scoped)],
gzip => [qw(gzip gunzip)],
- io => [qw(read_all)],
+ io => [qw(is_readable is_writable read_all)],
load => [qw(load_optional load_xs try_load_optional)],
search => [qw(query search simple_expression_query)],
text => [qw(snakify trim)],
return $out;
}
+=func is_readable
+
+=func is_writable
+
+ $bool = is_readable($mode);
+ $bool = is_writable($mode);
+
+Determine of an C<fopen>-style mode is readable, writable or both.
+
+=cut
+
+sub is_readable { $_[0] !~ /^[aw]b?$/ }
+sub is_writable { $_[0] !~ /^rb?$/ }
+
=func is_uuid
$bool = is_uuid($thing);
use Errno;
use File::KDBX::Error;
-use File::KDBX::Util qw(load_optional);
+use File::KDBX::Util qw(:io load_optional);
use IO::Handle;
use namespace::clean;
sub PUSHED {
my ($class, $mode) = @_;
- $ENV{DEBUG_STREAM} and print STDERR "PUSHED\t$class\n";
- my $buf = '';
+ $ENV{DEBUG_STREAM} and print STDERR "PUSHED\t$class (mode: $mode)\n";
my $self = bless {
- buffer => \$buf,
+ buffer => \(my $buf = ''),
mode => $mode,
- $mode =~ /^r/ ? (inflator => _inflator(@PUSHED_ARGS)) : (),
- $mode =~ /^w/ ? (deflator => _deflator(@PUSHED_ARGS)) : (),
+ is_readable($mode) ? (inflator => _inflator(@PUSHED_ARGS)) : (),
+ is_writable($mode) ? (deflator => _deflator(@PUSHED_ARGS)) : (),
}, $class;
@PUSHED_ARGS = ();
return $self;
}
delete $self->{inflator};
+ delete $self->{deflator};
return undef;
}
my ($self, $buf, $fh) = @_;
$ENV{DEBUG_STREAM} and print STDERR "WRITE\t$self\n";
- return 0 if $self->EOF($fh);
+ return 0 if $self->EOF($fh) || !$self->deflator;
my $status = $self->deflator->deflate($buf, my $out);
$status == Compress::Raw::Zlib::Z_OK() or do {
my ($self, $fh) = @_;
$ENV{DEBUG_STREAM} and print STDERR "POPPED\t$self\n";
- return if $self->EOF($fh) || $self->mode !~ /^w/;
+ return if $self->EOF($fh) || !is_writable($self->mode);
# finish
my $status = $self->deflator->flush(my $out, Compress::Raw::Zlib::Z_FINISH());
+ delete $self->{inflator};
delete $self->{deflator};
$status == Compress::Raw::Zlib::Z_OK() or do {
$self->_set_error("Failed to compress: $status", status => $status);
return 0;
}
-sub EOF {
+sub EOF {
$ENV{DEBUG_STREAM} and print STDERR "EOF\t$_[0]\n";
- (!$_[0]->inflator && !$_[0]->deflator) || $_[0]->ERROR($_[1]);
+ !($_[0]->{inflator} || $_[0]->{deflator}) || $_[0]->ERROR($_[1]);
}
-sub ERROR {
+sub ERROR {
$ENV{DEBUG_STREAM} and print STDERR "ERROR\t$_[0] : ", $_[0]->{error} // 'ok', "\n";
$ERROR = $_[0]->{error} if $_[0]->{error};
$_[0]->{error} ? 1 : 0;
use warnings;
use strict;
+use Errno;
use File::KDBX::Error;
+use File::KDBX::Util qw(:io);
use IO::Handle;
use namespace::clean;
sub PUSHED {
my ($class, $mode) = @_;
- $ENV{DEBUG_STREAM} and print STDERR "PUSHED\t$class\n";
+ $ENV{DEBUG_STREAM} and print STDERR "PUSHED\t$class (mode: $mode)\n";
%PUSHED_ARGS or throw 'Programmer error: Use PerlIO::via::File::KDBX::Crypt->push instead of binmode';
- my $buf = '';
my $self = bless {
- buffer => \$buf,
+ buffer => \(my $buf = ''),
cipher => $PUSHED_ARGS{cipher},
mode => $mode,
}, $class;
my ($self, $fh) = @_;
$ENV{DEBUG_STREAM} and print STDERR "POPPED\t$self\n";
- return if $self->EOF($fh) || $self->mode !~ /^w/;
+ return if $self->EOF($fh) || !is_writable($self->mode);
${$self->buffer} .= eval { $self->cipher->finish } || '';
if (my $err = $@) {
return 0;
}
-# sub EOF { !$_[0]->cipher || $_[0]->ERROR($_[1]) }
-# sub ERROR { $_[0]->{error} ? 1 : 0 }
-# sub CLEARERR { delete $_[0]->{error}; 0 }
-
-sub EOF {
+sub EOF {
$ENV{DEBUG_STREAM} and print STDERR "EOF\t$_[0]\n";
- !$_[0]->cipher || $_[0]->ERROR($_[1]);
+ !$_[0]->{cipher} || $_[0]->ERROR($_[1]);
}
-sub ERROR {
+sub ERROR {
$ENV{DEBUG_STREAM} and print STDERR "ERROR\t$_[0] : ", $_[0]->{error} // 'ok', "\n";
$_[0]->{error} ? 1 : 0;
}
use strict;
use Crypt::Digest qw(digest_data);
+use Errno;
use File::KDBX::Error;
use File::KDBX::Util qw(:io);
use IO::Handle;
sub PUSHED {
my ($class, $mode) = @_;
- $ENV{DEBUG_STREAM} and print STDERR "PUSHED\t$class\n";
- my $buf = '';
+ $ENV{DEBUG_STREAM} and print STDERR "PUSHED\t$class (mode: $mode)\n";
my $self = bless {
algorithm => $PUSHED_ARGS{algorithm} || $ALGORITHM,
block_index => 0,
block_size => $PUSHED_ARGS{block_size} || $BLOCK_SIZE,
- buffer => \$buf,
+ buffer => \(my $buf = ''),
eof => 0,
mode => $mode,
}, $class;
return 0;
}
-sub EOF {
+sub EOF {
$ENV{DEBUG_STREAM} and print STDERR "EOF\t$_[0]\n";
$_[0]->{eof} || $_[0]->ERROR($_[1]);
}
-sub ERROR {
+sub ERROR {
$ENV{DEBUG_STREAM} and print STDERR "ERROR\t$_[0] : ", $_[0]->{error} // 'ok', "\n";
$ERROR = $_[0]->{error} if $_[0]->{error};
$_[0]->{error} ? 1 : 0;
use Crypt::Digest qw(digest_data);
use Crypt::Mac::HMAC qw(hmac);
+use Errno;
use File::KDBX::Error;
use File::KDBX::Util qw(:io assert_64bit);
use namespace::clean;
%PUSHED_ARGS or throw 'Programmer error: Use PerlIO::via::File::KDBX::HmacBlock->push instead of binmode';
- $ENV{DEBUG_STREAM} and print STDERR "PUSHED\t$class\n";
- my $buf = '';
+ $ENV{DEBUG_STREAM} and print STDERR "PUSHED\t$class (mode: $mode)\n";
my $self = bless {
block_index => 0,
block_size => $PUSHED_ARGS{block_size} || $BLOCK_SIZE,
- buffer => \$buf,
+ buffer => \(my $buf = ''),
key => $PUSHED_ARGS{key},
mode => $mode,
}, $class;
return 0;
}
-sub EOF {
+sub EOF {
$ENV{DEBUG_STREAM} and print STDERR "EOF\t$_[0]\n";
$_[0]->{eof} || $_[0]->ERROR($_[1]);
}
-sub ERROR {
+sub ERROR {
$ENV{DEBUG_STREAM} and print STDERR "ERROR\t$_[0] : ", $_[0]->{error} // 'ok', "\n";
$ERROR = $_[0]->{error} if $_[0]->{error};
$_[0]->{error} ? 1 : 0;