00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 const char *XrdOucReqIDCVSID = "$Id: XrdOucReqID.cc 24468 2008-06-22 16:47:03Z ganis $";
00014 
00015 #include <limits.h>
00016 #include <stdio.h>
00017 #include <string.h>
00018 #ifndef WIN32
00019 #include <strings.h>
00020 #else
00021 #include "XrdSys/XrdWin32.hh"
00022 #endif
00023 #include <time.h>
00024 #include <sys/types.h>
00025   
00026 #include "XrdOucReqID.hh"
00027 
00028 #include "XrdOuc/XrdOucCRC.hh"
00029 
00030 
00031 
00032 
00033   
00034 XrdSysMutex  XrdOucReqID::myMutex;
00035 char        *XrdOucReqID::reqFMT;
00036 char        *XrdOucReqID::reqPFX;
00037 int          XrdOucReqID::reqPFXlen = 0;
00038 int          XrdOucReqID::reqNum = 0;
00039 
00040 
00041 
00042 
00043   
00044 XrdOucReqID::XrdOucReqID(int inst, const char *myHost, unsigned int myIP)
00045 {
00046    time_t eNow = time(0);
00047    char xbuff[256];
00048 
00049    snprintf(xbuff, sizeof(xbuff)-1, "%08x:%04x.%08x:%%d", myIP, inst,
00050                                     static_cast<unsigned int>(eNow));
00051    reqFMT = strdup(xbuff);
00052    reqPFXlen = 13;
00053    xbuff[reqPFXlen] = '\0';
00054    reqPFX = strdup(xbuff);
00055 }
00056  
00057 
00058 
00059 
00060  
00061 int XrdOucReqID::isMine(char *reqid, int &hport, char *hname, int hlen)
00062 {
00063    unsigned int ipaddr, ipport;
00064    char *cp, *ep, *ip;
00065 
00066 
00067 
00068    if (isMine(reqid)) return 1;
00069 
00070 
00071 
00072    if (!hlen) return 0;
00073 
00074 
00075 
00076    hport = 0;
00077    if (!(cp = index(reqid, int(':'))) || cp-reqid != 8) return 0;
00078    if (!(ipaddr = strtol(reqid, &ep, 16)) || ep != cp)  return 0;
00079 
00080 
00081 
00082    ep++;
00083    if (!(cp = index(ep, int('.')))     || cp-ep != 4) return 0;
00084    if (!(ipport = strtol(ep, &cp, 16)) || ep != cp)   return 0;
00085 
00086 
00087 
00088    ip = (char *)&ipaddr;
00089    snprintf(hname, hlen-1, "%d.%d.%d.%d",
00090                    (int)ip[0], (int)ip[1], (int)ip[2], (int)ip[3]);
00091    hname[hlen-1] = '\0';
00092    hport = (int)ipport;
00093    return 0;
00094 }
00095   
00096 
00097 
00098 
00099   
00100 char *XrdOucReqID::ID(char *buff, int blen)
00101 {
00102    int myNum;
00103 
00104 
00105 
00106    myMutex.Lock();
00107    myNum = (reqNum += 1);
00108    myMutex.UnLock();
00109 
00110 
00111 
00112    snprintf(buff, blen-1, reqFMT, myNum);
00113    return buff;
00114 }
00115 
00116 
00117 
00118 
00119   
00120 int XrdOucReqID::Index(int KeyMax, const char *KeyVal, int KeyLen)
00121 {
00122    unsigned int pHash;
00123 
00124 
00125 
00126    pHash = XrdOucCRC::CRC32((const unsigned char *)KeyVal,
00127                             (KeyLen ? KeyLen : strlen(KeyVal)));
00128    return (int)(pHash % KeyMax);
00129 }