Only attempt to clear the server-logs lock when previously set by this same server.
authorYang Tse <yangsita@gmail.com>
Thu, 26 Nov 2009 10:15:08 +0000 (10:15 +0000)
committerYang Tse <yangsita@gmail.com>
Thu, 26 Nov 2009 10:15:08 +0000 (10:15 +0000)
tests/ftpserver.pl
tests/server/sws.c
tests/server/tftpd.c
tests/server/util.c

index 1222960..ddbc574 100644 (file)
@@ -6,7 +6,7 @@
 #                            | (__| |_| |  _ <| |___
 #                             \___|\___/|_| \_\_____|
 #
-# Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
+# Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
 #
 # This software is licensed as described in the file COPYING, which
 # you should have received as part of this distribution. The terms
@@ -86,6 +86,7 @@ my $listenaddr = "127.0.0.1"; # just a default
 my $pidfile = ".ftpd.pid"; # a default, use --pidfile
 
 my $SERVERLOGS_LOCK="log/serverlogs.lock"; # server logs advisor read lock
+my $serverlogslocked=0;
 
 do {
     if($ARGV[0] eq "-v") {
@@ -123,7 +124,10 @@ sub catch_zap {
     my $signame = shift;
     print STDERR "ftpserver.pl received SIG$signame, exiting\n";
     ftpkillslaves(1);
-    clear_advisor_read_lock($SERVERLOGS_LOCK);
+    if($serverlogslocked) {
+        $serverlogslocked = 0;
+        clear_advisor_read_lock($SERVERLOGS_LOCK);
+    }
     die "Somebody sent me a SIG$signame";
 }
 $SIG{INT} = \&catch_zap;
@@ -149,7 +153,10 @@ sub sysread_or_die {
         logmsg "Error: ftp$ftpdnum$ext sysread error: $!\n";
         kill(9, $sfpid);
         waitpid($sfpid, 0);
-        clear_advisor_read_lock($SERVERLOGS_LOCK);
+        if($serverlogslocked) {
+            $serverlogslocked = 0;
+            clear_advisor_read_lock($SERVERLOGS_LOCK);
+        }
         die "Died in sysread_or_die() at $fcaller " .
             "line $lcaller. ftp$ftpdnum$ext sysread error: $!\n";
     }
@@ -159,7 +166,10 @@ sub sysread_or_die {
         logmsg "Error: ftp$ftpdnum$ext read zero\n";
         kill(9, $sfpid);
         waitpid($sfpid, 0);
-        clear_advisor_read_lock($SERVERLOGS_LOCK);
+        if($serverlogslocked) {
+            $serverlogslocked = 0;
+            clear_advisor_read_lock($SERVERLOGS_LOCK);
+        }
         die "Died in sysread_or_die() at $fcaller " .
             "line $lcaller. ftp$ftpdnum$ext read zero\n";
     }
@@ -181,7 +191,10 @@ sub startsf {
         logmsg "Failed sockfilt command: $cmd\n";
         kill(9, $sfpid);
         waitpid($sfpid, 0);
-        clear_advisor_read_lock($SERVERLOGS_LOCK);
+        if($serverlogslocked) {
+            $serverlogslocked = 0;
+            clear_advisor_read_lock($SERVERLOGS_LOCK);
+        }
         die "Failed to start sockfilt!";
     }
 }
@@ -810,6 +823,7 @@ while(1) {
     logmsg "====> Client connect\n";
 
     set_advisor_read_lock($SERVERLOGS_LOCK);
+    $serverlogslocked = 1;
 
     # flush data:
     $| = 1;
@@ -916,12 +930,18 @@ while(1) {
     } # while(1)
     logmsg "====> Client disconnected\n";
 
-    clear_advisor_read_lock($SERVERLOGS_LOCK);
+    if($serverlogslocked) {
+        $serverlogslocked = 0;
+        clear_advisor_read_lock($SERVERLOGS_LOCK);
+    }
 }
 
 print SFWRITE "QUIT\n";
 waitpid $sfpid, 0;
 
-clear_advisor_read_lock($SERVERLOGS_LOCK);
+if($serverlogslocked) {
+    $serverlogslocked = 0;
+    clear_advisor_read_lock($SERVERLOGS_LOCK);
+}
 
 exit;
index fab7ae5..2743460 100644 (file)
@@ -74,6 +74,7 @@
 static bool use_ipv6 = FALSE;
 #endif
 static const char *ipv_inuse = "IPv4";
+static int serverlogslocked = 0;
 
 #define REQBUFSIZ 150000
 #define REQBUFSIZ_TXT "149999"
@@ -1112,6 +1113,11 @@ int main(int argc, char *argv[])
     goto sws_cleanup;
   }
 
