Index: trunk/scripts/samhainadmin.pl.in
===================================================================
--- trunk/scripts/samhainadmin.pl.in	(revision 1)
+++ trunk/scripts/samhainadmin.pl.in	(revision 3)
@@ -23,7 +23,9 @@
 use Getopt::Long;
 use File::Basename;
+use File::Copy;
 use File::stat;
 use File::Temp qw/ tempfile tempdir unlink0 /;
 use IO::Handle;
+use Fcntl qw(:DEFAULT :flock);
 
 File::Temp->safe_level( File::Temp::HIGH );
@@ -36,4 +38,5 @@
 my $return_from_sign = 0;
 my $no_print_examine = 0;
+my $no_remove_lock   = 0;
 my $base = basename($0);
 
@@ -42,4 +45,7 @@
 my $daemon   = "@sbindir@/@install_name@";
 my $gpg      = "@mygpg@";
+
+$cfgfile  =~ s/^REQ_FROM_SERVER//;
+$datafile =~ s/^REQ_FROM_SERVER//;
 
 $gpg = "gpg" if ($gpg eq "");
@@ -186,5 +192,5 @@
 
     my $dir = tempdir( CLEANUP => 1 );
-    $filename = $dir . "/exa_jhfdbilw";
+    $filename = $dir . "/exa_jhfdbilw." . $$;
     open $fh, ">$filename" or die "Cannot open $filename";
     autoflush $fh 1;
@@ -281,6 +287,7 @@
     open FH, "<$file1" or die "Cannot open file $file1 for read: $!";
     if (!($file1 =~ /^\-$/)) {
+	flock(FH, LOCK_EX) unless ($no_remove_lock == 1);
 	my $dir = tempdir( CLEANUP => 1 ) or die "Tempdir failed";
-	$filename = $dir . "/rem_iqegBCQb";
+	$filename = $dir . "/rem_iqegBCQb." . $$;
 	open $fh, ">$filename" or die "Cannot open $filename";
 	$stats = stat($file1);
@@ -313,9 +320,10 @@
     }
     if (!($file1 =~ /^\-$/)) {
-	my $command = "cp $filename $file1";
-	system ($command) == 0
-	    or die "system $command failed: $?";
+	copy("$filename", "$file1") 
+	    or die "Copy $filename to $file1 failed: $!";
 	chmod $stats->mode, $file1;
 	chown $stats->uid, $stats->gid, $file1;
+	flock(FH, LOCK_UN) unless ($no_remove_lock == 1);
+	close FH;
     }
     unlink0( $fh, $filename ) or die "Cannot unlink $filename safely";
@@ -386,5 +394,5 @@
     if ($file1 =~ /^\-$/) {
 	my $dir = tempdir( CLEANUP => 1 ) or die "Tempdir failed";
-	$filename1 = $dir . "/sig_vs8827sd";
+	$filename1 = $dir . "/sig_vs8827sd." . $$;
 	open $fh1, ">$filename1" or die "Cannot open $filename1";
 	$flag1 = 1;
@@ -419,10 +427,14 @@
 	$fileout = '-';
     } else {
+	open (LOCKFILE, "<$file1") or die "Cannot open $file1: $!";
+	flock(LOCKFILE, LOCK_EX);
 	$no_print_examine = 1;
+	$no_remove_lock   = 1;
 	if (examine() < 2) {
 	    remove();
 	}
 	$fileout = $file1 . ".asc";
-	$stats   = stat($file1);
+	$stats   = stat($file1)
+	    or die "No file $file1: $!";
     }
 
@@ -446,8 +458,9 @@
 	die ("Signed file is smaller than unsigned file") 
 	    unless ($st_new->size > $st_old->size);
-	system ("mv $fileout $file2") == 0
-	    or die "system mv $fileout $file2 failed: $?";
+	move("$fileout", "$file2") 
+	    or die "Move $fileout to $file2 failed: $!";
 	chmod $stats->mode, $file2;
 	chown $stats->uid, $stats->gid, $file2;
+	flock(LOCKFILE, LOCK_UN);
     }
 
