Hi all,
this patch adds a body_fh() call to Qpsmtpd::Transaction. It returns a
file handle to the temporary file with the message (or undef if the file
is not open yet).
The first diff is a minimum, i.e. just adds the sub and pod, the second
replaces (nearly) all $self->{_body_file} with $self->body_fh.
If you wonder why this is needed, see my next mail ;-)
Hanno
--- 0.3x/lib/Qpsmtpd/Transaction.pm 2005-11-20 10:52:18.000000000 +0100
+++ chunk/lib/Qpsmtpd/Transaction.pm 2006-03-27 09:19:04.000000000 +0200
@@ -110,6 +110,10 @@
$self->{_body_array} = undef;
}
+sub body_fh {
+ $_[0]->{_body_file} || undef;
+}
+
sub body_write {
my $self = shift;
my $data = shift;
@@ -294,6 +298,11 @@
Returns the temporary filename used to store the message contents; useful for
virus scanners so that an additional copy doesn't need to be made.
+=head2 body_fh ( )
+
+Returns a file handle to the temporary file with the message (or undef if the
+file is not open yet).
+
=head2 body_write( $data )
Write data to the end of the email.
--- ../0.3x/lib/Qpsmtpd/Transaction.pm 2005-11-20 10:52:18.000000000 +0100
+++ lib/Qpsmtpd/Transaction.pm 2006-07-23 09:51:07.000000000 +0200
@@ -61,7 +61,7 @@
sub set_body_start {
my $self = shift;
$self->{_body_start} = $self->body_current_pos;
- if ($self->{_body_file}) {
+ if ($self->body_fh) {
$self->{_header_size} = $self->{_body_start};
}
else {
@@ -82,8 +82,8 @@
sub body_current_pos {
my $self = shift;
- if ($self->{_body_file}) {
- return tell($self->{_body_file});
+ if ($self->body_fh) {
+ return tell($self->body_fh);
}
return $self->{_body_current_pos} || 0;
}
@@ -91,7 +91,7 @@
sub body_filename {
my $self = shift;
$self->body_spool() unless $self->{_filename};
- $self->{_body_file}->flush(); # so contents won't be cached
+ $self->body_fh->flush(); # so contents won't be cached
return $self->{_filename};
}
@@ -103,23 +103,27 @@
or die "Could not open file $self->{_filename} - $! "; # .
$self->{_body_file}->error;
if ($self->{_body_array}) {
foreach my $line (@{ $self->{_body_array} }) {
- $self->{_body_file}->print($line) or die "Cannot print to temp file: $!";
+ $self->body_fh->print($line) or die "Cannot print to temp file: $!";
}
$self->{_body_start} = $self->{_header_size};
}
$self->{_body_array} = undef;
}
+sub body_fh {
+ $_[0]->{_body_file} || undef;
+}
+
sub body_write {
my $self = shift;
my $data = shift;
- if ($self->{_body_file}) {
+ if ($self->body_fh) {
#warn("body_write to file\n");
# go to the end of the file
- seek($self->{_body_file},0,2)
+ seek($self->body_fh,0,2)
unless $self->{_body_file_writing};
$self->{_body_file_writing} = 1;
- $self->{_body_file}->print(ref $data eq "SCALAR" ? $$data : $data)
+ $self->body_fh->print(ref $data eq "SCALAR" ? $$data : $data)
and $self->{_body_size} += length (ref $data eq "SCALAR" ? $$data :
$data);
}
else {
@@ -148,9 +152,9 @@
sub body_resetpos {
my $self = shift;
- if ($self->{_body_file}) {
+ if ($self->body_fh) {
my $start = $self->{_body_start} || 0;
- seek($self->{_body_file}, $start, 0);
+ seek($self->body_fh, $start, 0);
$self->{_body_file_writing} = 0;
}
else {
@@ -162,12 +166,12 @@
sub body_getline {
my $self = shift;
- if ($self->{_body_file}) {
+ if ($self->body_fh) {
my $start = $self->{_body_start} || 0;
- seek($self->{_body_file}, $start,0)
+ seek($self->body_fh, $start,0)
if $self->{_body_file_writing};
$self->{_body_file_writing} = 0;
- my $line = $self->{_body_file}->getline;
+ my $line = $self->body_fh->getline;
return $line;
}
else {
@@ -195,7 +199,7 @@
# would we save some disk flushing if we unlinked the file before
# closing it?
- undef $self->{_body_file} if $self->{_body_file};
+ undef $self->{_body_file} if $self->body_fh;
if ($self->{_filename} and -e $self->{_filename}) {
unlink $self->{_filename} or $self->log(LOGERROR, "Could not unlink ",
$self->{_filename}, ": $!");
}
@@ -294,6 +298,11 @@
Returns the temporary filename used to store the message contents; useful for
virus scanners so that an additional copy doesn't need to be made.
+=head2 body_fh ( )
+
+Returns a file handle to the temporary file with the message (or undef if the
+file is not open yet).
+
=head2 body_write( $data )
Write data to the end of the email.