Following on from my previous entry, here's what I've put in place:
if ${readsocket{$home/var/seendb.sock}{$h_Message-ID:}} is "seen\n" then save $home/Mail/duplicates 0600 logwrite " Folder: $home/Mail/duplicates" finish endif
#!/home/nick/bin/perl -w use strict; use Net::Server::Single; use Fcntl; use NDBM_File; use vars qw(@ISA $timeout %seendb $prefix $log); @ISA = 'Net::Server::Single'; $timeout = 5; $prefix = "$ENV{HOME}/var/seendb"; $log = "$prefix.log"; tie %seendb, 'NDBM_File', $prefix, O_RDWR|O_CREAT, 0666 or die "Couldn't tie NDBM file $prefix: $!; aborting"; my $self = main->new({ port => "$prefix.sock|unix", user => $<, group => 0 + $(, pid_file => "$prefix.pid", @ARGV ? () : (log_file => $log, setsid => 1), }); $self->run(); exit; sub process_request { my $self = shift; local $SIG{ALRM} = sub { die "Timed Out!\n" }; my $id; unless (eval { my $previous_alarm = alarm $timeout; sysread STDIN, $id, 1024 or die "Bad read: $!"; alarm $previous_alarm; 1; }) { $self->log(1, "Erk: $@"); return; } chomp $id; if ($seendb{$id}) { print "seen\n"; } else { $seendb{$id} = pack "N", time; print "new\n"; } }
At some point it will be upgraded to support a command to prune the NDBM
file, but right now that's still only 16K, so I'm not that worried. During
testing, it pleased me to discover that FreeBSD's telnet
accepts
a pathname as an address to connect to. telnet /home/nick/var/seendb.sock
works. :-)