[Mew-dist 07112] RE: RETR/DELE message
KOIE Hidetaka ( 鯉江英隆 )
koie at example.com
1998年 12月 16日 (水) 14:25:41 JST
とりあえず、1つだけRETRを先行して送信するパッチを作成しました。
当然、無保証です。
RETRメッセージの送信でブロックする可能性がありますが、
「2つRETRを送信するだけだったら、普通、ブロックせんだろう」
と期待しています。
あとコマンドラインオプションで--pipeliningをつけたかったのですが
わたしはperlの文法を知らないので、
このパッチは常にpipelineモードで動作します:-)
--
KOIE Hidetaka 鯉江英隆 <hide at example.com>
-------------- next part --------------
--- Pop.pm.orig Wed Dec 16 12:48:27 1998
+++ Pop.pm Wed Dec 16 13:55:08 1998
@@ -171,6 +171,51 @@
return 0;
}
+#PIPLINING
+sub pop_retr_req ($) {
+ my ($num) = @_;
+ local ($_);
+ my (@Message);
+ im_notice("getting(req) message $num.\n");
+ &send_data(\*POPd, "RETR $num", '');
+ return 0;
+}
+
+#PIPLINING
+sub pop_retr_resp ($$) {
+ my ($num, $dst) = @_;
+ local ($_);
+ my (@Message);
+ im_notice("getting(resp) message $num.\n");
+ my $resp = &next_response(\*POPd);
+ if ($resp !~ /^\+/) {
+ im_warn("RETR command failed.\n");
+ return -1;
+ }
+ alarm(pop_timeout()) unless win95p();
+ $! = 0;
+ while (<POPd>) {
+ unless (win95p()) {
+ alarm(0);
+ if ($!) { # may be channel truoble
+ im_warn("lost connection for RETR.\n");
+ return -1;
+ }
+ }
+ s/\r\n$/\n/;
+ last if ($_ =~ /^\.\n$/);
+ s/^\.//;
+ im_debug($_) if (&debug('pop'));
+ push (@Message, $_);
+ }
+ alarm(0) unless win95p();
+
+ return -1 if (&store_message(\@Message, $dst) < 0);
+ &exec_getsbrfile($dst);
+
+ return 0;
+}
+
sub pop_head ($) {
my $num = shift;
im_notice("getting header of message $num.\n");
@@ -426,6 +471,7 @@
my ($accesstime, $i, $h, $head);
my $got = 0;
my $ttl = 0;
+ my $ahead = -1;
if ($msgs <= 0) {
im_info("no message at $host.\n");
@@ -490,11 +536,30 @@
# # XXX everything will be kept
}
}
- return -1 if (&pop_retr($i, $dst) < 0);
- $got++;
+
+ if (1 == 1) { # XXX: if ($main::opt_pipelining != 0)
+ return -1 if (&pop_retr_req($i) < 0);
+ if ($ahead == -1) {
+ $ahead = $i;
+ } else {
+ return -1 if (&pop_retr_resp($ahead, $dst) < 0);
+ $ahead = $i;
+ $got++;
+ }
+ } else {
+ return -1 if (&pop_retr($i, $dst) < 0);
+ $got++;
+ }
if ($main::opt_keep == 0) {
# delete current message
return -1 if (&pop_dele($i) < 0);
+ }
+ }
+ if (1 == 1) { # XXX: if ($main::opt_pipelining != 0)
+ if ($ahead != -1) {
+ return -1 if (&pop_retr_resp($ahead, $dst) < 0);
+ $ahead = -1;
+ $got++;
}
}
flush('STDOUT');
Mew-dist メーリングリストの案内