00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "XrdMon/XrdMonException.hh"
00014 #include "XrdMon/XrdMonErrors.hh"
00015 #include "XrdMon/XrdMonSenderInfo.hh"
00016 #include "XrdSys/XrdSysHeaders.hh"
00017
00018 #include <sys/socket.h>
00019 #include <string.h>
00020 #include <netdb.h>
00021 using std::cout;
00022 using std::endl;
00023
00024 map<kXR_int64, senderid_t> XrdMonSenderInfo::_ids;
00025 vector<hp_t> XrdMonSenderInfo::_hps;
00026
00027 senderid_t
00028 XrdMonSenderInfo::convert2Id(struct sockaddr_in sAddr)
00029 {
00030
00031
00032 kXR_int64 myhash = (sAddr.sin_addr.s_addr << 16) + sAddr.sin_port;
00033
00034 map<kXR_int64, senderid_t>::const_iterator itr = _ids.find(myhash);
00035 if ( itr != _ids.end() ) {
00036 return itr->second;
00037 }
00038 senderid_t id;
00039 id = _ids[myhash] = _hps.size();
00040 registerSender(sAddr);
00041 return id;
00042 }
00043
00044 void
00045 XrdMonSenderInfo::printSelf()
00046 {
00047 cout << "SenderId mapping: \n";
00048 int i, s = _hps.size();
00049 for (i=0 ; i<s ; ++i) {
00050 cout << " " << i << " --> "
00051 << _hps[i].first << ":" << _hps[i].second << endl;
00052 }
00053 }
00054
00055 void
00056 XrdMonSenderInfo::shutdown()
00057 {
00058 _ids.clear();
00059
00060 int i, s = _hps.size();
00061 for (i=0 ; i<s ; ++i) {
00062 delete [] _hps[i].first;
00063 }
00064 _hps.clear();
00065 }
00066
00067 void
00068 XrdMonSenderInfo::registerSender(struct sockaddr_in sAddr)
00069 {
00070 char hostName[256];
00071 char servInfo[256];
00072 memset((char*)hostName, 256, 0);
00073 memset((char*)servInfo, 256, 0);
00074
00075 if ( 0 != getnameinfo((sockaddr*) &sAddr,
00076 sizeof(sockaddr),
00077 hostName,
00078 256,
00079 servInfo,
00080 256,
00081 0) ) {
00082 throw XrdMonException(ERR_INVALIDADDR, "Cannot resolve ip");
00083 }
00084
00085 char* h = new char [strlen(hostName) + 1];
00086 strcpy(h, hostName);
00087 senderid_t p = ntohs(sAddr.sin_port);
00088
00089 _hps.push_back(hp_t(h, p));
00090 }
00091