[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 メーリングリストの案内