/* netmanager.cpp * * Copyright (c) 2000, Alexander Neundorf * neundorf@kde.org * * You may distribute under the terms of the GNU General Public * License as specified in the COPYING file. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #include "config.h" #include "netmanager.h" #include "lisadefines.h" #include #include #include #include #include #include #include #include #include #include #include #ifndef AF_LOCAL #define AF_LOCAL AF_UNIX #endif #ifdef LISA_DEBUG #undef LISA_DEBUG #endif #ifdef dcerr #undef dcerr #endif #ifdef mdcerr #undef mdcerr #endif #define LISA_DEBUG 0 #define dcerr if (LISA_DEBUG==1) std::cerr<<"NetManager " #define mdcerr if (LISA_DEBUG==1) std::cerr< 0) ; // repeat errno = saved_errno; } NetManager::NetManager(int& rawSocketFD, int portToUse, MyString configFile, int configStyle, int strictMode) :NetScanner(rawSocketFD,strictMode) //,validator() ,m_listenFD(-1) ,m_bcFD(-1) ,m_basePort(portToUse) ,m_pipeFD(-1) ,m_receiveBuffer(0) ,m_receivedBytes(0) ,m_childPid(0) ,m_lastUpdate(0) ,m_isInformed(0) ,m_isBeingScanned(0) ,m_firstRun(1) ,m_serverServer(0) ,m_servedThisPeriod(0) ,m_serveCount(0) ,m_refreshTime(60) ,m_initialRefreshTime(60) ,m_increasedRefreshTime(0) ,m_broadcastAddress(0) ,m_extraConfigFile(configFile) ,m_configStyle(configStyle) ,m_usedConfigFileName("") { mdcerr<<"NetManager::NetManager"<1800) m_refreshTime=1800; m_initialRefreshTime=m_refreshTime; } int NetManager::prepare() { mdcerr<<"NetManager::prepare"<pw_name; else //should never happen socketName+="???"; ::unlink(socketName.data()); sockaddr_un serverAddr; if (socketName.length() >= sizeof(serverAddr.sun_path)) { std::cout<<"NetManager::prepare: your user name \""<pw_name<<"\" is too long, exiting."<0) return 1; else return 0; } int NetManager::getMaxFD() { int maxFD(m_listenFD); // for (Client* tmpClient=clients.first(); tmpClient!=0; tmpClient=clients.next()) for (std::list::iterator tmpClient=clients.begin(); tmpClient != clients.end(); tmpClient++) if (tmpClient->fd()>maxFD) maxFD=tmpClient->fd(); if (m_pipeFD>maxFD) maxFD=m_pipeFD; if (m_bcFD>maxFD) maxFD=m_bcFD; mdcerr<<"NetManager::getMaxFD()="<::iterator tmpClient=clients.begin(); tmpClient != clients.end(); tmpClient++) { mdcerr<<"NetManager::checkClientsAndPipes: checking client"<fd(),tmpFDs)) { mdcerr<<"NetManager::checkClientsAndPipes: client sent something"<read(); } } //now check wether we received a broadcast //m_bcFD should always be -1 in strictMode if ((m_bcFD!=-1) && (!m_strictMode)) { mdcerr<<"NetManager::checkClientsAndPipe: checking bcFD"<id)!=MY_ID) || ((ntohl(frame->unused1)==getpid()) && (ntohl(frame->unused2)==m_startedAt))) { mdcerr<<"NetManager::answerBroadcast: must be the same machine"<::iterator tmpClient=clients.begin(); tmpClient != clients.end(); tmpClient++) { mdcerr<<"NetManager::serveAndClean: trying to get info"<tryToGetInfo(); } //try to delete served the clients /** PM: substituted STL code for (Client* tmpClient=clients.first();tmpClient!=0; tmpClient=clients.next()) { //if we served the client or if he's already half a minute //connected remove it //this way we get rid of clients if something went wrong and //maybe it's even a security point, I don't know if ((tmpClient->done()) || (tmpClient->age()>30)) { mdcerr<<"NetManager::serveAndClean: removing Client"<ip,tmpNode->name.left(1000).c_str()); length=strlen(buffer)+1; const char *currentBuf=buffer; //make sure that everything is written while (length>0) { int result=::write(fd,currentBuf,length); mdcerr<<"NetManager::writeDataToFD: wrote "<0) { int result=::write(fd,currentBuf,length); if (result==-1) return 0; length-=result; currentBuf+=result; } return 1; } int NetManager::readDataFromFD(int fd) { mdcerr<<"NetManager::readDataFromFD"<2*1024*1024) return 0; return 1; } int NetManager::processScanResults() { mdcerr<<"NetManager::processScanResults"< *newNodes=new std::list; char *tmpBuf=m_receiveBuffer; int bytesLeft=m_receivedBytes; mdcerr<<"m_receivedBytes: "<0) { int tmpIP=2; // well, some impossible IP address, 0 and 1 are already used for the last line of output tmpName[0]='\0'; if ((memchr(tmpBuf,0,bytesLeft)==0) || (memchr(tmpBuf,int('\n'),bytesLeft)==0)) { delete newNodes; hostList->clear(); m_lastUpdate=time(0); delete [] m_receiveBuffer; m_receiveBuffer=0; m_receivedBytes=0; m_isInformed=1; m_isBeingScanned=0; return 0; } //mdcerr<<"NetManager::processScanResults: processing -"<push_back(Node(tmpName,tmpIP)); } } //something failed :-( delete newNodes; hostList->clear(); m_lastUpdate=time(0); delete [] m_receiveBuffer; m_receiveBuffer=0; m_receivedBytes=0; m_isInformed=1; m_isBeingScanned=0; mdcerr<<"NetScanner::processScanResult: finished"<id)!=MY_ID) { mdcerr<<" NetManager::findServerServer: wrong id"<\n"; std::cerr<<"Reading options from config file: "<