+  /*
+  ** As soon as this server writes its pid file the test harness will
+  ** attempt to connect to this server and initiate its verification.
+  */
+
   wrotepidfile = write_pidfile(pidname);
   if(!wrotepidfile)
     goto sws_cleanup;
@@ -1128,7 +1134,14 @@ int main(int argc, char *argv[])
       break;
     }
 
+    /*
+    ** As soon as this server acepts a connection from the test harness it
+    ** must set the server logs advisor read lock to indicate that server
+    ** logs should not be read until this lock is removed by this server.
+    */
+
     set_advisor_read_lock(SERVERLOGS_LOCK);
+    serverlogslocked = 1;
 
 #ifdef CURL_SWS_FORK_ENABLED
     if(use_fork) {
@@ -1215,7 +1228,10 @@ int main(int argc, char *argv[])
     sclose(msgsock);
     msgsock = CURL_SOCKET_BAD;
 
-    clear_advisor_read_lock(SERVERLOGS_LOCK);
+    if(serverlogslocked) {
+      serverlogslocked = 0;
+      clear_advisor_read_lock(SERVERLOGS_LOCK);
+    }
 
     if (req.testno == DOCNUMBER_QUIT)
       break;
@@ -1238,7 +1254,10 @@ sws_cleanup:
   if(wrotepidfile)
     unlink(pidname);
 
-  clear_advisor_read_lock(SERVERLOGS_LOCK);
+  if(serverlogslocked) {
+    serverlogslocked = 0;
+    clear_advisor_read_lock(SERVERLOGS_LOCK);
+  }
 
   restore_signal_handlers();
 
index e0c2d19..1f6418f 100644 (file)
 static bool use_ipv6 = FALSE;
 #endif
 static const char *ipv_inuse = "IPv4";
+static int serverlogslocked = 0;
 
 struct testcase {
   char *buffer;   /* holds the file data to send to the client */
@@ -546,6 +547,7 @@ int main(int argc, char **argv)
     }
 
     set_advisor_read_lock(SERVERLOGS_LOCK);
+    serverlogslocked = 1;
 
     from.sin_family = AF_INET;
 
@@ -574,13 +576,19 @@ int main(int argc, char **argv)
     }
     sclose(peer);
 
-    clear_advisor_read_lock(SERVERLOGS_LOCK);
+    if(serverlogslocked) {
+      serverlogslocked = 0;
+      clear_advisor_read_lock(SERVERLOGS_LOCK);
+    }
 
     logmsg("end of one transfer");
 
   }
 
-  clear_advisor_read_lock(SERVERLOGS_LOCK);
+  if(serverlogslocked) {
+    serverlogslocked = 0;
+    clear_advisor_read_lock(SERVERLOGS_LOCK);
+  }
 
   return result;
 }
@@ -766,7 +774,10 @@ static void timer(int signum)
 
   timeout += rexmtval;
   if(timeout >= maxtimeout) {
-    clear_advisor_read_lock(SERVERLOGS_LOCK);
+    if(serverlogslocked) {
+      serverlogslocked = 0;
+      clear_advisor_read_lock(SERVERLOGS_LOCK);
+    }
     exit(1);
   }
 #ifdef HAVE_SIGSETJMP
index 646e52b..6c50224 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -260,6 +260,12 @@ void clear_advisor_read_lock(const char *filename)
   int error = 0;
   int res;
 
+  /*
+  ** Log all removal failures. Even those due to file not existing.
+  ** This allows to detect if unexpectedly the file has already been
+  ** removed by a process different than the one that should do this.
+  */
+
   do {
     res = unlink(filename);
   } while(res && ((error = ERRNO) == EINTR));