XrdMonSenderInfo.cc

Go to the documentation of this file.
00001 /*****************************************************************************/
00002 /*                                                                           */
00003 /*                            XrdMonSenderInfo.cc                            */
00004 /*                                                                           */
00005 /* (c) 2005 by the Board of Trustees of the Leland Stanford, Jr., University */
00006 /*                            All Rights Reserved                            */
00007 /*       Produced by Jacek Becla for Stanford University under contract      */
00008 /*              DE-AC02-76SF00515 with the Department of Energy              */
00009 /*****************************************************************************/
00010 
00011 // $Id: XrdMonSenderInfo.cc 24468 2008-06-22 16:47:03Z ganis $
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     // convert sAddr to myid. If not regiserted yet, 
00031     // register and also build <hostname>:<port> and register it
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 

Generated on Tue Jul 5 14:46:43 2011 for ROOT_528-00b_version by  doxygen 1.5.1