From df7bba65634dbc997ba06409e25a49b8be9dd139 Mon Sep 17 00:00:00 2001 From: ndparker <> Date: Sat, 23 Jun 2001 00:31:25 +0000 Subject: [PATCH 1/1] integrated new version of Lock.pm Lock::Handle: added methods 'open' and 'close' --- selfforum-cgi/shared/Arc/Archive.pm | 28 ++--- selfforum-cgi/shared/Lock/Handle.pm | 30 +++++ selfforum-cgi/shared/Posting/Cache.pm | 172 ++++++++++++-------------- selfforum-cgi/shared/Posting/Write.pm | 24 ++-- selfforum-cgi/user/fo_posting.pl | 34 ++--- 5 files changed, 151 insertions(+), 137 deletions(-) diff --git a/selfforum-cgi/shared/Arc/Archive.pm b/selfforum-cgi/shared/Arc/Archive.pm index 9e3ccb9..cb56877 100644 --- a/selfforum-cgi/shared/Arc/Archive.pm +++ b/selfforum-cgi/shared/Arc/Archive.pm @@ -17,7 +17,7 @@ use vars qw( ); use Arc::Test; -use Lock qw(:ALL); +use Lock; use Posting::_lib qw( get_all_threads create_forum_xml_string @@ -62,15 +62,17 @@ sub cut_tail ($) { if ( $param->{adminDefault}->{Severance}->{severance} ne 'instant' or $param->{adminDefault}->{Instant}->{execute} ) { - if (write_lock_file($param->{lockFile}, 1)) { - if (write_lock_file ($param->{forumFile})) { + my $sev = new Lock ($param->{lockFile}); + if ($sev -> lock(LH_EXCL)) { + my $forum = new Lock ($param->{forumFile}); + if ($forum -> lock (LH_EXCL)) { my ( $threads, $last_thread, $last_message, $dtd, undef - ) = get_all_threads ($param->{forumFile}, KEEP_DELETED); + ) = get_all_threads ($forum->filename, KEEP_DELETED); my $obsolete = get_obsolete_threads ({ parsedThreads => $threads, @@ -91,10 +93,10 @@ sub cut_tail ($) { ); if ($saved) { for (@$obsolete) { - set_master_lock ($param->{messagePath}."t$_.xml") or $failed{$_} = 'could not set master lock'; + new Lock($param->{messagePath}."t$_.xml")->lock(LH_MASTER) or $failed{$_} = 'could not set master lock'; } } - violent_unlock_file ($param->{forumFile}) unless (write_unlock_file ($param->{forumFile})); + $forum -> unlock; if ($saved) { # now process thread files @@ -181,9 +183,9 @@ sub cut_tail ($) { my $monthpath = $monthdir . '/'; my $file = $monthpath . "t$tid.xml"; - mkdir $yeardir, 0777 unless (-d $yeardir); + mkdir $yeardir unless (-d $yeardir); if (-d $yeardir) { - mkdir $monthdir, 0777 unless (-d $monthdir); + mkdir $monthdir unless (-d $monthdir); if (-d $monthdir) { save_file ( $file, @@ -210,19 +212,13 @@ sub cut_tail ($) { # for (grep {not exists($failed{$_})} @$obsolete) { unlink ($param->{messagePath}."t$_.xml") or $failed{$_} = 'could not delete thread file'; - file_removed ($param->{messagePath}."t$_.xml"); + #file_removed ($param->{messagePath}."t$_.xml"); } $cache -> delete_threads (@$obsolete); $cache -> garbage_collection; } } - else { - violent_unlock_file ($param->{forumFile}); - } - violent_unlock_file ($param->{lockFile}) unless (write_unlock_file ($param->{lockFile})); - } - else { - violent_unlock_file ($param->{lockFile}); + $sev -> unlock; } } diff --git a/selfforum-cgi/shared/Lock/Handle.pm b/selfforum-cgi/shared/Lock/Handle.pm index e5a749e..3287f6f 100644 --- a/selfforum-cgi/shared/Lock/Handle.pm +++ b/selfforum-cgi/shared/Lock/Handle.pm @@ -44,6 +44,36 @@ sub new { $self; } +### open () #################################################################### +# +# open a file +# +# Params: $mode - open mode +# +# Return: success code (boolean) +# +sub open { + my ($self, $mode) = @_; + + return unless defined ($mode); + + sysopen ($self, $self->filename, $mode); +} + +### close () ################################################################### +# +# close a file +# +# Params: ~none~ +# +# Return: success code (boolean) +# +sub close { + my $self = shift; + + CORE::close $self; +} + ### sub _create_handle ######################################################### # # create a globref diff --git a/selfforum-cgi/shared/Posting/Cache.pm b/selfforum-cgi/shared/Posting/Cache.pm index b765a49..8cd5fdf 100644 --- a/selfforum-cgi/shared/Posting/Cache.pm +++ b/selfforum-cgi/shared/Posting/Cache.pm @@ -4,7 +4,7 @@ package Posting::Cache; # # # File: shared/Posting/Cache.pm # # # -# Authors: André Malo , 2001-04-21 # +# Authors: André Malo , 2001-06-22 # # # # Description: Views/Voting Cache class # # # @@ -17,7 +17,7 @@ use vars qw( use Fcntl; use File::Path; -use Lock qw(:ALL); +use Lock; ################################################################################ # @@ -25,7 +25,7 @@ use Lock qw(:ALL); # $VERSION = do { my @r =(q$Revision$ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; -my $O_BINARY = eval 'local $SIG{__DIE__}; O_BINARY'; +my $O_BINARY = eval "O_BINARY"; $O_BINARY = 0 if ($@); ### sub new #################################################################### @@ -412,17 +412,14 @@ sub add_posting { } sub r_add_posting { my ($self, $handle, $param) = @_; - local *FILE; + my $newfile = new Lock ($self->cachefile($param)); local $\; unless (-d $self -> threaddir($param)) { mkdir $self->threaddir($param), 0777 or return; } - sysopen (FILE, - $self->cachefile($param), - O_WRONLY | O_CREAT | O_TRUNC - ) or return; - close FILE or return; + $newfile -> open (O_WRONLY | O_CREAT | O_TRUNC) or return; + $newfile -> close or return; my $z; if (-s $handle) { @@ -457,7 +454,7 @@ sub r_add_posting { 'L4' => $param->{posting}, $param->{thread}, 0, 0 ) or return; - release_file ($self->cachefile($param)); + $newfile -> release; 1; } @@ -475,29 +472,28 @@ sub r_add_posting { sub add_wrap { my ($self, $gosub, @param) = @_; my $status; + my $summary = new Lock ($self -> summaryfile); - unless (write_lock_file ($self->summaryfile)) { - violent_unlock_file ($self->summaryfile); - $self->set_error ('could not write-lock summary file '.$self->summaryfile); + unless ($summary -> lock (LH_EXCL)) { + $self->set_error ('could not write-lock summary file '.$summary -> filename); } else { - local *SUM; - unless (sysopen (SUM, $self->summaryfile, $O_BINARY | O_APPEND | O_CREAT | O_RDWR)) { + unless ($summary -> open($O_BINARY | O_APPEND | O_CREAT | O_RDWR)) { $self->set_error - ('could not open to read/write/append summary file '.$self->summaryfile); + ('could not open to read/write/append summary file '.$summary->filename); } else { $status = $gosub -> ( $self, - \*SUM, + $summary, @param ); - unless (close SUM) { + unless ($summary -> close) { $status=0; - $self->set_error('could not close summary file '.$self->summaryfile); + $self->set_error('could not close summary file '.$summary -> filename); } } - violent_unlock_file ($self->summaryfile) unless (write_unlock_file ($self->summaryfile)); + $summary -> unlock; } # return @@ -517,51 +513,48 @@ sub add_wrap { sub vote_wrap { my ($self, $gosub, $param) = @_; my $status; + my $summary = new Lock ($self -> summaryfile); - unless (write_lock_file ($self->summaryfile)) { - violent_unlock_file ($self->summaryfile); - $self->set_error ('could not write-lock summary file '.$self->summaryfile); + unless ($summary -> lock (LH_EXCL)) { + $self->set_error ('could not write-lock summary file '.$summary -> filename); } else { - local *S; - unless (sysopen (S, $self->summaryfile, O_RDWR | $O_BINARY)) { - $self->set_error ('could not open to read/write summary file '.$self->summaryfile); + unless ($summary -> open (O_RDWR | $O_BINARY)) { + $self->set_error ('could not open to read/write summary file '.$summary -> filename); } else { unless (-d $self->threaddir($param)) { mkdir $self->threaddir($param), 0777 or return; } - my $filename = $self->cachefile($param); + my $cache = new Lock ($self->cachefile($param)); - unless (write_lock_file ($filename)) { - violent_unlock_file ($filename); - $self->set_error ('could not write-lock cache file '.$filename); + unless ($cache -> lock (LH_EXCL)) { + $self->set_error ('could not write-lock cache file '.$cache -> filename); } else { - local *CACHE; - unless (sysopen (CACHE, $filename, O_APPEND | O_CREAT | O_RDWR)) { - $self->set_error ('could not open to read/write/append cache file '.$filename); + unless ($cache -> open (O_APPEND | O_CREAT | O_RDWR)) { + $self->set_error ('could not open to read/write/append cache file '.$cache -> filename); } else { $status = $gosub -> ( $self, - \*S, - \*CACHE, + $summary, + $cache, $param ); - unless (close CACHE) { + unless ($cache -> close) { $status=0; - $self->set_error('could not close cache file '.$filename); + $self->set_error('could not close cache file '.$cache -> filename); } } - violent_unlock_file ($filename) unless (write_unlock_file ($filename)); + $cache -> unlock; } - unless (close S) { + unless ($summary -> close) { $status=0; - $self->set_error('could not close summary file '.$self->summaryfile); + $self->set_error('could not close summary file '.$summary -> filename); } } - violent_unlock_file ($self->summaryfile) unless (write_unlock_file ($self->summaryfile)); + $summary -> unlock; } # return @@ -581,46 +574,48 @@ sub vote_wrap { sub purge_wrap { my ($self, $gosub, @param) = @_; my $status; - my $filename = $self -> summaryfile . '.temp'; + my $summary = new Lock ($self -> summaryfile); - unless (write_lock_file ($self->summaryfile)) { - violent_unlock_file ($self->summaryfile); - $self->set_error ('could not write-lock summary file '.$self->summaryfile); + unless ($summary -> lock (LH_EXSH)) { + $self->set_error ('could not write-lock summary file '.$summary -> filename); } else { - local *TEMP; - unless (sysopen (TEMP, $filename, O_CREAT | O_WRONLY | O_TRUNC | $O_BINARY)) { - $self->set_error ('could not open to write temp summary file '.$filename); + my $temp = new Lock::Handle ($summary -> filename . '.temp'); + unless ($temp -> open (O_CREAT | O_WRONLY | O_TRUNC | $O_BINARY)) { + $self->set_error ('could not open to write temp summary file '.$temp -> filename); } else { - local *S; - unless (sysopen (S, $self->summaryfile, O_RDONLY | $O_BINARY)) { - $self->set_error ('could not open to read summary file '.$self->summaryfile); + unless ($summary -> open (O_RDONLY | $O_BINARY)) { + $self->set_error ('could not open to read summary file '.$summary -> filename); } else { $status = $gosub -> ( $self, - \*S, - \*TEMP, + $summary, + $temp, @param ); - unless (close S) { + unless ($summary -> close) { $status = 0; - $self->set_error('could not close summary file '.$self->summaryfile); + $self->set_error('could not close summary file '.$summary -> filename); } } - unless (close TEMP) { + unless ($temp -> close) { + $status=0; + $self->set_error('could not close temp summary file '.$temp -> filename); + } + unless ($summary -> lock (LH_EXCL)) { $status=0; - $self->set_error('could not close temp summary file '.$filename); + $self->set_error ('could not write-lock summary file '.$summary -> filename); } if ($status) { - unless (rename $filename => $self->summaryfile) { + unless (rename $temp -> filename => $summary -> filename) { $status=0; - $self->set_error('could not rename temp summary file '.$filename); + $self->set_error('could not rename temp summary file '.$temp -> filename); } } } - violent_unlock_file ($self->summaryfile) unless (write_unlock_file ($self->summaryfile)); + $summary -> unlock; } # return @@ -640,28 +635,27 @@ sub purge_wrap { sub pick_wrap { my ($self, $gosub, $filename, @param) = @_; my $status; + my $cache = new Lock ($filename); - unless (lock_file ($filename)) { - violent_unlock_file ($filename); - $self->set_error ('could not lock cache file '.$filename); + unless ($cache -> lock (LH_SHARED)) { + $self->set_error ('could not lock cache file '.$cache -> filename); } else { - local *CACHE; - unless (sysopen (CACHE, $filename, O_RDONLY)) { - $self->set_error ('could not open to read cache file '.$filename); + unless ($cache -> open (O_RDONLY)) { + $self->set_error ('could not open to read cache file '.$cache -> filename); } else { $status = $self -> read_wrap ( $gosub, - \*CACHE, + $cache, @param ); - unless (close CACHE) { + unless ($cache -> close) { $status=0; - $self->set_error('could not close cache file '.$filename); + $self->set_error('could not close cache file '.$cache -> filename); } } - violent_unlock_file ($filename) unless (unlock_file ($filename)); + $cache -> unlock; } # return @@ -681,28 +675,27 @@ sub pick_wrap { sub read_wrap { my ($self, $gosub, @param) = @_; my $status; + my $summary = new Lock ($self -> summaryfile); - unless (lock_file ($self->summaryfile)) { - violent_unlock_file ($self->summaryfile); - $self->set_error ('could not read-lock summary file '.$self->summaryfile); + unless ($summary -> lock (LH_SHARED)) { + $self->set_error ('could not read-lock summary file '.$summary -> filename); } else { - local *S; - unless (sysopen (S, $self->summaryfile, O_RDONLY | $O_BINARY)) { - $self->set_error ('could not open to read summary file '.$self->summaryfile); + unless ($summary -> open (O_RDONLY | $O_BINARY)) { + $self->set_error ('could not open to read summary file '.$summary -> filename); } else { $status = $gosub -> ( $self, - \*S, + $summary, @param ); - unless (close S) { + unless ($summary -> close) { $status=0; - $self->set_error('could not close summary file '.$self->summaryfile); + $self->set_error('could not close summary file '.$summary -> filename); } } - violent_unlock_file ($self->summaryfile) unless (unlock_file ($self->summaryfile)); + $summary -> unlock; } # return @@ -722,28 +715,27 @@ sub read_wrap { sub mod_wrap { my ($self, $gosub, @param) = @_; my $status; + my $summary = new Lock ($self -> summaryfile); - unless (write_lock_file ($self->summaryfile)) { - violent_unlock_file ($self->summaryfile); - $self->set_error ('could not write-lock summary file '.$self->summaryfile); + unless ($summary -> lock (LH_EXCL)) { + $self->set_error ('could not write-lock summary file '.$summary -> filename); } else { - local *S; - unless (sysopen (S, $self->summaryfile, O_RDWR | $O_BINARY)) { - $self->set_error ('could not open to read/write summary file '.$self->summaryfile); + unless ($summary -> open (O_RDWR | $O_BINARY)) { + $self->set_error ('could not open to read/write summary file '.$summary -> filename); } else { $status = $gosub -> ( $self, - \*S, + $summary, @param ); - unless (close S) { + unless ($summary -> close) { $status=0; - $self->set_error('could not close summary file '.$self->summaryfile); + $self->set_error('could not close summary file '.$summary -> filename); } } - violent_unlock_file ($self->summaryfile) unless (write_unlock_file ($self->summaryfile)); + $summary -> unlock; } # return diff --git a/selfforum-cgi/shared/Posting/Write.pm b/selfforum-cgi/shared/Posting/Write.pm index b7338f6..5670251 100644 --- a/selfforum-cgi/shared/Posting/Write.pm +++ b/selfforum-cgi/shared/Posting/Write.pm @@ -19,10 +19,7 @@ use vars qw( use Encode::Plain; $Encode::Plain::utf8 = 1; use Encode::Posting; -use Lock qw( - :WRITE - release_file -); +use Lock; use Posting::_lib qw( get_message_node get_message_header @@ -126,7 +123,7 @@ sub write_new_thread ($) { ); save_file ($param -> {forumFile}, $forum) or return $error{forumWrite}; - release_file ($param -> {messagePath}.$tid.'.xml'); + new Lock ($param -> {messagePath}.$tid.'.xml') -> release; return (0, $thread, $mid, $tid); } @@ -145,25 +142,24 @@ sub write_reply_posting ($) { my $mid = 'm'.($param -> {lastMessage} + 1); my $tid = 't'.($param -> {thread}); - my $tfile = $param -> {messagePath}.$tid.'.xml'; + my $tfile = new Lock ($param -> {messagePath}.$tid.'.xml'); - unless (write_lock_file ($tfile)) { - violent_unlock_file ($tfile); + unless ($tfile->lock(LH_EXCL)) { return $error{threadFile}; } else { - my $xml = parse_xml_file ($tfile); + my $xml = parse_xml_file ($tfile->filename); unless ($xml) { - violent_unlock_file ($tfile) unless (write_unlock_file ($tfile)); + $tfile -> unlock; return $error{threadFile}; } my $mnode = get_message_node ($xml, $tid, 'm'.$param -> {parentMessage}); unless (defined $mnode) { - violent_unlock_file ($tfile) unless (write_unlock_file ($tfile)); + $tfile -> unlock; return $error{noParent}; } @@ -202,12 +198,12 @@ sub write_reply_posting ($) { # save thread file # - unless (save_file ($tfile, \($xml -> toString))) { - violent_unlock_file ($tfile) unless (write_unlock_file ($tfile)); + unless (save_file ($tfile->filename, \($xml -> toString))) { + $tfile -> unlock; return $error{threadWrite}; } - violent_unlock_file ($tfile) unless (write_unlock_file ($tfile)); + $tfile -> unlock; $thread = $xml; diff --git a/selfforum-cgi/user/fo_posting.pl b/selfforum-cgi/user/fo_posting.pl index 3126881..d2a0a8f 100644 --- a/selfforum-cgi/user/fo_posting.pl +++ b/selfforum-cgi/user/fo_posting.pl @@ -87,7 +87,7 @@ use Arc::Archive; use CheckRFC; use Encode::Plain; $Encode::Plain::utf8 = 1; # generally convert from UTF-8 use Encode::Posting; -use Lock qw(:ALL); +use Lock; use Posting::_lib qw( hr_time parse_xml_file @@ -509,7 +509,7 @@ sub save { # unlock forum main file # if ($self -> {forum} -> {flocked}) { - violent_unlock_file($self -> {conf} -> {forum_file_name}) unless write_unlock_file ($self -> {conf} -> {forum_file_name}); + $self -> {forum} -> {flocked} -> unlock; $self -> {forum} -> {flocked} = 0; } @@ -547,13 +547,12 @@ sub parse_cgi { # sub load_main_file { my $self = shift; - my $lock_stat; + my $forum = new Lock ($self -> {conf} -> {forum_file_name}); - unless ($lock_stat = write_lock_file ($self -> {conf} -> {forum_file_name})) { - if (defined $lock_stat) { + unless ($forum -> lock(LH_EXCL)) { + unless ($forum -> masterlocked) { # occupied or no w-bit set for the directory..., hmmm # - violent_unlock_file ($self -> {conf} -> {forum_file_name}); $self -> {error} = { spec => 'occupied', type => 'repeat' @@ -571,7 +570,7 @@ sub load_main_file { } } else { - $self -> {forum} -> {flocked} = 1; + $self -> {forum} -> {flocked} = $forum; ( $self -> {forum} -> {threads}, $self -> {forum} -> {last_thread}, $self -> {forum} -> {last_message}, @@ -849,13 +848,14 @@ sub check_cgi { if (exists ($formdata -> {$name {$_}} -> {type}) and $formdata -> {$name {$_}} -> {type} eq 'name') { $val_ww =~ y/a-zA-Z//cd; - my @badlist = map {qr/\Q$_/i} qw ( - # insert badmatchlist here - ); + my @badlist; +# my @badlist = map {qr/\Q$_/i} qw ( +# # insert badmatchlist here +# ); - push @badlist => map {qr/\b\Q$_\E\b/i} qw( - # insert badwordlist here - ); +# push @badlist => map {qr/\b\Q$_\E\b/i} qw( +# # insert badwordlist here +# ); for (@badlist) { if ($val_ww =~ /$_/) { @@ -964,11 +964,11 @@ sub fetch { my $formdata = $self -> {conf} -> {form_data}; if (@{$self -> {fetch}}) { - my $filename = $self -> {conf} -> {message_path}.'t'.$self -> {fup_tid}.'.xml'; + my $thread = new Lock ($self -> {conf} -> {message_path}.'t'.$self -> {fup_tid}.'.xml'); - if (lock_file ($filename)) { - my $xml = parse_xml_file ($filename); - violent_unlock_file($filename) unless unlock_file ($filename); + if ($thread -> lock (LH_SHARED)) { + my $xml = parse_xml_file ($thread -> filename); + $thread -> unlock; if ($xml) { my $mnode = get_message_node ($xml, 't'.$self -> {fup_tid}, 'm'.$self -> {fup_mid}); -- 2.34.1