Only attempt to clear the server-logs lock when previously set by this same server.
This commit is contained in:
		@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -103,6 +103,7 @@
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
@@ -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));
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user