[mew-dist 27460] Re: mewest for Windows
KIMURA Yasuhiro
yasu at example.com
2006年 11月 4日 (土) 13:26:50 JST
From: KIMURA Yasuhiro <yasu at example.com>
Subject: [mew-dist 27458] mewest for Windows
Date: Fri, 03 Nov 2006 22:02:24 +0900 (JST)
> 取り敢えず
> * kM
> * km
> * ASCIIなキーワードでの検索
> までは出来るようになりました。
と言いましたが、実はscriptのバグでkmは出来ていませんでした。バグを修正
したものを投げておきます。
ところでこのmewest4win.plですが、Perl4の頃の経験しかない人間がperldoc
とか読みながら、try and errorの繰り返しで作成したものなので、以下のよ
うな問題点がありそうな気がしています。
* 今どきのPerlの作法からすると良くない書き方をしている
* 上手く書けば環境非依存にできるのに、WindowsやActivePerlに依存した記
述になってしまっている
* きちんとエラー処理が出来ていない部分がある
* セキュリティ的に問題がある
という訳なので、Perlに詳しい方に問題点の指摘or修正をしていただけるとあ
りがたいです(_ _)。
---
木村 康浩
-------------- next part --------------
#!/usr/bin/perl -w
#
# mewest4win.pl: Rewrite of 'mewest' as perl script
#
# Author: KIMURA Yasuhiro <yasu at example.com>
# Created: Nov 03, 2006
# Revised: Nov 04, 2006
#
# This program is intended to be used on Windows with ActivePerl,
# rather than Cygwin perl.
# It is available under same license conditions as original 'mewest'.
#
require 5.008;
use Getopt::Long;
$dirsep = "\\";
$basedir = $ENV{'HOME'} . $dirsep . "Mail";
$indexsubdir = "casket";
$indexdir = $basedir . $dirsep . $indexsubdir;
$trashsubdir = "trash";
$lock = $basedir . $dirsep . ".mewest.lock";
#
# Subroutines
#
sub usage {
print <<"EOM";
USAGE: $0 [directory]
-h help
-v verbose mode
EOM
exit 1;
}
sub lock {
return mkdir $lock, "0700";
}
sub unlock {
return rmdir $lock;
}
sub unlock_exit {
unlock();
exit 4;
}
sub find_msg_sub {
my $dir = shift;
my $outputfh = shift;
opendir my $dh, $dir || return 0;
foreach my $dirent (readdir($dh)) {
if ($dirent =~ /^\.{1,2}$/) {
next;
}
my $path = $dir . $dirsep . $dirent;
if (-d $path) {
find_msg_sub($path, $outputfh) || return 0;
}
elsif (-f $path && $dirent =~ /^\d+(\.mew)?$/) {
print $outputfh "$path\n";
}
}
closedir $dh || return 0;
return 1;
}
sub find_msg {
my $dir = shift;
my $outputfh = shift;
opendir my $dh, $dir || return 0;
foreach my $dirent (readdir($dh)) {
my $path = $dir . $dirsep . $dirent;
if ($dirent =~ /^\.{1,2}$/ || $dirent eq $indexsubdir ||
$dirent eq $trashsubdir || ! -d $path) {
next;
}
find_msg_sub($path, $outputfh) || return 0;
}
closedir $dh || return 0;
return 1;
}
#
# Main routine
#
$help = 0;
$verbose = 0;
$targetdir = $basedir;
$fullsearch = 1;
if (!GetOptions('h' => \$help, 'v' => \$verbose)) {
usage();
}
if ($help) {
usage();
}
if (defined $ARGV[0]) {
$targetdir = $ARGV[0];
$fullsearch = 0;
}
if (!-d $targetdir) {
print "$targetdir not found\n";
exit 4;
}
$SIG{'HUP'} = \&unlock_exit;
$SIG{'INT'} = \&unlock_exit;
$SIG{'QUIT'} = \&unlock_exit;
$SIG{'KILL'} = \&unlock_exit;
$SIG{'TERM'} = \&unlock_exit;
if (!lock()) {
print "$lock exists\n";
exit 5;
}
$purgecmd = "estcmd purge \"$indexdir\" \"$targetdir\"";
if (!$verbose) {
$purgecmd .= " > NUL";
}
if (-d $indexdir) {
print "Purging old messages...\n";
if (system($purgecmd)) {
print "Purging old messages...failed\n";
unlock_exit();
}
print "Purging old messages...done\n";
}
$gathercmd = "| estcmd gather -cl -fm -cm -sd -xh \"$indexdir\" -";
if (!$verbose) {
$gathercmd .= " > NUL";
}
print "Indexing new messages...\n";
if (!open(GATHER, $gathercmd)) {
print "Indexing new messages...failed\n";
unlock_exit();
}
if ($fullsearch) {
if (!find_msg($targetdir, GATHER)) {
print "Indexing new messages...failed\n";
unlock_exit();
}
}
else {
if (!find_msg_sub($targetdir, GATHER)) {
print "Indexing new messages...failed\n";
unlock_exit();
}
}
if (!close(GATHER)) {
print "Indexing new messages...failed\n";
unlock_exit();
}
print "Indexing new messages...done\n";
unlock();
exit 0;
Mew-dist メーリングリストの案内