// @(#)root/proofx:$Id$
// Author: Gerardo Ganis  12/12/2005

/*************************************************************************
 * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TXUnixSocket                                                         //
//                                                                      //
// Implementation of TXSocket using PF_UNIX sockets.                    //
// Used for the internal connection between coordinator and proofserv.  //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "XpdSysPthread.h"

#include "TXUnixSocket.h"
#include "TEnv.h"
#include "XrdProofPhyConn.h"

ClassImp(TXUnixSocket)

//_____________________________________________________________________________
TXUnixSocket::TXUnixSocket(const char *url,
                           Int_t psid, Char_t capver, TXHandler *handler, int fd)
             : TXSocket(0,'i',psid,capver,0,-1,handler)
{
   // Constructor

   // Initialization
   if (url) {

      // Create connection
      fConn = new XrdProofPhyConn(url, psid, capver, this, 0, fd);
      if (!(fConn->IsValid())) {
         Error("TXUnixSocket", "severe error occurred while opening a connection"
                               " to server [%s]", fUrl.Data());
         return;
      }

      // Fill some info
      fUser = fConn->fUser.c_str();
      fHost = fConn->fHost.c_str();
      fPort = fConn->fPort;
      fXrdProofdVersion = fConn->fRemoteProtocol;
      fRemoteProtocol = fConn->fRemoteProtocol;

      // Save also updated url
      TSocket::fUrl = fConn->fUrl.GetUrl().c_str();

      // This is needed for the reader thread to signal an interrupt
      fPid = gSystem->GetPid();
   }
}

//______________________________________________________________________________
Int_t TXUnixSocket::Reconnect()
{
   // Try reconnection after failure

   if (gDebug > 0) {
      Info("Reconnect", "%p: %p: %d: trying to reconnect on %s", this,
                        fConn, (fConn ? fConn->IsValid() : 0), fUrl.Data());
   }

   Int_t tryreconnect = gEnv->GetValue("TXSocket.Reconnect", 0);
   if (tryreconnect == 0 || fXrdProofdVersion < 1005) {
      if (tryreconnect == 0)
         Info("Reconnect","%p: reconnection attempts explicitly disabled!", this);
      else
         Info("Reconnect","%p: server does not support reconnections (protocol: %d < 1005)",
                          this, fXrdProofdVersion);
      return -1;
   }

   if (fConn && !fConn->IsValid()) {

      // Block any other attempt to use this connection
      XrdSysMutexHelper l(fConn->fMutex);

      fConn->Close();
      int maxtry, timewait;
      XrdProofConn::GetRetryParam(maxtry, timewait);
      XrdProofConn::SetRetryParam(300, 1);
      fConn->Connect();
      XrdProofConn::SetRetryParam();
   }

   if (gDebug > 0) {
      Info("Reconnect", "%p: %p: attempt %s", this, fConn,
                        ((fConn && fConn->IsValid()) ? "succeeded!" : "failed"));
   }

   // Done
   return ((fConn && fConn->IsValid()) ? 0 : -1);
}
 TXUnixSocket.cxx:1
 TXUnixSocket.cxx:2
 TXUnixSocket.cxx:3
 TXUnixSocket.cxx:4
 TXUnixSocket.cxx:5
 TXUnixSocket.cxx:6
 TXUnixSocket.cxx:7
 TXUnixSocket.cxx:8
 TXUnixSocket.cxx:9
 TXUnixSocket.cxx:10
 TXUnixSocket.cxx:11
 TXUnixSocket.cxx:12
 TXUnixSocket.cxx:13
 TXUnixSocket.cxx:14
 TXUnixSocket.cxx:15
 TXUnixSocket.cxx:16
 TXUnixSocket.cxx:17
 TXUnixSocket.cxx:18
 TXUnixSocket.cxx:19
 TXUnixSocket.cxx:20
 TXUnixSocket.cxx:21
 TXUnixSocket.cxx:22
 TXUnixSocket.cxx:23
 TXUnixSocket.cxx:24
 TXUnixSocket.cxx:25
 TXUnixSocket.cxx:26
 TXUnixSocket.cxx:27
 TXUnixSocket.cxx:28
 TXUnixSocket.cxx:29
 TXUnixSocket.cxx:30
 TXUnixSocket.cxx:31
 TXUnixSocket.cxx:32
 TXUnixSocket.cxx:33
 TXUnixSocket.cxx:34
 TXUnixSocket.cxx:35
 TXUnixSocket.cxx:36
 TXUnixSocket.cxx:37
 TXUnixSocket.cxx:38
 TXUnixSocket.cxx:39
 TXUnixSocket.cxx:40
 TXUnixSocket.cxx:41
 TXUnixSocket.cxx:42
 TXUnixSocket.cxx:43
 TXUnixSocket.cxx:44
 TXUnixSocket.cxx:45
 TXUnixSocket.cxx:46
 TXUnixSocket.cxx:47
 TXUnixSocket.cxx:48
 TXUnixSocket.cxx:49
 TXUnixSocket.cxx:50
 TXUnixSocket.cxx:51
 TXUnixSocket.cxx:52
 TXUnixSocket.cxx:53
 TXUnixSocket.cxx:54
 TXUnixSocket.cxx:55
 TXUnixSocket.cxx:56
 TXUnixSocket.cxx:57
 TXUnixSocket.cxx:58
 TXUnixSocket.cxx:59
 TXUnixSocket.cxx:60
 TXUnixSocket.cxx:61
 TXUnixSocket.cxx:62
 TXUnixSocket.cxx:63
 TXUnixSocket.cxx:64
 TXUnixSocket.cxx:65
 TXUnixSocket.cxx:66
 TXUnixSocket.cxx:67
 TXUnixSocket.cxx:68
 TXUnixSocket.cxx:69
 TXUnixSocket.cxx:70
 TXUnixSocket.cxx:71
 TXUnixSocket.cxx:72
 TXUnixSocket.cxx:73
 TXUnixSocket.cxx:74
 TXUnixSocket.cxx:75
 TXUnixSocket.cxx:76
 TXUnixSocket.cxx:77
 TXUnixSocket.cxx:78
 TXUnixSocket.cxx:79
 TXUnixSocket.cxx:80
 TXUnixSocket.cxx:81
 TXUnixSocket.cxx:82
 TXUnixSocket.cxx:83
 TXUnixSocket.cxx:84
 TXUnixSocket.cxx:85
 TXUnixSocket.cxx:86
 TXUnixSocket.cxx:87
 TXUnixSocket.cxx:88
 TXUnixSocket.cxx:89
 TXUnixSocket.cxx:90
 TXUnixSocket.cxx:91
 TXUnixSocket.cxx:92
 TXUnixSocket.cxx:93
 TXUnixSocket.cxx:94
 TXUnixSocket.cxx:95
 TXUnixSocket.cxx:96
 TXUnixSocket.cxx:97
 TXUnixSocket.cxx:98
 TXUnixSocket.cxx:99
 TXUnixSocket.cxx:100
 TXUnixSocket.cxx:101
 TXUnixSocket.cxx:102