[Mew-dist 03483] MsgDB for Win95

Hideyuki SHIRAI Shirai at example.com
1998年 1月 23日 (金) 15:53:30 JST


白井です。

UNIX上では水戸さんの『mew-summary-search-parent』や、
『imcat --join』を便利に使わせていただいているのですが、Win95上
ではMsgDBが動かないので、**とりあえず** 動かすpatchです。

1. SDBMにだけ対応しました。
2. Win-NT、OS2のことは知らないのですが、適当にみつくろいました。
 勘違いしていたらごめんなさい。
3. crlfで保存されているメールにAnnotateすると、改行コードが元の
メール内で混在します。


で、なにが **とりあえず** かというと……

Win95のPerlにはflockがないため排他制御が出来ません。最初、
LockFileを作る方向で考えたのですが、im_link、im_unlink、
im_renameにどうしても対処出来なかったため、最終的には全く排他制御
をしていません。

しかし、相当実験をしましたが、一度もMsgDBファイルが壊れなかった
ため、めんどくさくなって考えるのを止めてしまいました。 (^^;;;

# まぁ、MsgDBファイルが壊れても、imhist --add で直せるからいいかな?
# 致命的じゃないしぃ、という軟弱な考えが…

というわけで、im-83へのpatchです。
実験してみてもらえるとうれしいです。
排他制御を考えていただけると、もっとうれしいです。(^^;

-------------- next part --------------
*** imput.in.orig	Wed Jan 14 14:43:13 1998
--- imput.in	Fri Jan 23 13:26:54 1998
***************
*** 1571,1576 ****
--- 1571,1578 ----
  	    close(ORIGINAL);
  	    return -1;
  	}
+ 	binmode(TMP) if(win95p() || os2p());
+ 	binmode(ORIGINAL) if(win95p() || os2p());
  	print TMP $first . $second;
  	my $checked = 0;
  	while (<ORIGINAL>) {
***************
*** 1613,1618 ****
--- 1615,1622 ----
  	    unlink($tmp);
  	    return -1;
  	}
+ 	binmode(TMP) if(win95p() || os2p());
+ 	binmode(ORIGINAL) if(win95p() || os2p());
  	my $size = -s ORIGINAL;
  	seek(ORIGINAL, 0, 2);
  	unless (print ORIGINAL $first . $second) {
***************
*** 1636,1641 ****
--- 1640,1647 ----
  	    unlink($tmp);
  	    return -1;
  	}
+ 	binmode(TMP) if(win95p() || os2p());
+ 	binmode(ORIGINAL) if(win95p() || os2p());
  	while (<TMP>) {
  	    unless (print ORIGINAL $_) {
  		close(TMP);
-------------- next part --------------
*** History.pm.in.orig	Wed Jan 14 14:43:19 1998
--- History.pm.in	Fri Jan 23 12:31:46 1998
***************
*** 86,92 ****
      } elsif ($DBtype eq 'NDBM') {
  	$db = tie %History, 'NDBM_File', $dbfile, O_CREAT|O_RDWR, &msg_mode(0);
      } elsif ($DBtype eq 'SDBM') {
! 	$db = tie %History, 'SDBM_File', $dbfile, O_CREAT|O_RDWR, &msg_mode(0);
      }
  
      unless ($db) {
--- 86,96 ----
      } elsif ($DBtype eq 'NDBM') {
  	$db = tie %History, 'NDBM_File', $dbfile, O_CREAT|O_RDWR, &msg_mode(0);
      } elsif ($DBtype eq 'SDBM') {
! 	if (&win95p || &os2p){
! 	    $db = tie %History, 'SDBM_File', $dbfile, O_CREAT|O_RDWR|O_BINARY, &msg_mode(0);
! 	} else {
! 	    $db = tie %History, 'SDBM_File', $dbfile, O_CREAT|O_RDWR, &msg_mode(0);
! 	}
      }
  
      unless ($db) {
***************
*** 114,125 ****
  	    return -1;
  	}
      }
! 
!     unless (flock (HIST_FH, LOCK_EX | LOCK_NB)) {
! 	im_warn "history: waiting for write lock ($!)\n";
! 	unless (flock (HIST_FH, LOCK_EX)) {
! 	    im_err "history: flock ($!)\n";
! 	    return -1;
  	}
      }
      $locked = 1;
--- 118,130 ----
  	    return -1;
  	}
      }
!     if (!(&win95p && !&wntp)){
! 	unless (flock (HIST_FH, LOCK_EX | LOCK_NB)) {
! 	    im_warn "history: waiting for write lock ($!)\n";
! 	    unless (flock (HIST_FH, LOCK_EX)) {
! 		im_err "history: flock ($!)\n";
! 		return -1;
! 	    }
  	}
      }
      $locked = 1;
***************
*** 132,139 ****
  	im_err("no database specified.\n");
  	return;
      }
!     if ($locked) {
! 	flock(HIST_FH, LOCK_UN);
      }
      untie %History;
      if ($locked) {
--- 137,146 ----
  	im_err("no database specified.\n");
  	return;
      }
!     if (!(&win95p && !&wntp)){
! 	if ($locked) {
! 	    flock(HIST_FH, LOCK_UN);
! 	}
      }
      untie %History;
      if ($locked) {
-------------- next part --------------

--
白井秀行 (H.Shirai)


Mew-dist メーリングリストの案内