From 95df6a6a2bb9185cceb1fcf205b4f9f07690ca27 Mon Sep 17 00:00:00 2001 From: pcanterino <> Date: Fri, 17 Dec 2004 17:05:45 +0000 Subject: [PATCH 1/1] - Dev-Editor now uses flock(). flock() is called using a wrapper function which checks if it is really available. - file_save() in File::Access is now able to open a file in binary mode. Thus, the file saving process in the file upload code in Command.pm has been replaced by a single file_save() call. --- modules/Command.pm | 11 ++------- modules/File/Access.pm | 55 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/modules/Command.pm b/modules/Command.pm index 24e9a69..2cb441c 100644 --- a/modules/Command.pm +++ b/modules/Command.pm @@ -6,7 +6,7 @@ package Command; # Execute Dev-Editor's commands # # Author: Patrick Canterino -# Last modified: 2004-12-16 +# Last modified: 2004-12-17 # use strict; @@ -499,18 +499,11 @@ sub exec_upload($$) my $ascii = $cgi->param('ascii'); my $handle = $cgi->upload('uploaded_file'); - local *FILE; - - open(FILE,">".$file_phys) or return error($config->{'errors'}->{'mkfile_failed'},$virtual,{FILE => $file_virt}); - binmode(FILE) unless($ascii); - # Read transferred file and write it to disk read($handle, my $data, -s $handle); $data =~ s/\015\012|\012|\015/\n/g if($ascii); # Replace line separators if transferring in ASCII mode - print FILE $data; - - close(FILE); + file_save($file_phys,\$data,not $ascii) or return error($config->{'errors'}->{'mkfile_failed'},$virtual,{FILE => $file_virt}); return devedit_reload({command => "show", file => $virtual}); } diff --git a/modules/File/Access.pm b/modules/File/Access.pm index 28124cc..31377d9 100644 --- a/modules/File/Access.pm +++ b/modules/File/Access.pm @@ -7,14 +7,16 @@ package File::Access; # with only one command # # Author: Patrick Canterino -# Last modified: 2004-10-26 +# Last modified: 2004-12-17 # use strict; -use vars qw(@EXPORT); +use vars qw(@EXPORT + $has_flock); -use Fcntl; +use Fcntl qw(:DEFAULT + :flock); ### Export ### @@ -22,9 +24,20 @@ use base qw(Exporter); @EXPORT = qw(dir_read file_create + file_lock file_read file_save - file_unlock); + file_unlock + + LOCK_SH + LOCK_EX + LOCK_UN + LOCK_NB); + +# Check if flock() is available +# I found this piece of code somewhere in the internet + +$has_flock = eval { local $SIG{'__DIE__'}; flock(STDOUT,0); 1 }; # dir_read() # @@ -98,6 +111,25 @@ sub file_create($) return 1; } +# file_lock() +# +# System independent wrapper function for flock() +# On systems where flock() is not available, this function +# always returns true. +# +# Params: 1. Filehandle +# 2. Locking mode +# +# Return: Status code (Boolean) + +sub file_lock(*$) +{ + my ($handle,$mode) = @_; + + return 1 unless($has_flock); + return flock($handle,$mode); +} + # file_read() # # Read out a file completely @@ -112,7 +144,11 @@ sub file_read($) local *FILE; sysopen(FILE,$file,O_RDONLY) or return; + file_lock(FILE,LOCK_SH) or do { close(FILE); return }; + read(FILE, my $content, -s $file); + + file_lock(FILE,LOCK_UN) or do { close(FILE); return }; close(FILE) or return; return \$content; @@ -124,16 +160,23 @@ sub file_read($) # # Params: 1. File # 2. File content as Scalar Reference +# 3. true => open in binary mode +# false => open in normal mode (default) # # Return: Status code (Boolean) -sub file_save($$) +sub file_save($$;$) { - my ($file,$content) = @_; + my ($file,$content,$binary) = @_; local *FILE; sysopen(FILE,$file,O_WRONLY | O_CREAT | O_TRUNC) or return; + file_lock(FILE,LOCK_EX) or do { close(FILE); return }; + binmode(FILE) if($binary); + print FILE $$content or do { close(FILE); return }; + + file_lock(FILE,LOCK_UN) or do { close(FILE); return }; close(FILE) or return; return 1; -- 2.34.1