use PublicInbox::Eml;
use POSIX qw(strftime);
use PublicInbox::DS qw(now);
-use Digest::SHA qw(sha1_hex);
+use PublicInbox::SHA qw(sha1_hex);
use Time::Local qw(timegm timelocal);
use PublicInbox::GitAsyncCat;
use PublicInbox::Address;
my $res = eval { $req->($self, @args) };
my $err = $@;
if ($err && $self->{sock}) {
- local $/ = "\n";
- chomp($l);
- err($self, 'error from: %s (%s)', $l, $err);
+ $l =~ s/\r?\n//s;
+ warn("error from: $l ($err)\n");
$res = \"503 program fault - command not performed\r\n";
}
defined($res) ? $self->write($res) : 0;
sub list_active_i { # "LIST ACTIVE" and also just "LIST" (no args)
my ($self, $ibxs) = @_;
my @window = splice(@$ibxs, 0, 1000);
- $self->msg_more(join('', map { group_line($_) } @window));
+ emit_group_lines($self, \@window);
scalar @$ibxs; # continue if there's more
}
my ($self, $beg, $end) = @_;
my $r = $self->{ibx}->mm(1)->msg_range($beg, $end, 'num');
scalar(@$r) or return;
- $self->msg_more(join("\r\n", @$r, ''));
+ $self->msg_more(join('', map { "$_->[0]\r\n" } @$r));
1;
}
}
}
-sub group_line ($) {
- my ($ibx) = @_;
- my ($min, $max) = $ibx->mm(1)->minmax;
- "$ibx->{newsgroup} $max $min n\r\n";
+sub emit_group_lines {
+ my ($self, $ibxs) = @_;
+ my ($min, $max);
+ my $ALL = $self->{nntpd}->{pi_cfg}->ALL;
+ my $misc = $ALL->misc if $ALL;
+ my $buf = '';
+ for my $ibx (@$ibxs) {
+ $misc ? $misc->inbox_data($ibx) :
+ delete(@$ibx{qw(-art_min -art_max)});
+ ($min, $max) = ($ibx->art_min, $ibx->art_max);
+ $buf .= "$ibx->{newsgroup} $max $min n\r\n";
+ }
+ $self->msg_more($buf);
}
sub newgroups_i {
my ($self, $ts, $ibxs) = @_;
my @window = splice(@$ibxs, 0, 1000);
- $self->msg_more(join('', map { group_line($_) } grep {
- (eval { $_->uidvalidity } // 0) > $ts
- } @window));
- scalar @$ibxs;
+ @window = grep { (eval { $_->uidvalidity } // 0) > $ts } @window;
+ emit_group_lines($self, \@window);
+ scalar @$ibxs; # any more?
}
sub cmd_newgroups ($$$;$$) {
'223 '.join(' ', sort(@paths))."\r\n";
}
-sub err ($$;@) {
- my ($self, $fmt, @args) = @_;
- printf { $self->{nntpd}->{err} } $fmt."\n", @args;
-}
-
sub out ($$;@) {
my ($self, $fmt, @args) = @_;
printf { $self->{nntpd}->{out} } $fmt."\n", @args;
# callback used by PublicInbox::DS for any (e)poll (in/out/hup/err)
sub event_step {
my ($self) = @_;
-
+ local $SIG{__WARN__} = $self->{nntpd}->{warn_cb};
return unless $self->flush_write && $self->{sock} && !$self->{long_cb};
# only read more requests if we've drained the write buffer,