Shiino Yuki
shiin****@be*****
2006年 1月 3日 (火) 20:26:23 JST
椎野です。 以前投稿したコードにバグを発見したので、その修正版を再投稿します。 socket-input-port に :buffering :full を指定すれば read-block は指定したバイト数のデータを必ず読み込んでくれる、と 勘違いしていました。 read-blockは指定したバイト数のデータを読み込むとは限らないことを 考慮して、読み込んだデータが指定バイト数より少ない場合には、 続きのデータを読み込むように実装を修正しました。 修正箇所は recv-literal メソッドのみです。 shell> diff -Naur rfc/imap4.scm.old rfc/imap4.scm --- rfc/imap4.scm.old 2005-11-19 19:28:16.000000000 +0900 +++ rfc/imap4.scm 2006-01-01 21:05:07.000000000 +0900 @@ -416,10 +416,16 @@ line)) (define-method recv-literal ((self <imap4>) num-of-bytes) - (let ((literal - (read-block num-of-bytes (input-port-of self :buffering :full)))) - ((imap4-input-logger self) literal) - literal)) + (let ((literal (make-u8vector num-of-bytes))) + (let loop ((nbytes 0)) + (if (< nbytes num-of-bytes) + (let ((n (read-block! literal (input-port-of self :buffering :full) nbytes))) + (when (eof-object? n) + (error <imap4-error> "unexpected eof in literal.")) + (loop (+ nbytes n))) + (let ((str (u8vector->string literal))) + ((imap4-input-logger self) str) + str))))) (define-method recv-resp ((self <imap4>) . expecteds) (define (search-match index expecteds line) -- 椎野 裕樹 -------------- next part -------------- 文字コード指定の無い添付文書を保管しました... 名前: imap4.scm 下載