12 #ifndef ROOT_XrdProofdProofServ 
   13 #define ROOT_XrdProofdProofServ 
   18 #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__APPLE__) 
   29 #include "Xrd/XrdLink.hh" 
   30 #include "XrdOuc/XrdOucHash.hh" 
   51    XrdSrvBuffer(
char *bp=0, 
int sz=0, 
bool dup=0) {
 
   54       if (dup && bp && sz > 0) {
 
   55          fMembuf = (
char *)malloc(sz);
 
   57             memcpy(fMembuf, bp, sz);
 
   65    ~XrdSrvBuffer() {
if (fMembuf) free(fMembuf);}
 
   85    XrdProofQuery(
const char *t, 
const char *n = 
"", 
long s = 0) : fTag(t), fDSName(n), fDSSize(s) { }
 
   87    const char       *GetTag()     { 
return fTag.c_str(); }
 
   88    const char       *GetDSName()  { 
return fDSName.c_str(); }
 
   89    long              GetDSSize()  { 
return fDSSize; }
 
  104 #define kXPROOFSRVTAGMAX   64 
  105 #define kXPROOFSRVALIASMAX 256 
  110 class XrdProofdProofServ
 
  114    XrdProofdProofServ();
 
  115    ~XrdProofdProofServ();
 
  117    void                AddWorker(
const char *o, XrdProofWorker *w);
 
  118    inline const char  *AdminPath()
 const { XrdSysMutexHelper mhp(fMutex); 
return fAdminPath.c_str(); }
 
  119    inline const char  *Alias()
 const { XrdSysMutexHelper mhp(fMutex); 
return fAlias.c_str(); }
 
  120    void                Broadcast(
const char *msg, 
int type = kXPD_srvmsg);
 
  121    int                 BroadcastPriority(
int priority);
 
  122    inline const char  *Client()
 const { XrdSysMutexHelper mhp(fMutex); 
return fClient.c_str(); }
 
  123    int                 CheckSession(
bool oldvers, 
bool isrec,
 
  124                                     int shutopt, 
int shutdel, 
bool changeown, 
int &nc);
 
  125    XrdProofQuery      *CurrentQuery() { XrdSysMutexHelper mhp(fMutex); 
return (fQueries.empty()? 0 : fQueries.front()); }
 
  126    void                DeleteStartMsg()
 
  127                        { XrdSysMutexHelper mhp(fMutex); 
if (fStartMsg) 
delete fStartMsg; fStartMsg = 0;}
 
  128    int                 DisconnectTime();
 
  130    int                 Enqueue(XrdProofQuery *q) { XrdSysMutexHelper mhp(fMutex);
 
  131                                                    if (q) { fQueries.push_back(q); }; 
return fQueries.size(); }
 
  132    void                ExportBuf(XrdOucString &buf);
 
  133    void                ExportWorkers(XrdOucString &wrks);
 
  134    inline const char  *Fileout()
 const { XrdSysMutexHelper mhp(fMutex); 
return fFileout.c_str(); }
 
  135    int                 FreeClientID(
int pid);
 
  136    XrdClientID        *GetClientID(
int cid);
 
  137    int                 GetNClients(
bool check);
 
  138    XrdProofQuery      *GetQuery(
const char *tag);
 
  139    inline const char  *Group()
 const { XrdSysMutexHelper mhp(fMutex); 
return fGroup.c_str(); }
 
  141    inline short int    ID()
 const { XrdSysMutexHelper mhp(fMutex); 
return fID; }
 
  142    inline bool         IsPLite()
 const { XrdSysMutexHelper mhp(fMutex); 
return (fPLiteNWrks > 1); }
 
  143    inline bool         IsShutdown()
 const { XrdSysMutexHelper mhp(fMutex); 
return fIsShutdown; }
 
  144    inline bool         IsValid()
 const { XrdSysMutexHelper mhp(fMutex); 
return fIsValid; }
 
  145    inline bool         Match(
short int id)
 const { XrdSysMutexHelper mhp(fMutex); 
return (
id == fID); }
 
  146    inline const char  *Ordinal()
 const { XrdSysMutexHelper mhp(fMutex); 
return fOrdinal.c_str(); }
 
  147    inline XrdClientID *Parent()
 const { XrdSysMutexHelper mhp(fMutex); 
return fParent; }
 
  148    inline void         PingSem()
 const { XrdSysMutexHelper mhp(fMutex); 
if (fPingSem) fPingSem->Post(); }
 
  149    inline int          PLiteNWrks()
 const { XrdSysMutexHelper mhp(fMutex); 
return fPLiteNWrks; }
 
  150    inline XrdProofdProtocol *Protocol()
 const { XrdSysMutexHelper mhp(fMutex); 
return fProtocol; }
 
  151    inline std::list<XrdProofQuery *> *Queries()
 const 
  152                        { 
return (std::list<XrdProofQuery *> *)&fQueries; }
 
  153    void                RemoveQuery(
const char *tag);
 
  154    void                RemoveWorker(
const char *o);
 
  156    int                 Reset(
const char *msg, 
int type);
 
  159    inline XrdROOT     *ROOT()
 const { XrdSysMutexHelper mhp(fMutex); 
return fROOT; }
 
  160    inline XrdProofdResponse *Response()
 const { XrdSysMutexHelper mhp(fMutex); 
return fResponse; }
 
  161    int                 SendData(
int cid, 
void *buff, 
int len);
 
  162    int                 SendDataN(
void *buff, 
int len);
 
  163    void                SendClusterInfo(
int nsess, 
int nacti);
 
  164    int                 SetAdminPath(
const char *a, 
bool assert, 
bool setown);
 
  165    void                SetAlias(
const char *a) { XrdSysMutexHelper mhp(fMutex); fAlias = a; }
 
  166    void                SetClient(
const char *c) { XrdSysMutexHelper mhp(fMutex); fClient = c; }
 
  167    inline void         SetConnection(XrdProofdResponse *r) { XrdSysMutexHelper mhp(fMutex); fResponse = r;}
 
  169    void                SetFileout(
const char *f) { XrdSysMutexHelper mhp(fMutex); fFileout = f; }
 
  170    inline void         SetGroup(
const char *g) { XrdSysMutexHelper mhp(fMutex); fGroup = g; }
 
  172    inline void         SetID(
short int id) { XrdSysMutexHelper mhp(fMutex); fID = id;}
 
  173    void                SetOrdinal(
const char *o) { XrdSysMutexHelper mhp(fMutex); fOrdinal = o; }
 
  174    inline void         SetParent(XrdClientID *cid) { XrdSysMutexHelper mhp(fMutex); fParent = cid; }
 
  175    inline void         SetPLiteNWrks(
int n) { XrdSysMutexHelper mhp(fMutex); fPLiteNWrks = n; }
 
  176    inline void         SetProtocol(XrdProofdProtocol *p) { XrdSysMutexHelper mhp(fMutex); fProtocol = p; }
 
  177    inline void         SetProtVer(
int pv) { XrdSysMutexHelper mhp(fMutex); fProtVer = pv; }
 
  178    inline void         SetROOT(XrdROOT *r) { XrdSysMutexHelper mhp(fMutex); fROOT = r; }
 
  180    inline void         SetShutdown() { XrdSysMutexHelper mhp(fMutex); fIsShutdown = 
true; }
 
  181    inline void         SetSkipCheck() { XrdSysMutexHelper mhp(fMutex); fSkipCheck = 
true; }
 
  182    void                SetSrvPID(
int pid) { XrdSysMutexHelper mhp(fMutex); fSrvPID = pid; }
 
  183    inline void         SetSrvType(
int id) { XrdSysMutexHelper mhp(fMutex); fSrvType = id; }
 
  184    inline void         SetStartMsg(XrdSrvBuffer *sm) { XrdSysMutexHelper mhp(fMutex); 
delete fStartMsg; fStartMsg = sm; }
 
  185    inline void         SetStatus(
int st) { XrdSysMutexHelper mhp(fMutex); fStatus = st; }
 
  186    void                SetTag(
const char *t) { XrdSysMutexHelper mhp(fMutex); fTag = t; }
 
  187    void                SetUNIXSockPath(
const char *s) { XrdSysMutexHelper mhp(fMutex); fUNIXSockPath = s; };
 
  188    void                SetUserEnvs(
const char *t) { XrdSysMutexHelper mhp(fMutex); fUserEnvs = t; }
 
  189    inline void         SetValid(
bool valid = 1) { XrdSysMutexHelper mhp(fMutex); fIsValid = valid; }
 
  191    inline int          SrvPID()
 const { XrdSysMutexHelper mhp(fMutex); 
return fSrvPID; }
 
  192    inline int          SrvType()
 const { XrdSysMutexHelper mhp(fMutex); 
return fSrvType; }
 
  193    inline XrdSrvBuffer *StartMsg()
 const { XrdSysMutexHelper mhp(fMutex); 
return fStartMsg; }
 
  194    inline int          Status()
 const { XrdSysMutexHelper mhp(fMutex); 
return fStatus;}
 
  195    inline const char  *Tag()
 const { XrdSysMutexHelper mhp(fMutex); 
return fTag.c_str(); }
 
  196    int                 TerminateProofServ(
bool changeown);
 
  197    inline const char  *UserEnvs()
 const { XrdSysMutexHelper mhp(fMutex); 
return fUserEnvs.c_str(); }
 
  198    int                 VerifyProofServ(
bool fw);
 
  199    inline XrdOucHash<XrdProofWorker> *Workers()
 const 
  200                       { XrdSysMutexHelper mhp(fMutex); 
return (XrdOucHash<XrdProofWorker> *)&fWorkers; }
 
  203    int                 CreateUNIXSock(XrdSysError *edest);
 
  204    void                DeleteUNIXSock();
 
  205    XrdNet             *UNIXSock()
 const { 
return fUNIXSock; }
 
  206    const char         *UNIXSockPath()
 const { 
return fUNIXSockPath.c_str(); }
 
  210    XrdSysRecMutex           *fMutex;
 
  211    XrdProofdProtocol        *fProtocol;  
 
  212    XrdProofdResponse        *fResponse;  
 
  214    XrdClientID              *fParent;    
 
  216    std::vector<XrdClientID *> fClients;  
 
  217    XrdOucHash<XrdProofWorker> fWorkers; 
 
  219    XrdSysSemWait            *fPingSem;   
 
  221    XrdSrvBuffer             *fStartMsg;  
 
  223    time_t                    fDisconnectTime; 
 
  231    XrdOucString              fFileout;
 
  236    XrdOucString              fUNIXSockPath; 
 
  243    XrdOucString              fClient;    
 
  245    XrdOucString              fOrdinal;   
 
  246    XrdOucString              fUserEnvs;  
 
  247    XrdOucString              fAdminPath; 
 
  256                              { XrdSysMutexHelper mhp(fMutex); fPingSem = 
new XrdSysSemWait(0);}
 
  258                              { XrdSysMutexHelper mhp(fMutex); 
if (fPingSem) 
delete fPingSem; fPingSem = 0;}
 
  259    std::list<XrdProofQuery *> fQueries;