1 // ------------------------------------------------
6 // Management class for handling multiple servent connections.
8 // (c) 2002 peercast.org
9 // ------------------------------------------------
10 // This program is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 2 of the License, or
13 // (at your option) any later version.
15 // This program is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU General Public License for more details.
19 // ------------------------------------------------
31 #include "chkMemoryLeak.h"
32 #define DEBUG_NEW new(__FILE__, __LINE__)
36 ThreadInfo ServMgr::serverThread,ServMgr::idleThread;
38 // -----------------------------------
43 authType = AUTH_COOKIE;
48 startTime = sys->getTime();
50 allowServer1 = Servent::ALLOW_ALL;
51 allowServer2 = Servent::ALLOW_BROADCAST;
53 clearHostCache(ServHost::T_NONE);
56 allowGnutella = false;
57 useFlowControl = true;
65 maxBitrateOut = 540; //JP-Patch 0-> 540
66 maxRelays = MIN_RELAYS;
84 strcpy(connectHost,"connect1.peercast.org");
85 strcpy(htmlPath,"html/ja");
87 rootHost = "yp.peercast.org";
90 serverHost.fromStrIP("127.0.0.1",DEFAULT_PORT);
92 firewalled = FW_UNKNOWN;
104 firewallTimeout = 30;
120 modulePath[0] = 0; //JP-EX
121 kickPushStartRelays = 1; //JP-EX
122 kickPushInterval = 60; //JP-EX
123 kickPushTime = 0; //JP-EX
124 autoRelayKeep = 2; //JP-EX
125 autoMaxRelaySetting = 0; //JP-EX
126 autoBumpSkipCount = 50; //JP-EX
127 enableGetName = 1; //JP-EX
128 allowConnectPCST = 0; //JP-EX
129 getModulePath = true; //JP-EX
130 clearPLS = false; //JP-EX
131 writeLogFile = false; //JP-EX
133 autoPort0Kick = false;
137 saveIniChannel = true;
139 keepDownstreams = true;
142 startWithGui = false;
146 maxRelaysIndexTxt = 1; // for PCRaw (relay)
150 guiSimpleChannelList = false;
151 guiSimpleConnectionList = false;
154 guiChanListDisplays = 10;
155 guiConnListDisplays = 10;
157 guiTitleModify = false;
158 guiTitleModifyNormal = "PeerCast
\8eรณ
\90M:%rx.kbits.1%kbps
\91\97\90M:%tx.kbits.1%kbps";
159 guiTitleModifyMinimized = "R:%rx.kbytes%KB/s T:%tx.kbytes%KB/s";
161 guiAntennaNotifyIcon = false;
164 disableAutoBumpIfDirect = 1;
168 // -----------------------------------
169 BCID *ServMgr::findValidBCID(int index)
172 BCID *bcid = validBCID;
182 // -----------------------------------
183 BCID *ServMgr::findValidBCID(GnuID &id)
185 BCID *bcid = validBCID;
188 if (bcid->id.isSame(id))
194 // -----------------------------------
195 void ServMgr::removeValidBCID(GnuID &id)
197 BCID *bcid = validBCID,*prev=0;
200 if (bcid->id.isSame(id))
203 prev->next = bcid->next;
205 validBCID = bcid->next;
212 // -----------------------------------
213 void ServMgr::addValidBCID(BCID *bcid)
215 removeValidBCID(bcid->id);
217 bcid->next = validBCID;
221 // -----------------------------------
222 void ServMgr::connectBroadcaster()
224 if (!rootHost.isEmpty())
226 if (!numUsed(Servent::T_COUT))
228 Servent *sv = allocServent();
231 sv->initOutgoing(Servent::T_COUT);
237 // -----------------------------------
238 void ServMgr::addVersion(unsigned int ver)
240 for(int i=0; i<numVersions; i++)
241 if (clientVersions[i] == ver)
247 if (numVersions < MAX_VERSIONS)
249 clientVersions[numVersions] = ver;
250 clientCounts[numVersions] = 1;
255 // -----------------------------------
256 void ServMgr::setFilterDefaults()
260 filters[numFilters].host.fromStrIP("255.255.255.255",0);
261 // filters[numFilters].flags = ServFilter::F_NETWORK|ServFilter::F_DIRECT;
262 filters[numFilters].flags = ServFilter::F_NETWORK;
266 LOG_DEBUG("numFilters = %d", numFilters);
269 // -----------------------------------
270 void ServMgr::setPassiveSearch(unsigned int t)
272 // if ((t > 0) && (t < 60))
274 // passiveSearch = t;
276 // -----------------------------------
277 bool ServMgr::seenHost(Host &h, ServHost::TYPE type,unsigned int time)
279 time = sys->getTime()-time;
281 for(int i=0; i<MAX_HOSTCACHE; i++)
282 if (hostCache[i].type == type)
283 if (hostCache[i].host.ip == h.ip)
284 if (hostCache[i].time >= time)
289 // -----------------------------------
290 void ServMgr::addHost(Host &h, ServHost::TYPE type, unsigned int time)
298 for(i=0; i<MAX_HOSTCACHE; i++)
299 if (hostCache[i].type == type)
300 if (hostCache[i].host.isSame(h))
310 LOG_DEBUG("New host: %s - %s",str,ServHost::getTypeStr(type));
312 LOG_DEBUG("Old host: %s - %s",str,ServHost::getTypeStr(type));
314 h.value = 0; // make sure dead count is zero
320 for(i=0; i<MAX_HOSTCACHE; i++)
321 if (hostCache[i].type == ServHost::T_NONE)
327 // otherwise, find oldest host and replace
329 for(i=0; i<MAX_HOSTCACHE; i++)
330 if (hostCache[i].type != ServHost::T_NONE)
334 if (hostCache[i].time < sh->time)
343 sh->init(h,type,time);
346 // -----------------------------------
347 void ServMgr::deadHost(Host &h,ServHost::TYPE t)
349 for(int i=0; i<MAX_HOSTCACHE; i++)
350 if (hostCache[i].type == t)
351 if (hostCache[i].host.ip == h.ip)
352 if (hostCache[i].host.port == h.port)
355 // -----------------------------------
356 void ServMgr::clearHostCache(ServHost::TYPE type)
358 for(int i=0; i<MAX_HOSTCACHE; i++)
359 if ((hostCache[i].type == type) || (type == ServHost::T_NONE))
363 // -----------------------------------
364 unsigned int ServMgr::numHosts(ServHost::TYPE type)
366 unsigned int cnt = 0;
367 for(int i=0; i<MAX_HOSTCACHE; i++)
368 if ((hostCache[i].type == type) || (type == ServHost::T_NONE))
372 // -----------------------------------
373 int ServMgr::getNewestServents(Host *hl,int max,Host &rh)
376 for(int i=0; i<max; i++)
378 // find newest host not in list
380 for(int j=0; j<MAX_HOSTCACHE; j++)
382 // find newest servent
383 if (hostCache[j].type == ServHost::T_SERVENT)
384 if (!(rh.globalIP() && !hostCache[j].host.globalIP()))
386 // and not in list already
388 for(int k=0; k<cnt; k++)
389 if (hl[k].isSame(hostCache[j].host))
401 if (hostCache[j].time > sh->time)
415 // -----------------------------------
416 ServHost ServMgr::getOutgoingServent(GnuID &netid)
420 Host lh(ClientSocket::getIP(NULL),0);
422 // find newest host not in list
424 for(int j=0; j<MAX_HOSTCACHE; j++)
426 ServHost *hc=&hostCache[j];
427 // find newest servent not already connected.
428 if (hc->type == ServHost::T_SERVENT)
430 if (!((lh.globalIP() && !hc->host.globalIP()) || lh.isSame(hc->host)))
433 if (!findServent(Servent::T_OUTGOING,hc->host,netid))
439 if (hc->time > sh->time)
453 // -----------------------------------
454 Servent *ServMgr::findOldestServent(Servent::TYPE type, bool priv)
456 Servent *oldest=NULL;
458 Servent *s = servents;
462 if (s->thread.active)
463 if (s->isOlderThan(oldest))
464 if (s->isPrivate() == priv)
470 // -----------------------------------
471 Servent *ServMgr::findServent(Servent::TYPE type, Host &host, GnuID &netid)
474 Servent *s = servents;
479 Host h = s->getHost();
480 if (h.isSame(host) && s->networkID.isSame(netid))
493 // -----------------------------------
494 Servent *ServMgr::findServent(unsigned int ip, unsigned short port, GnuID &netid)
497 Servent *s = servents;
500 if (s->type != Servent::T_NONE)
502 Host h = s->getHost();
503 if ((h.ip == ip) && (h.port == port) && (s->networkID.isSame(netid)))
516 // -----------------------------------
517 Servent *ServMgr::findServent(Servent::TYPE t)
519 Servent *s = servents;
528 // -----------------------------------
529 Servent *ServMgr::findServentByIndex(int id)
531 Servent *s = servents;
543 // -----------------------------------
544 Servent *ServMgr::findServentByServentID(int id)
546 Servent *s = servents;
549 if (id == s->servent_id){
557 // -----------------------------------
558 Servent *ServMgr::allocServent()
562 Servent *s = servents;
565 if (s->status == Servent::S_FREE)
572 s = new Servent(++serventNum);
576 LOG_DEBUG("allocated servent %d",serventNum);
578 LOG_DEBUG("reused servent %d",s->serventIndex);
587 // --------------------------------------------------
588 void ServMgr::closeConnections(Servent::TYPE type)
590 Servent *sv = servents;
593 if (sv->isConnected())
594 if (sv->type == type)
595 sv->thread.active = false;
600 // -----------------------------------
601 unsigned int ServMgr::numConnected(int type,bool priv,unsigned int uptime)
605 unsigned int ctime=sys->getTime();
606 Servent *s = servents;
609 if (s->thread.active)
610 if (s->isConnected())
612 if (s->isPrivate()==priv)
613 if ((ctime-s->lastConnect) >= uptime)
620 // -----------------------------------
621 unsigned int ServMgr::numConnected()
625 Servent *s = servents;
628 if (s->thread.active)
629 if (s->isConnected())
636 // -----------------------------------
637 unsigned int ServMgr::numServents()
641 Servent *s = servents;
650 // -----------------------------------
651 unsigned int ServMgr::numUsed(int type)
655 Servent *s = servents;
664 // -----------------------------------
665 unsigned int ServMgr::numActiveOnPort(int port)
669 Servent *s = servents;
672 if (s->thread.active && s->sock && (s->servPort == port))
678 // -----------------------------------
679 unsigned int ServMgr::numActive(Servent::TYPE tp)
683 Servent *s = servents;
686 if (s->thread.active && s->sock && (s->type == tp))
693 // -----------------------------------
694 unsigned int ServMgr::totalOutput(bool all)
696 unsigned int tot = 0;
697 Servent *s = servents;
700 if (s->isConnected())
701 if (all || !s->isPrivate())
703 tot += s->sock->bytesOutPerSec;
710 // -----------------------------------
711 unsigned int ServMgr::totalInput(bool all)
713 unsigned int tot = 0;
714 Servent *s = servents;
717 if (s->isConnected())
718 if (all || !s->isPrivate())
720 tot += s->sock->bytesInPerSec;
727 // -----------------------------------
728 unsigned int ServMgr::numOutgoing()
732 Servent *s = servents;
735 // if ((s->type == Servent::T_INCOMING) ||
736 // (s->type == Servent::T_OUTGOING))
743 // -----------------------------------
744 bool ServMgr::seenPacket(GnuPacket &p)
746 Servent *s = servents;
749 if (s->isConnected())
750 if (s->seenIDs.contains(p.id))
757 // -----------------------------------
760 LOG_DEBUG("ServMgr is quitting..");
762 serverThread.shutdown();
764 idleThread.shutdown();
766 Servent *s = servents;
771 if (s->thread.active)
773 s->thread.shutdown();
776 }catch(StreamException &)
783 // -----------------------------------
784 int ServMgr::broadcast(GnuPacket &pack,Servent *src)
789 Servent *s = servents;
794 if (s->isConnected())
795 if (s->type == Servent::T_PGNU)
796 if (!s->seenIDs.contains(pack.id))
800 if (!src->networkID.isSame(s->networkID))
803 if (s->outputPacket(pack,false))
810 LOG_NETWORK("broadcast: %s (%d) to %d servents",GNU_FUNC_STR(pack.func),pack.ttl,cnt);
814 // -----------------------------------
815 int ServMgr::route(GnuPacket &pack, GnuID &routeID, Servent *src)
820 Servent *s = servents;
824 if (s->isConnected())
825 if (s->type == Servent::T_PGNU)
826 if (!s->seenIDs.contains(pack.id))
827 if (s->seenIDs.contains(routeID))
830 if (!src->networkID.isSame(s->networkID))
833 if (s->outputPacket(pack,true))
841 LOG_NETWORK("route: %s (%d) to %d servents",GNU_FUNC_STR(pack.func),pack.ttl,cnt);
844 // -----------------------------------
845 bool ServMgr::checkForceIP()
847 if (!forceIP.isEmpty())
849 unsigned int newIP = ClientSocket::getIP(forceIP.cstr());
850 if (serverHost.ip != newIP)
852 serverHost.ip = newIP;
854 serverHost.IPtoStr(ipstr);
855 LOG_DEBUG("Server IP changed to %s",ipstr);
862 // -----------------------------------
863 void ServMgr::checkFirewall()
865 if ((getFirewall() == FW_UNKNOWN) && !servMgr->rootHost.isEmpty())
868 LOG_DEBUG("Checking firewall..");
870 host.fromStrName(servMgr->rootHost.cstr(),DEFAULT_PORT);
872 ClientSocket *sock = sys->createSocket();
874 throw StreamException("Unable to create socket");
875 sock->setReadTimeout(30000);
879 AtomStream atom(*sock);
881 atom.writeInt(PCP_CONNECT,1);
885 Servent::handshakeOutgoingPCP(atom,sock->host,remoteID,agent,true);
887 atom.writeInt(PCP_QUIT,PCP_ERROR_QUIT);
894 // -----------------------------------
895 void ServMgr::setFirewall(FW_STATE state)
897 if (firewalled != state)
914 LOG_DEBUG("Firewall is set to %s",str);
918 // -----------------------------------
919 bool ServMgr::isFiltered(int fl, Host &h)
921 for(int i=0; i<numFilters; i++)
922 if (filters[i].flags & fl)
923 if (h.isMemberOf(filters[i].host))
930 // -----------------------------------
931 bool ServMgr::canServeHost(Host &h)
935 Host sh = server->getHost();
937 if (sh.globalIP() || (sh.localIP() && h.localIP()))
944 // --------------------------------------------------
945 void writeServerSettings(IniFile &iniFile, unsigned int a)
947 iniFile.writeBoolValue("allowHTML",a & Servent::ALLOW_HTML);
948 iniFile.writeBoolValue("allowBroadcast",a & Servent::ALLOW_BROADCAST);
949 iniFile.writeBoolValue("allowNetwork",a & Servent::ALLOW_NETWORK);
950 iniFile.writeBoolValue("allowDirect",a & Servent::ALLOW_DIRECT);
952 // --------------------------------------------------
953 void writeFilterSettings(IniFile &iniFile, ServFilter &f)
956 f.host.IPtoStr(ipstr);
957 iniFile.writeStrValue("ip",ipstr);
958 iniFile.writeBoolValue("private",f.flags & ServFilter::F_PRIVATE);
959 iniFile.writeBoolValue("ban",f.flags & ServFilter::F_BAN);
960 iniFile.writeBoolValue("network",f.flags & ServFilter::F_NETWORK);
961 iniFile.writeBoolValue("direct",f.flags & ServFilter::F_DIRECT);
964 // --------------------------------------------------
965 static void writeServHost(IniFile &iniFile, ServHost &sh)
967 iniFile.writeSection("Host");
970 sh.host.toStr(ipStr);
971 iniFile.writeStrValue("type",ServHost::getTypeStr(sh.type));
972 iniFile.writeStrValue("address",ipStr);
973 iniFile.writeIntValue("time",sh.time);
975 iniFile.writeLine("[End]");
980 extern WINDOWPLACEMENT winPlace;
984 // --------------------------------------------------
985 void ServMgr::saveSettings(const char *fn)
988 if (!iniFile.openWriteReplace(fn))
990 LOG_ERROR("Unable to open ini file");
992 LOG_DEBUG("Saving settings to: %s",fn);
996 iniFile.writeSection("Server");
997 iniFile.writeIntValue("serverPort",servMgr->serverHost.port);
998 iniFile.writeBoolValue("autoServe",servMgr->autoServe);
999 iniFile.writeStrValue("forceIP",servMgr->forceIP);
1000 iniFile.writeBoolValue("isRoot",servMgr->isRoot);
1001 iniFile.writeIntValue("maxBitrateOut",servMgr->maxBitrateOut);
1002 iniFile.writeIntValue("maxRelays",servMgr->maxRelays);
1003 iniFile.writeIntValue("maxDirect",servMgr->maxDirect);
1004 iniFile.writeIntValue("maxRelaysPerChannel",chanMgr->maxRelaysPerChannel);
1005 iniFile.writeIntValue("firewallTimeout",firewallTimeout);
1006 iniFile.writeBoolValue("forceNormal",forceNormal);
1007 iniFile.writeStrValue("rootMsg",rootMsg.cstr());
1008 iniFile.writeStrValue("authType",servMgr->authType==ServMgr::AUTH_COOKIE?"cookie":"http-basic");
1009 iniFile.writeStrValue("cookiesExpire",servMgr->cookieList.neverExpire==true?"never":"session");
1010 iniFile.writeStrValue("htmlPath",servMgr->htmlPath);
1011 iniFile.writeIntValue("minPGNUIncoming",servMgr->minGnuIncoming);
1012 iniFile.writeIntValue("maxPGNUIncoming",servMgr->maxGnuIncoming);
1013 iniFile.writeIntValue("maxServIn",servMgr->maxServIn);
1014 iniFile.writeStrValue("chanLog",servMgr->chanLog.cstr());
1016 networkID.toStr(idStr);
1017 iniFile.writeStrValue("networkID",idStr);
1020 iniFile.writeSection("Broadcast");
1021 iniFile.writeIntValue("broadcastMsgInterval",chanMgr->broadcastMsgInterval);
1022 iniFile.writeStrValue("broadcastMsg",chanMgr->broadcastMsg.cstr());
1023 iniFile.writeIntValue("icyMetaInterval",chanMgr->icyMetaInterval);
1024 chanMgr->broadcastID.toStr(idStr);
1025 iniFile.writeStrValue("broadcastID",idStr);
1026 iniFile.writeIntValue("hostUpdateInterval",chanMgr->hostUpdateInterval);
1027 iniFile.writeIntValue("maxControlConnections",servMgr->maxControl);
1028 iniFile.writeStrValue("rootHost",servMgr->rootHost.cstr());
1030 iniFile.writeSection("Client");
1031 iniFile.writeIntValue("refreshHTML",refreshHTML);
1032 iniFile.writeIntValue("relayBroadcast",servMgr->relayBroadcast);
1033 iniFile.writeIntValue("minBroadcastTTL",chanMgr->minBroadcastTTL);
1034 iniFile.writeIntValue("maxBroadcastTTL",chanMgr->maxBroadcastTTL);
1035 iniFile.writeIntValue("pushTries",chanMgr->pushTries);
1036 iniFile.writeIntValue("pushTimeout",chanMgr->pushTimeout);
1037 iniFile.writeIntValue("maxPushHops",chanMgr->maxPushHops);
1038 iniFile.writeIntValue("autoQuery",chanMgr->autoQuery);
1039 iniFile.writeIntValue("queryTTL",servMgr->queryTTL);
1042 iniFile.writeSection("Privacy");
1043 iniFile.writeStrValue("password",servMgr->password);
1044 iniFile.writeIntValue("maxUptime",chanMgr->maxUptime);
1047 iniFile.writeSection("Extend");
1048 iniFile.writeIntValue("autoRelayKeep",servMgr->autoRelayKeep);
1049 iniFile.writeIntValue("autoMaxRelaySetting",servMgr->autoMaxRelaySetting);
1050 iniFile.writeIntValue("autoBumpSkipCount",servMgr->autoBumpSkipCount);
1051 iniFile.writeIntValue("kickPushStartRelays",servMgr->kickPushStartRelays);
1052 iniFile.writeIntValue("kickPushInterval",servMgr->kickPushInterval);
1053 iniFile.writeIntValue("allowConnectPCST",servMgr->allowConnectPCST);
1054 iniFile.writeIntValue("enableGetName",servMgr->enableGetName);
1056 iniFile.writeIntValue("maxRelaysIndexTxt", servMgr->maxRelaysIndexTxt); // for PCRaw (relay)
1059 iniFile.writeIntValue("disableAutoBumpIfDirect",servMgr->disableAutoBumpIfDirect);
1060 iniFile.writeIntValue("asxDetailedMode",servMgr->asxDetailedMode);
1062 iniFile.writeSection("PP");
1064 iniFile.writeBoolValue("ppClapSound", servMgr->ppClapSound);
1065 iniFile.writeStrValue("ppClapSoundPath", servMgr->ppClapSoundPath.cstr());
1070 iniFile.writeSection("Windows");
1071 iniFile.writeBoolValue("getModulePath",servMgr->getModulePath);
1072 iniFile.writeBoolValue("clearPLS",servMgr->clearPLS);
1073 iniFile.writeBoolValue("writeLogFile",servMgr->writeLogFile);
1076 iniFile.writeStrValue("rootHost2",servMgr->rootHost2.cstr());
1077 iniFile.writeBoolValue("autoPort0Kick",servMgr->autoPort0Kick);
1078 iniFile.writeBoolValue("allowOnlyVP",servMgr->allowOnlyVP);
1079 iniFile.writeIntValue("kickKeepTime",servMgr->kickKeepTime);
1080 iniFile.writeBoolValue("vpDebug", servMgr->vpDebug);
1081 iniFile.writeBoolValue("saveIniChannel", servMgr->saveIniChannel);
1083 iniFile.writeBoolValue("saveGuiPos", servMgr->saveGuiPos);
1085 GetWindowPlacement(guiWnd, &winPlace);
1086 iniFile.writeIntValue("guiTop", winPlace.rcNormalPosition.top);
1087 iniFile.writeIntValue("guiBottom", winPlace.rcNormalPosition.bottom);
1088 iniFile.writeIntValue("guiLeft", winPlace.rcNormalPosition.left);
1089 iniFile.writeIntValue("guiRight", winPlace.rcNormalPosition.right);
1093 iniFile.writeBoolValue("guiSimpleChannelList", servMgr->guiSimpleChannelList);
1094 iniFile.writeBoolValue("guiSimpleConnectionList", servMgr->guiSimpleConnectionList);
1095 iniFile.writeBoolValue("guiTopMost", servMgr->guiTopMost);
1097 iniFile.writeIntValue("guiChanListDisplays", servMgr->guiChanListDisplays);
1098 iniFile.writeIntValue("guiConnListDisplays", servMgr->guiConnListDisplays);
1100 iniFile.writeBoolValue("guiTitleModify", servMgr->guiTitleModify);
1101 iniFile.writeStrValue("guiTitleModifyNormal", servMgr->guiTitleModifyNormal.cstr());
1102 iniFile.writeStrValue("guiTitleModifyMinimized", servMgr->guiTitleModifyMinimized.cstr());
1104 iniFile.writeBoolValue("guiAntennaNotifyIcon", servMgr->guiAntennaNotifyIcon);
1107 iniFile.writeBoolValue("topmostGui", servMgr->topmostGui);
1108 iniFile.writeBoolValue("startWithGui", servMgr->startWithGui);
1112 for(i=0; i<servMgr->numFilters; i++)
1114 iniFile.writeSection("Filter");
1115 writeFilterSettings(iniFile,servMgr->filters[i]);
1116 iniFile.writeLine("[End]");
1119 iniFile.writeSection("Notify");
1120 iniFile.writeBoolValue("PeerCast",notifyMask&NT_PEERCAST);
1121 iniFile.writeBoolValue("Broadcasters",notifyMask&NT_BROADCASTERS);
1122 iniFile.writeBoolValue("TrackInfo",notifyMask&NT_TRACKINFO);
1123 iniFile.writeBoolValue("Applause",notifyMask&NT_APPLAUSE); //JP-MOD
1124 iniFile.writeLine("[End]");
1127 iniFile.writeSection("Server1");
1128 writeServerSettings(iniFile,allowServer1);
1129 iniFile.writeLine("[End]");
1131 iniFile.writeSection("Server2");
1132 writeServerSettings(iniFile,allowServer2);
1133 iniFile.writeLine("[End]");
1137 iniFile.writeSection("Debug");
1138 iniFile.writeBoolValue("logDebug",(showLog&(1<<LogBuffer::T_DEBUG))!=0);
1139 iniFile.writeBoolValue("logErrors",(showLog&(1<<LogBuffer::T_ERROR))!=0);
1140 iniFile.writeBoolValue("logNetwork",(showLog&(1<<LogBuffer::T_NETWORK))!=0);
1141 iniFile.writeBoolValue("logChannel",(showLog&(1<<LogBuffer::T_CHANNEL))!=0);
1142 iniFile.writeBoolValue("pauseLog",pauseLog);
1143 iniFile.writeIntValue("idleSleepTime",sys->idleSleepTime);
1146 if (servMgr->validBCID)
1148 BCID *bcid = servMgr->validBCID;
1151 iniFile.writeSection("ValidBCID");
1153 bcid->id.toStr(idstr);
1154 iniFile.writeStrValue("id",idstr);
1155 iniFile.writeStrValue("name",bcid->name.cstr());
1156 iniFile.writeStrValue("email",bcid->email.cstr());
1157 iniFile.writeStrValue("url",bcid->url.cstr());
1158 iniFile.writeBoolValue("valid",bcid->valid);
1159 iniFile.writeLine("[End]");
1165 if (servMgr->saveIniChannel){
1166 Channel *c = chanMgr->channel;
1170 if (c->isActive() && c->stayConnected)
1174 iniFile.writeSection("RelayChannel");
1175 iniFile.writeStrValue("name",c->getName());
1176 iniFile.writeStrValue("genre",c->info.genre.cstr());
1177 if (!c->sourceURL.isEmpty())
1178 iniFile.writeStrValue("sourceURL",c->sourceURL.cstr());
1179 iniFile.writeStrValue("sourceProtocol",ChanInfo::getProtocolStr(c->info.srcProtocol));
1180 iniFile.writeStrValue("contentType",ChanInfo::getTypeStr(c->info.contentType));
1181 iniFile.writeIntValue("bitrate",c->info.bitrate);
1182 iniFile.writeStrValue("contactURL",c->info.url.cstr());
1183 iniFile.writeStrValue("id",idstr);
1184 iniFile.writeBoolValue("stayConnected",c->stayConnected);
1186 ChanHitList *chl = chanMgr->findHitListByID(c->info.id);
1191 chs.trackersOnly = true;
1192 if (chl->pickHits(chs))
1195 chs.best[0].host.toStr(ipStr);
1196 iniFile.writeStrValue("tracker",ipStr);
1199 iniFile.writeLine("[End]");
1208 Servent *s = servents;
1211 if (s->type == Servent::T_OUTGOING)
1212 if (s->isConnected())
1215 Host h = s->getHost();
1216 sh.init(h,ServHost::T_SERVENT,0,s->networkID);
1217 writeServHost(iniFile,sh);
1223 for(i=0; i<ServMgr::MAX_HOSTCACHE; i++)
1225 ServHost *sh = &servMgr->hostCache[i];
1226 if (sh->type != ServHost::T_NONE)
1227 writeServHost(iniFile,*sh);
1233 // --------------------------------------------------
1234 unsigned int readServerSettings(IniFile &iniFile, unsigned int a)
1236 while (iniFile.readNext())
1238 if (iniFile.isName("[End]"))
1240 else if (iniFile.isName("allowHTML"))
1241 a = iniFile.getBoolValue()?a|Servent::ALLOW_HTML:a&~Servent::ALLOW_HTML;
1242 else if (iniFile.isName("allowDirect"))
1243 a = iniFile.getBoolValue()?a|Servent::ALLOW_DIRECT:a&~Servent::ALLOW_DIRECT;
1244 else if (iniFile.isName("allowNetwork"))
1245 a = iniFile.getBoolValue()?a|Servent::ALLOW_NETWORK:a&~Servent::ALLOW_NETWORK;
1246 else if (iniFile.isName("allowBroadcast"))
1247 a = iniFile.getBoolValue()?a|Servent::ALLOW_BROADCAST:a&~Servent::ALLOW_BROADCAST;
1251 // --------------------------------------------------
1252 void readFilterSettings(IniFile &iniFile, ServFilter &sv)
1256 while (iniFile.readNext())
1258 if (iniFile.isName("[End]"))
1260 else if (iniFile.isName("ip"))
1261 sv.host.fromStrIP(iniFile.getStrValue(),0);
1262 else if (iniFile.isName("private"))
1263 sv.flags = (sv.flags & ~ServFilter::F_PRIVATE) | (iniFile.getBoolValue()?ServFilter::F_PRIVATE:0);
1264 else if (iniFile.isName("ban"))
1265 sv.flags = (sv.flags & ~ServFilter::F_BAN) | (iniFile.getBoolValue()?ServFilter::F_BAN:0);
1266 else if (iniFile.isName("allow") || iniFile.isName("network"))
1267 sv.flags = (sv.flags & ~ServFilter::F_NETWORK) | (iniFile.getBoolValue()?ServFilter::F_NETWORK:0);
1268 else if (iniFile.isName("direct"))
1269 sv.flags = (sv.flags & ~ServFilter::F_DIRECT) | (iniFile.getBoolValue()?ServFilter::F_DIRECT:0);
1273 // --------------------------------------------------
1274 void ServMgr::loadSettings(const char *fn)
1278 if (!iniFile.openReadOnly(fn))
1282 servMgr->numFilters = 0;
1285 if (iniFile.openReadOnly(fn))
1287 while (iniFile.readNext())
1290 if (iniFile.isName("serverPort"))
1291 servMgr->serverHost.port = iniFile.getIntValue();
1292 else if (iniFile.isName("autoServe"))
1293 servMgr->autoServe = iniFile.getBoolValue();
1294 else if (iniFile.isName("autoConnect"))
1295 servMgr->autoConnect = iniFile.getBoolValue();
1296 else if (iniFile.isName("icyPassword")) // depreciated
1297 strcpy(servMgr->password,iniFile.getStrValue());
1298 else if (iniFile.isName("forceIP"))
1299 servMgr->forceIP = iniFile.getStrValue();
1300 else if (iniFile.isName("isRoot"))
1301 servMgr->isRoot = iniFile.getBoolValue();
1302 else if (iniFile.isName("broadcastID"))
1304 chanMgr->broadcastID.fromStr(iniFile.getStrValue());
1305 chanMgr->broadcastID.id[0] = PCP_BROADCAST_FLAGS; // hacky, but we need to fix old clients
1307 }else if (iniFile.isName("htmlPath"))
1308 strcpy(servMgr->htmlPath,iniFile.getStrValue());
1309 else if (iniFile.isName("maxPGNUIncoming"))
1310 servMgr->maxGnuIncoming = iniFile.getIntValue();
1311 else if (iniFile.isName("minPGNUIncoming"))
1312 servMgr->minGnuIncoming = iniFile.getIntValue();
1314 else if (iniFile.isName("maxControlConnections"))
1316 servMgr->maxControl = iniFile.getIntValue();
1319 else if (iniFile.isName("maxBitrateOut"))
1320 servMgr->maxBitrateOut = iniFile.getIntValue();
1322 else if (iniFile.isName("maxStreamsOut")) // depreciated
1323 servMgr->setMaxRelays(iniFile.getIntValue());
1324 else if (iniFile.isName("maxRelays"))
1325 servMgr->setMaxRelays(iniFile.getIntValue());
1326 else if (iniFile.isName("maxDirect"))
1327 servMgr->maxDirect = iniFile.getIntValue();
1329 else if (iniFile.isName("maxStreamsPerChannel")) // depreciated
1330 chanMgr->maxRelaysPerChannel = iniFile.getIntValue();
1331 else if (iniFile.isName("maxRelaysPerChannel"))
1332 chanMgr->maxRelaysPerChannel = iniFile.getIntValue();
1334 else if (iniFile.isName("firewallTimeout"))
1335 firewallTimeout = iniFile.getIntValue();
1336 else if (iniFile.isName("forceNormal"))
1337 forceNormal = iniFile.getBoolValue();
1338 else if (iniFile.isName("broadcastMsgInterval"))
1339 chanMgr->broadcastMsgInterval = iniFile.getIntValue();
1340 else if (iniFile.isName("broadcastMsg"))
1341 chanMgr->broadcastMsg.set(iniFile.getStrValue(),String::T_ASCII);
1342 else if (iniFile.isName("hostUpdateInterval"))
1343 chanMgr->hostUpdateInterval = iniFile.getIntValue();
1344 else if (iniFile.isName("icyMetaInterval"))
1345 chanMgr->icyMetaInterval = iniFile.getIntValue();
1346 else if (iniFile.isName("maxServIn"))
1347 servMgr->maxServIn = iniFile.getIntValue();
1348 else if (iniFile.isName("chanLog"))
1349 servMgr->chanLog.set(iniFile.getStrValue(),String::T_ASCII);
1351 else if (iniFile.isName("rootMsg"))
1352 rootMsg.set(iniFile.getStrValue());
1353 else if (iniFile.isName("networkID"))
1354 networkID.fromStr(iniFile.getStrValue());
1355 else if (iniFile.isName("authType"))
1357 char *t = iniFile.getStrValue();
1358 if (stricmp(t,"cookie")==0)
1359 servMgr->authType = ServMgr::AUTH_COOKIE;
1360 else if (stricmp(t,"http-basic")==0)
1361 servMgr->authType = ServMgr::AUTH_HTTPBASIC;
1362 }else if (iniFile.isName("cookiesExpire"))
1364 char *t = iniFile.getStrValue();
1365 if (stricmp(t,"never")==0)
1366 servMgr->cookieList.neverExpire = true;
1367 else if (stricmp(t,"session")==0)
1368 servMgr->cookieList.neverExpire = false;
1374 else if (iniFile.isName("password"))
1375 strcpy(servMgr->password,iniFile.getStrValue());
1376 else if (iniFile.isName("maxUptime"))
1377 chanMgr->maxUptime = iniFile.getIntValue();
1381 else if (iniFile.isName("rootHost"))
1384 servMgr->rootHost = iniFile.getStrValue();
1386 }else if (iniFile.isName("deadHitAge"))
1387 chanMgr->deadHitAge = iniFile.getIntValue();
1388 else if (iniFile.isName("tryoutDelay"))
1389 servMgr->tryoutDelay = iniFile.getIntValue();
1390 else if (iniFile.isName("refreshHTML"))
1391 refreshHTML = iniFile.getIntValue();
1392 else if (iniFile.isName("relayBroadcast"))
1394 servMgr->relayBroadcast = iniFile.getIntValue();
1395 if (servMgr->relayBroadcast < 30)
1396 servMgr->relayBroadcast = 30;
1398 else if (iniFile.isName("minBroadcastTTL"))
1399 chanMgr->minBroadcastTTL = iniFile.getIntValue();
1400 else if (iniFile.isName("maxBroadcastTTL"))
1401 chanMgr->maxBroadcastTTL = iniFile.getIntValue();
1402 else if (iniFile.isName("pushTimeout"))
1403 chanMgr->pushTimeout = iniFile.getIntValue();
1404 else if (iniFile.isName("pushTries"))
1405 chanMgr->pushTries = iniFile.getIntValue();
1406 else if (iniFile.isName("maxPushHops"))
1407 chanMgr->maxPushHops = iniFile.getIntValue();
1408 else if (iniFile.isName("autoQuery"))
1410 chanMgr->autoQuery = iniFile.getIntValue();
1411 if ((chanMgr->autoQuery < 300) && (chanMgr->autoQuery > 0))
1412 chanMgr->autoQuery = 300;
1414 else if (iniFile.isName("queryTTL"))
1416 servMgr->queryTTL = iniFile.getIntValue();
1420 else if (iniFile.isName("autoRelayKeep"))
1421 servMgr->autoRelayKeep = iniFile.getIntValue();
1422 else if (iniFile.isName("autoMaxRelaySetting"))
1423 servMgr->autoMaxRelaySetting = iniFile.getIntValue();
1424 else if (iniFile.isName("autoBumpSkipCount"))
1425 servMgr->autoBumpSkipCount = iniFile.getIntValue();
1426 else if (iniFile.isName("kickPushStartRelays"))
1427 servMgr->kickPushStartRelays = iniFile.getIntValue();
1428 else if (iniFile.isName("kickPushInterval"))
1430 servMgr->kickPushInterval = iniFile.getIntValue();
1431 if (servMgr->kickPushInterval < 60)
1432 servMgr->kickPushInterval = 0;
1434 else if (iniFile.isName("allowConnectPCST"))
1435 servMgr->allowConnectPCST = iniFile.getIntValue();
1436 else if (iniFile.isName("enableGetName"))
1437 servMgr->enableGetName = iniFile.getIntValue();
1439 else if (iniFile.isName("maxRelaysIndexTxt")) // for PCRaw (relay)
1440 servMgr->maxRelaysIndexTxt = iniFile.getIntValue();
1443 else if (iniFile.isName("disableAutoBumpIfDirect"))
1444 servMgr->disableAutoBumpIfDirect = iniFile.getIntValue();
1445 else if (iniFile.isName("asxDetailedMode"))
1446 servMgr->asxDetailedMode = iniFile.getIntValue();
1449 else if (iniFile.isName("ppClapSound"))
1450 servMgr->ppClapSound = iniFile.getBoolValue();
1451 else if (iniFile.isName("ppClapSoundPath"))
1452 servMgr->ppClapSoundPath.set(iniFile.getStrValue(),String::T_ASCII);
1456 else if (iniFile.isName("getModulePath"))
1457 servMgr->getModulePath = iniFile.getBoolValue();
1458 else if (iniFile.isName("clearPLS"))
1459 servMgr->clearPLS = iniFile.getBoolValue();
1460 else if (iniFile.isName("writeLogFile"))
1461 servMgr->writeLogFile = iniFile.getBoolValue();
1464 else if (iniFile.isName("rootHost2"))
1467 servMgr->rootHost2 = iniFile.getStrValue();
1469 else if (iniFile.isName("autoPort0Kick"))
1470 servMgr->autoPort0Kick = iniFile.getBoolValue();
1471 else if (iniFile.isName("allowOnlyVP"))
1472 servMgr->allowOnlyVP = iniFile.getBoolValue();
1473 else if (iniFile.isName("kickKeepTime"))
1474 servMgr->kickKeepTime = iniFile.getIntValue();
1475 else if (iniFile.isName("vpDebug"))
1476 servMgr->vpDebug = iniFile.getBoolValue();
1477 else if (iniFile.isName("saveIniChannel"))
1478 servMgr->saveIniChannel = iniFile.getBoolValue();
1480 else if (iniFile.isName("saveGuiPos"))
1481 servMgr->saveGuiPos = iniFile.getBoolValue();
1482 else if (iniFile.isName("guiTop"))
1483 winPlace.rcNormalPosition.top = iniFile.getIntValue();
1484 else if (iniFile.isName("guiBottom"))
1485 winPlace.rcNormalPosition.bottom = iniFile.getIntValue();
1486 else if (iniFile.isName("guiLeft"))
1487 winPlace.rcNormalPosition.left = iniFile.getIntValue();
1488 else if (iniFile.isName("guiRight")){
1489 winPlace.rcNormalPosition.right = iniFile.getIntValue();
1490 winPlace.length = sizeof(winPlace);
1492 winPlace.showCmd = 1;
1493 winPlace.ptMinPosition.x = -1;
1494 winPlace.ptMinPosition.y = -1;
1495 winPlace.ptMaxPosition.x = -1;
1496 winPlace.ptMaxPosition.y = -1;
1497 if (servMgr->saveGuiPos){
1500 }else if (iniFile.isName("guiSimpleChannelList")) //JP-MOD
1501 servMgr->guiSimpleChannelList = iniFile.getBoolValue();
1502 else if (iniFile.isName("guiSimpleConnectionList")) //JP-MOD
1503 servMgr->guiSimpleConnectionList = iniFile.getBoolValue();
1504 else if (iniFile.isName("guiTopMost")) //JP-MOD
1505 servMgr->guiTopMost = iniFile.getBoolValue();
1506 else if (iniFile.isName("guiChanListDisplays")) //JP-MOD
1507 servMgr->guiChanListDisplays = iniFile.getIntValue();
1508 else if (iniFile.isName("guiConnListDisplays")) //JP-MOD
1509 servMgr->guiConnListDisplays = iniFile.getIntValue();
1510 else if (iniFile.isName("guiTitleModify")) //JP-MOD
1511 servMgr->guiTitleModify = iniFile.getBoolValue();
1512 else if (iniFile.isName("guiTitleModifyNormal")) //JP-MOD
1513 servMgr->guiTitleModifyNormal.set(iniFile.getStrValue(),String::T_ASCII);
1514 else if (iniFile.isName("guiTitleModifyMinimized")) //JP-MOD
1515 servMgr->guiTitleModifyMinimized.set(iniFile.getStrValue(),String::T_ASCII);
1516 else if (iniFile.isName("guiAntennaNotifyIcon")) //JP-MOD
1517 servMgr->guiAntennaNotifyIcon = iniFile.getBoolValue();
1519 else if (iniFile.isName("topmostGui"))
1521 servMgr->topmostGui = iniFile.getBoolValue();
1522 } else if (iniFile.isName("startWithGui"))
1524 servMgr->startWithGui = iniFile.getBoolValue();
1529 else if (iniFile.isName("logDebug"))
1530 showLog |= iniFile.getBoolValue() ? 1<<LogBuffer::T_DEBUG:0;
1531 else if (iniFile.isName("logErrors"))
1532 showLog |= iniFile.getBoolValue() ? 1<<LogBuffer::T_ERROR:0;
1533 else if (iniFile.isName("logNetwork"))
1534 showLog |= iniFile.getBoolValue() ? 1<<LogBuffer::T_NETWORK:0;
1535 else if (iniFile.isName("logChannel"))
1536 showLog |= iniFile.getBoolValue() ? 1<<LogBuffer::T_CHANNEL:0;
1537 else if (iniFile.isName("pauseLog"))
1538 pauseLog = iniFile.getBoolValue();
1539 else if (iniFile.isName("idleSleepTime"))
1540 sys->idleSleepTime = iniFile.getIntValue();
1541 else if (iniFile.isName("[Server1]"))
1542 allowServer1 = readServerSettings(iniFile,allowServer1);
1543 else if (iniFile.isName("[Server2]"))
1544 allowServer2 = readServerSettings(iniFile,allowServer2);
1545 else if (iniFile.isName("[Filter]"))
1547 readFilterSettings(iniFile,filters[numFilters]);
1549 if (numFilters < (MAX_FILTERS-1))
1551 LOG_DEBUG("*** numFilters = %d", numFilters);
1553 else if (iniFile.isName("[Notify]"))
1555 notifyMask = NT_UPGRADE;
1556 while (iniFile.readNext())
1558 if (iniFile.isName("[End]"))
1560 else if (iniFile.isName("PeerCast"))
1561 notifyMask |= iniFile.getBoolValue()?NT_PEERCAST:0;
1562 else if (iniFile.isName("Broadcasters"))
1563 notifyMask |= iniFile.getBoolValue()?NT_BROADCASTERS:0;
1564 else if (iniFile.isName("TrackInfo"))
1565 notifyMask |= iniFile.getBoolValue()?NT_TRACKINFO:0;
1566 else if (iniFile.isName("Applause")) //JP-MOD
1567 notifyMask |= iniFile.getBoolValue()?NT_APPLAUSE:0;
1571 else if (iniFile.isName("[RelayChannel]"))
1574 bool stayConnected=false;
1576 while (iniFile.readNext())
1578 if (iniFile.isName("[End]"))
1580 else if (iniFile.isName("name"))
1581 info.name.set(iniFile.getStrValue());
1582 else if (iniFile.isName("id"))
1583 info.id.fromStr(iniFile.getStrValue());
1584 else if (iniFile.isName("sourceType"))
1585 info.srcProtocol = ChanInfo::getProtocolFromStr(iniFile.getStrValue());
1586 else if (iniFile.isName("contentType"))
1587 info.contentType = ChanInfo::getTypeFromStr(iniFile.getStrValue());
1588 else if (iniFile.isName("stayConnected"))
1589 stayConnected = iniFile.getBoolValue();
1590 else if (iniFile.isName("sourceURL"))
1591 sourceURL.set(iniFile.getStrValue());
1592 else if (iniFile.isName("genre"))
1593 info.genre.set(iniFile.getStrValue());
1594 else if (iniFile.isName("contactURL"))
1595 info.url.set(iniFile.getStrValue());
1596 else if (iniFile.isName("bitrate"))
1597 info.bitrate = atoi(iniFile.getStrValue());
1598 else if (iniFile.isName("tracker"))
1603 hit.host.fromStrName(iniFile.getStrValue(),DEFAULT_PORT);
1604 hit.rhost[0] = hit.host;
1605 hit.rhost[1] = hit.host;
1606 hit.chanID = info.id;
1608 chanMgr->addHit(hit);
1612 if (sourceURL.isEmpty())
1614 chanMgr->createRelay(info,stayConnected);
1617 info.bcID = chanMgr->broadcastID;
1618 Channel *c = chanMgr->createChannel(info,NULL);
1620 c->startURL(sourceURL.cstr());
1622 } else if (iniFile.isName("[Host]"))
1625 ServHost::TYPE type=ServHost::T_NONE;
1626 bool firewalled=false;
1627 unsigned int time=0;
1628 while (iniFile.readNext())
1630 if (iniFile.isName("[End]"))
1632 else if (iniFile.isName("address"))
1633 h.fromStrIP(iniFile.getStrValue(),DEFAULT_PORT);
1634 else if (iniFile.isName("type"))
1635 type = ServHost::getTypeFromStr(iniFile.getStrValue());
1636 else if (iniFile.isName("time"))
1637 time = iniFile.getIntValue();
1639 servMgr->addHost(h,type,time);
1641 } else if (iniFile.isName("[ValidBCID]"))
1643 BCID *bcid = new BCID();
1644 while (iniFile.readNext())
1646 if (iniFile.isName("[End]"))
1648 else if (iniFile.isName("id"))
1649 bcid->id.fromStr(iniFile.getStrValue());
1650 else if (iniFile.isName("name"))
1651 bcid->name.set(iniFile.getStrValue());
1652 else if (iniFile.isName("email"))
1653 bcid->email.set(iniFile.getStrValue());
1654 else if (iniFile.isName("url"))
1655 bcid->url.set(iniFile.getStrValue());
1656 else if (iniFile.isName("valid"))
1657 bcid->valid = iniFile.getBoolValue();
1659 servMgr->addValidBCID(bcid);
1665 setFilterDefaults();
1667 LOG_DEBUG("numFilters = %d", numFilters);
1670 // --------------------------------------------------
1671 unsigned int ServMgr::numStreams(GnuID &cid, Servent::TYPE tp, bool all)
1674 Servent *sv = servents;
1677 if (sv->isConnected())
1679 if (sv->chanID.isSame(cid))
1680 if (all || !sv->isPrivate())
1686 // --------------------------------------------------
1687 unsigned int ServMgr::numStreams(Servent::TYPE tp, bool all)
1690 Servent *sv = servents;
1693 if (sv->isConnected())
1695 if (all || !sv->isPrivate())
1697 // for PCRaw (relay) start.
1698 if(tp == Servent::T_RELAY)
1700 Channel *ch = chanMgr->findChannelByID(sv->chanID);
1702 // index.txt
\82ร
\83J
\83E
\83\93\83g
\82ยต
\82ร
\82ยข
1707 // for PCRaw (relay) end.
1717 // --------------------------------------------------
1718 bool ServMgr::getChannel(char *str,ChanInfo &info, bool relay)
1720 // remove file extension (only added for winamp)
1721 //char *ext = strstr(str,".");
1722 //if (ext) *ext = 0;
1724 procConnectArgs(str,info);
1726 WLockBlock wb(&(chanMgr->channellock));
1731 ch = chanMgr->findChannelByNameID(info);
1732 if (ch && ch->thread.active)
1735 if (!ch->isPlaying())
1739 ch->info.lastPlayStart = 0; // force reconnect
1740 ch->info.lastPlayEnd = 0;
1745 info = ch->info; // get updated channel info
1753 ch = chanMgr->findAndRelay(info);
1756 //
\81ยซException point
1757 info = ch->info; //get updated channel info
1765 // --------------------------------------------------
1766 int ServMgr::findChannel(ChanInfo &info)
1770 info.id.toStr(idStr);
1773 if (info.id.isSet())
1775 // if we have an ID then try and connect to known hosts carrying channel.
1776 ServHost sh = getOutgoingServent(info.id);
1777 addOutgoing(sh.host,info.id,true);
1783 XML::Node *n = info.createQueryXML();
1785 pack.initFind(NULL,&xml,servMgr->queryTTL);
1787 addReplyID(pack.id);
1788 int cnt = broadcast(pack,NULL);
1790 LOG_NETWORK("Querying network: %s %s - %d servents",info.name.cstr(),idStr,cnt);
1796 // --------------------------------------------------
1797 // add outgoing network connection from string (ip:port format)
1798 bool ServMgr::addOutgoing(Host h, GnuID &netid, bool pri)
1803 if (!findServent(h.ip,h.port,netid))
1805 Servent *sv = allocServent();
1809 sv->priorityConnect = true;
1810 sv->networkID = netid;
1811 sv->initOutgoing(h,Servent::T_OUTGOING);
1819 // --------------------------------------------------
1820 Servent *ServMgr::findConnection(Servent::TYPE t,GnuID &sid)
1822 Servent *sv = servents;
1825 if (sv->isConnected())
1827 if (sv->remoteID.isSame(sid))
1834 // --------------------------------------------------
1835 void ServMgr::procConnectArgs(char *str,ChanInfo &info)
1837 char arg[MAX_CGI_LEN];
1838 char curr[MAX_CGI_LEN];
1840 char *args = strstr(str,"?");
1844 info.initNameID(str);
1849 while (args=nextCGIarg(args,curr,arg))
1851 LOG_DEBUG("cmd: %s, arg: %s",curr,arg);
1853 if (strcmp(curr,"sip")==0)
1854 // sip - add network connection to client with channel
1857 h.fromStrName(arg,DEFAULT_PORT);
1858 if (addOutgoing(h,servMgr->networkID,true))
1859 LOG_NETWORK("Added connection: %s",arg);
1861 }else if (strcmp(curr,"pip")==0)
1862 // pip - add private network connection to client with channel
1865 h.fromStrName(arg,DEFAULT_PORT);
1866 if (addOutgoing(h,info.id,true))
1867 LOG_NETWORK("Added private connection: %s",arg);
1868 }else if (strcmp(curr,"ip")==0)
1872 h.fromStrName(arg,DEFAULT_PORT);
1877 hit.rhost[1].init();
1878 hit.chanID = info.id;
1881 chanMgr->addHit(hit);
1882 }else if (strcmp(curr,"tip")==0)
1883 // tip - add tracker hit
1886 h.fromStrName(arg,DEFAULT_PORT);
1887 chanMgr->hitlistlock.on();
1888 chanMgr->addHit(h,info.id,true);
1889 chanMgr->hitlistlock.off();
1898 // --------------------------------------------------
1899 bool ServMgr::start()
1905 #if PRIVATE_BROADCASTER
1912 LOG_DEBUG("Peercast %s, %s %s",PCX_VERSTRING_EX,peercastApp->getClientTypeOS(),priv);
1915 LOG_DEBUG("Peercast %s, %s %s",PCX_VERSTRING,peercastApp->getClientTypeOS(),priv);
1918 sessionID.toStr(idStr);
1919 LOG_DEBUG("SessionID: %s",idStr);
1921 chanMgr->broadcastID.toStr(idStr);
1922 LOG_DEBUG("BroadcastID: %s",idStr);
1926 serverThread.func = ServMgr::serverProc;
1927 if (!sys->startThread(&serverThread))
1930 idleThread.func = ServMgr::idleProc;
1931 if (!sys->startThread(&idleThread))
1936 // --------------------------------------------------
1937 int ServMgr::clientProc(ThreadInfo *thread)
1943 netID = servMgr->networkID;
1945 while(thread->active)
1947 if (servMgr->autoConnect)
1949 if (servMgr->needConnections() || servMgr->forceLookup)
1951 if (servMgr->needHosts() || servMgr->forceLookup)
1953 // do lookup to find some hosts
1956 lh.fromStrName(servMgr->connectHost,DEFAULT_PORT);
1959 if (!servMgr->findServent(lh.ip,lh.port,netID))
1961 Servent *sv = servMgr->allocServent();
1964 LOG_DEBUG("Lookup: %s",servMgr->connectHost);
1965 sv->networkID = netID;
1966 sv->initOutgoing(lh,Servent::T_LOOKUP);
1967 servMgr->forceLookup = false;
1972 for(int i=0; i<MAX_TRYOUT; i++)
1974 if (servMgr->outUsedFull())
1976 if (servMgr->tryFull())
1980 ServHost sh = servMgr->getOutgoingServent(netID);
1982 if (!servMgr->addOutgoing(sh.host,netID,false))
1983 servMgr->deadHost(sh.host,ServHost::T_SERVENT);
1984 sys->sleep(servMgr->tryoutDelay);
1990 Servent *s = servMgr->servents;
1994 if (s->type == Servent::T_OUTGOING)
1995 s->thread.active = false;
2006 // -----------------------------------
2007 bool ServMgr::acceptGIV(ClientSocket *sock)
2009 Servent *sv = servents;
2012 if (sv->type == Servent::T_COUT)
2014 if (sv->acceptGIV(sock))
2022 // -----------------------------------
2023 int ServMgr::broadcastPushRequest(ChanHit &hit, Host &to, GnuID &chanID, Servent::TYPE type)
2026 MemoryStream pmem(pack.data,sizeof(pack.data));
2027 AtomStream atom(pmem);
2030 atom.writeParent(PCP_BCST,8);
2032 atom.writeParent(PCP_BCST,10);
2034 atom.writeChar(PCP_BCST_GROUP,PCP_BCST_GROUP_ALL);
2035 atom.writeChar(PCP_BCST_HOPS,0);
2036 atom.writeChar(PCP_BCST_TTL,7);
2037 atom.writeBytes(PCP_BCST_DEST,hit.sessionID.id,16);
2038 atom.writeBytes(PCP_BCST_FROM,servMgr->sessionID.id,16);
2039 atom.writeInt(PCP_BCST_VERSION,PCP_CLIENT_VERSION);
2040 atom.writeInt(PCP_BCST_VERSION_VP,PCP_CLIENT_VERSION_VP);
2043 atom.writeBytes(PCP_BCST_VERSION_EX_PREFIX,PCP_CLIENT_VERSION_EX_PREFIX,2);
2044 atom.writeShort(PCP_BCST_VERSION_EX_NUMBER,PCP_CLIENT_VERSION_EX_NUMBER);
2046 atom.writeParent(PCP_PUSH,3);
2047 atom.writeInt(PCP_PUSH_IP,to.ip);
2048 atom.writeShort(PCP_PUSH_PORT,to.port);
2049 atom.writeBytes(PCP_PUSH_CHANID,chanID.id,16);
2052 pack.len = pmem.pos;
2053 pack.type = ChanPacket::T_PCP;
2059 return servMgr->broadcastPacket(pack,noID,servMgr->sessionID,hit.sessionID,type);
2062 // --------------------------------------------------
2063 void ServMgr::writeRootAtoms(AtomStream &atom, bool getUpdate)
2065 atom.writeParent(PCP_ROOT,5 + (getUpdate?1:0));
2066 atom.writeInt(PCP_ROOT_UPDINT,chanMgr->hostUpdateInterval);
2067 atom.writeString(PCP_ROOT_URL,"download.php");
2068 atom.writeInt(PCP_ROOT_CHECKVER,PCP_ROOT_VERSION);
2069 atom.writeInt(PCP_ROOT_NEXT,chanMgr->hostUpdateInterval);
2070 atom.writeString(PCP_MESG_ASCII,rootMsg.cstr());
2072 atom.writeParent(PCP_ROOT_UPDATE,0);
2075 // --------------------------------------------------
2076 void ServMgr::broadcastRootSettings(bool getUpdate)
2082 MemoryStream mem(pack.data,sizeof(pack.data));
2083 AtomStream atom(mem);
2084 if (version_ex == 0)
2086 atom.writeParent(PCP_BCST,7);
2089 atom.writeParent(PCP_BCST,9);
2091 atom.writeChar(PCP_BCST_GROUP,PCP_BCST_GROUP_TRACKERS);
2092 atom.writeChar(PCP_BCST_HOPS,0);
2093 atom.writeChar(PCP_BCST_TTL,7);
2094 atom.writeBytes(PCP_BCST_FROM,sessionID.id,16);
2095 atom.writeInt(PCP_BCST_VERSION,PCP_CLIENT_VERSION);
2096 atom.writeInt(PCP_BCST_VERSION_VP,PCP_CLIENT_VERSION_VP);
2099 atom.writeBytes(PCP_BCST_VERSION_EX_PREFIX,PCP_CLIENT_VERSION_EX_PREFIX,2);
2100 atom.writeShort(PCP_BCST_VERSION_EX_NUMBER,PCP_CLIENT_VERSION_EX_NUMBER);
2102 writeRootAtoms(atom,getUpdate);
2111 broadcastPacket(pack,noID,servMgr->sessionID,noID,Servent::T_CIN);
2114 // --------------------------------------------------
2115 int ServMgr::broadcastPacket(ChanPacket &pack,GnuID &chanID,GnuID &srcID, GnuID &destID, Servent::TYPE type)
2119 Servent *sv = servents;
2122 if (sv->sendPacket(pack,chanID,srcID,destID,type))
2129 // --------------------------------------------------
2130 int ServMgr::idleProc(ThreadInfo *thread)
2135 unsigned int lastPasvFind=0;
2136 unsigned int lastBroadcast=0;
2139 // nothing much to do for the first couple of seconds, so just hang around.
2142 unsigned int lastBWcheck=0;
2143 unsigned int bytesIn=0,bytesOut=0;
2145 unsigned int lastBroadcastConnect = 0;
2146 unsigned int lastRootBroadcast = 0;
2148 unsigned int lastForceIPCheck = 0;
2150 while(thread->active)
2156 unsigned int ctime = sys->getTime();
2159 if (!servMgr->forceIP.isEmpty())
2161 if ((ctime-lastForceIPCheck) > 60)
2163 if (servMgr->checkForceIP())
2167 chanMgr->broadcastTrackerUpdate(noID,true);
2169 lastForceIPCheck = ctime;
2174 if (chanMgr->isBroadcasting())
2176 if ((ctime-lastBroadcastConnect) > 30)
2178 servMgr->connectBroadcaster();
2179 lastBroadcastConnect = ctime;
2183 if (servMgr->isRoot)
2185 if ((servMgr->lastIncoming) && ((ctime-servMgr->lastIncoming) > 60*60))
2187 peercastInst->saveSettings();
2191 if ((ctime-lastRootBroadcast) > chanMgr->hostUpdateInterval)
2193 servMgr->broadcastRootSettings(true);
2194 lastRootBroadcast = ctime;
2200 chanMgr->clearDeadHits(true);
2202 if (servMgr->kickPushStartRelays && servMgr->kickPushInterval) //JP-EX
2204 servMgr->banFirewalledHost();
2207 if (servMgr->shutdownTimer)
2209 if (--servMgr->shutdownTimer <= 0)
2211 peercastInst->saveSettings();
2216 // shutdown idle channels
2217 if (chanMgr->numIdleChannels() > ChanMgr::MAX_IDLE_CHANNELS)
2218 chanMgr->closeOldestIdle();
2224 sys->endThread(thread);
2225 // thread->unlock();
2229 // --------------------------------------------------
2230 int ServMgr::serverProc(ThreadInfo *thread)
2235 Servent *serv = servMgr->allocServent();
2236 Servent *serv2 = servMgr->allocServent();
2238 unsigned int lastLookupTime=0;
2241 while (thread->active)
2244 if (servMgr->restartServer)
2246 serv->abort(); // force close
2247 serv2->abort(); // force close
2250 servMgr->restartServer = false;
2253 if (servMgr->autoServe)
2255 serv->allow = servMgr->allowServer1;
2256 serv2->allow = servMgr->allowServer2;
2259 if ((!serv->sock) || (!serv2->sock))
2261 LOG_DEBUG("Starting servers");
2262 // servMgr->forceLookup = true;
2264 //if (servMgr->serverHost.ip != 0)
2267 if (servMgr->forceNormal)
2268 servMgr->setFirewall(ServMgr::FW_OFF);
2270 servMgr->setFirewall(ServMgr::FW_UNKNOWN);
2272 Host h = servMgr->serverHost;
2275 serv->initServer(h);
2279 serv2->initServer(h);
2286 serv->abort(); // force close
2287 serv2->abort(); // force close
2289 // cancel incoming connectuions
2290 Servent *s = servMgr->servents;
2293 if (s->type == Servent::T_INCOMING)
2294 s->thread.active = false;
2298 servMgr->setFirewall(ServMgr::FW_ON);
2305 sys->endThread(thread);
2306 // thread->unlock();
2310 // -----------------------------------
2311 void ServMgr::setMaxRelays(int max)
2313 if (max < MIN_RELAYS)
2318 // -----------------------------------
2319 XML::Node *ServMgr::createServentXML()
2322 return new XML::Node("servent agent=\"%s\" ",PCX_AGENT);
2325 // --------------------------------------------------
2326 const char *ServHost::getTypeStr(TYPE t)
2330 case T_NONE: return "NONE";
2331 case T_STREAM: return "STREAM";
2332 case T_CHANNEL: return "CHANNEL";
2333 case T_SERVENT: return "SERVENT";
2334 case T_TRACKER: return "TRACKER";
2338 // --------------------------------------------------
2339 ServHost::TYPE ServHost::getTypeFromStr(const char *s)
2341 if (stricmp(s,"NONE")==0)
2343 else if (stricmp(s,"SERVENT")==0)
2345 else if (stricmp(s,"STREAM")==0)
2347 else if (stricmp(s,"CHANNEL")==0)
2349 else if (stricmp(s,"TRACKER")==0)
2356 // --------------------------------------------------
2357 bool ServFilter::writeVariable(Stream &out, const String &var)
2361 if (var == "network")
2362 strcpy(buf,(flags & F_NETWORK)?"1":"0");
2363 else if (var == "private")
2364 strcpy(buf,(flags & F_PRIVATE)?"1":"0");
2365 else if (var == "direct")
2366 strcpy(buf,(flags & F_DIRECT)?"1":"0");
2367 else if (var == "banned")
2368 strcpy(buf,(flags & F_BAN)?"1":"0");
2369 else if (var == "ip")
2375 out.writeString(buf);
2378 // --------------------------------------------------
2379 bool BCID::writeVariable(Stream &out, const String &var)
2385 else if (var == "name")
2386 strcpy(buf,name.cstr());
2387 else if (var == "email")
2388 strcpy(buf,email.cstr());
2389 else if (var == "url")
2390 strcpy(buf,url.cstr());
2391 else if (var == "valid")
2392 strcpy(buf,valid?"Yes":"No");
2397 out.writeString(buf);
2402 // --------------------------------------------------
2403 bool ServMgr::writeVariable(Stream &out, const String &var)
2408 if (var == "version")
2411 strcpy(buf,PCX_VERSTRING_EX);
2414 strcpy(buf,PCX_VERSTRING);
2416 else if (var == "uptime")
2418 str.setFromStopwatch(getUptime());
2419 str.convertTo(String::T_HTML);
2420 strcpy(buf,str.cstr());
2421 }else if (var == "numRelays")
2422 sprintf(buf,"%d",numStreams(Servent::T_RELAY,true));
2423 else if (var == "numDirect")
2424 sprintf(buf,"%d",numStreams(Servent::T_DIRECT,true));
2425 else if (var == "totalConnected")
2426 sprintf(buf,"%d",totalConnected());
2427 else if (var == "numServHosts")
2428 sprintf(buf,"%d",numHosts(ServHost::T_SERVENT));
2429 else if (var == "numServents")
2430 sprintf(buf,"%d",numServents());
2431 else if (var == "serverPort")
2432 sprintf(buf,"%d",serverHost.port);
2433 else if (var == "serverIP")
2434 serverHost.IPtoStr(buf);
2435 else if (var == "ypAddress")
2436 strcpy(buf,rootHost.cstr());
2437 else if (var == "password")
2438 strcpy(buf,password);
2439 else if (var == "isFirewalled")
2440 sprintf(buf,"%d",getFirewall()==FW_ON?1:0);
2441 else if (var == "firewallKnown")
2442 sprintf(buf,"%d",getFirewall()==FW_UNKNOWN?0:1);
2443 else if (var == "rootMsg")
2444 strcpy(buf,rootMsg);
2445 else if (var == "isRoot"){
2446 LOG_DEBUG("isRoot = %d", isRoot);
2447 sprintf(buf,"%d",isRoot?1:0);
2449 else if (var == "isPrivate")
2450 sprintf(buf,"%d",(PCP_BROADCAST_FLAGS&1)?1:0);
2451 else if (var == "forceYP")
2452 sprintf(buf,"%d",PCP_FORCE_YP?1:0);
2453 else if (var == "refreshHTML")
2454 sprintf(buf,"%d",refreshHTML?refreshHTML:0x0fffffff);
2455 else if (var == "maxRelays")
2456 sprintf(buf,"%d",maxRelays);
2457 else if (var == "maxDirect")
2458 sprintf(buf,"%d",maxDirect);
2459 else if (var == "maxBitrateOut")
2460 sprintf(buf,"%d",maxBitrateOut);
2461 else if (var == "maxControlsIn")
2462 sprintf(buf,"%d",maxControl);
2463 else if (var == "maxServIn")
2464 sprintf(buf,"%d",maxServIn);
2465 else if (var == "numFilters") {
2466 LOG_DEBUG("*-* numFilters = %d", numFilters);
2467 sprintf(buf,"%d",numFilters+1);
2469 else if (var == "maxPGNUIn")
2470 sprintf(buf,"%d",maxGnuIncoming);
2471 else if (var == "minPGNUIn")
2472 sprintf(buf,"%d",minGnuIncoming);
2473 else if (var == "numActive1")
2474 sprintf(buf,"%d",numActiveOnPort(serverHost.port));
2475 else if (var == "numActive2")
2476 sprintf(buf,"%d",numActiveOnPort(serverHost.port+1));
2477 else if (var == "numPGNU")
2478 sprintf(buf,"%d",numConnected(Servent::T_PGNU));
2479 else if (var == "numCIN")
2480 sprintf(buf,"%d",numConnected(Servent::T_CIN));
2481 else if (var == "numCOUT")
2482 sprintf(buf,"%d",numConnected(Servent::T_COUT));
2483 else if (var == "numIncoming")
2484 sprintf(buf,"%d",numActive(Servent::T_INCOMING));
2485 else if (var == "numValidBCID")
2488 BCID *bcid = validBCID;
2494 sprintf(buf,"%d",cnt);
2497 else if (var == "disabled")
2498 sprintf(buf,"%d",isDisabled);
2501 else if (var.startsWith("autoRelayKeep")) {
2502 if (var == "autoRelayKeep.0")
2503 strcpy(buf, (autoRelayKeep == 0) ? "1":"0");
2504 else if (var == "autoRelayKeep.1")
2505 strcpy(buf, (autoRelayKeep == 1) ? "1":"0");
2506 else if (var == "autoRelayKeep.2")
2507 strcpy(buf, (autoRelayKeep == 2) ? "1":"0");
2508 } else if (var == "autoMaxRelaySetting")
2509 sprintf(buf,"%d",autoMaxRelaySetting);
2510 else if (var == "autoBumpSkipCount")
2511 sprintf(buf,"%d",autoBumpSkipCount);
2512 else if (var == "kickPushStartRelays")
2513 sprintf(buf,"%d",kickPushStartRelays);
2514 else if (var == "kickPushInterval")
2515 sprintf(buf,"%d",kickPushInterval);
2516 else if (var == "allowConnectPCST")
2517 strcpy(buf, (allowConnectPCST == 1) ? "1":"0");
2518 else if (var == "enableGetName")
2519 strcpy(buf, (enableGetName == 1)? "1":"0");
2522 else if (var == "disableAutoBumpIfDirect")
2523 strcpy(buf, (disableAutoBumpIfDirect == 1) ? "1":"0");
2524 else if (var.startsWith("asxDetailedMode"))
2526 if (var == "asxDetailedMode.0")
2527 strcpy(buf, (asxDetailedMode == 0) ? "1":"0");
2528 else if (var == "asxDetailedMode.1")
2529 strcpy(buf, (asxDetailedMode == 1) ? "1":"0");
2530 else if (var == "asxDetailedMode.2")
2531 strcpy(buf, (asxDetailedMode == 2) ? "1":"0");
2535 else if (var == "ypAddress2")
2536 strcpy(buf,rootHost2.cstr());
2537 else if (var.startsWith("autoPort0Kick")) {
2538 if (var == "autoPort0Kick.0")
2539 strcpy(buf, (autoPort0Kick == 0) ? "1":"0");
2540 else if (var == "autoPort0Kick.1")
2541 strcpy(buf, (autoPort0Kick == 1) ? "1":"0");
2543 else if (var.startsWith("allowOnlyVP")) {
2544 if (var == "allowOnlyVP.0")
2545 strcpy(buf, (allowOnlyVP == 0) ? "1":"0");
2546 else if (var == "allowOnlyVP.1")
2547 strcpy(buf, (allowOnlyVP == 1) ? "1":"0");
2549 else if (var == "kickKeepTime")
2550 sprintf(buf, "%d",kickKeepTime);
2552 else if (var == "serverPort1")
2553 sprintf(buf,"%d",serverHost.port);
2554 else if (var == "serverLocalIP")
2556 Host lh(ClientSocket::getIP(NULL),0);
2560 }else if (var == "upgradeURL")
2561 strcpy(buf,servMgr->downloadURL);
2562 else if (var == "serverPort2")
2563 sprintf(buf,"%d",serverHost.port+1);
2564 else if (var.startsWith("allow."))
2566 if (var == "allow.HTML1")
2567 strcpy(buf,(allowServer1&Servent::ALLOW_HTML)?"1":"0");
2568 else if (var == "allow.HTML2")
2569 strcpy(buf,(allowServer2&Servent::ALLOW_HTML)?"1":"0");
2570 else if (var == "allow.broadcasting1")
2571 strcpy(buf,(allowServer1&Servent::ALLOW_BROADCAST)?"1":"0");
2572 else if (var == "allow.broadcasting2")
2573 strcpy(buf,(allowServer2&Servent::ALLOW_BROADCAST)?"1":"0");
2574 else if (var == "allow.network1")
2575 strcpy(buf,(allowServer1&Servent::ALLOW_NETWORK)?"1":"0");
2576 else if (var == "allow.direct1")
2577 strcpy(buf,(allowServer1&Servent::ALLOW_DIRECT)?"1":"0");
2578 }else if (var.startsWith("auth."))
2580 if (var == "auth.useCookies")
2581 strcpy(buf,(authType==AUTH_COOKIE)?"1":"0");
2582 else if (var == "auth.useHTTP")
2583 strcpy(buf,(authType==AUTH_HTTPBASIC)?"1":"0");
2584 else if (var == "auth.useSessionCookies")
2585 strcpy(buf,(cookieList.neverExpire==false)?"1":"0");
2587 }else if (var.startsWith("log."))
2589 if (var == "log.debug")
2590 strcpy(buf,(showLog&(1<<LogBuffer::T_DEBUG))?"1":"0");
2591 else if (var == "log.errors")
2592 strcpy(buf,(showLog&(1<<LogBuffer::T_ERROR))?"1":"0");
2593 else if (var == "log.gnet")
2594 strcpy(buf,(showLog&(1<<LogBuffer::T_NETWORK))?"1":"0");
2595 else if (var == "log.channel")
2596 strcpy(buf,(showLog&(1<<LogBuffer::T_CHANNEL))?"1":"0");
2599 }else if (var == "test")
2601 out.writeUTF8(0x304b);
2602 out.writeUTF8(0x304d);
2603 out.writeUTF8(0x304f);
2604 out.writeUTF8(0x3051);
2605 out.writeUTF8(0x3053);
2607 out.writeUTF8(0x0041);
2608 out.writeUTF8(0x0042);
2609 out.writeUTF8(0x0043);
2610 out.writeUTF8(0x0044);
2618 }else if (var == "maxRelaysIndexTxt") // for PCRaw (relay)
2619 sprintf(buf, "%d", maxRelaysIndexTxt);
2623 out.writeString(buf);
2626 // --------------------------------------------------
2628 bool ServMgr::isCheckPushStream()
2630 if (servMgr->kickPushStartRelays)
2631 if (servMgr->numStreams(Servent::T_RELAY,false)>=(servMgr->kickPushStartRelays-1))
2636 // --------------------------------------------------
2638 void ServMgr::banFirewalledHost()
2640 unsigned int kickpushtime = sys->getTime();
2641 if ((kickpushtime-servMgr->kickPushTime) > servMgr->kickPushInterval)
2643 servMgr->kickPushTime = kickpushtime;
2644 Servent *s = servMgr->servents;
2645 LOG_DEBUG("Servent scan start.");
2648 if (s->type != Servent::T_NONE)
2650 Host h = s->getHost();
2654 unsigned int tnum = 0;
2657 tnum = sys->getTime() - s->lastConnect;
2658 if ((s->type==Servent::T_RELAY) && (s->status==Servent::S_CONNECTED) && (tnum>servMgr->kickPushInterval))
2660 /* ChanHitList *hits[ChanMgr::MAX_HITLISTS];
2662 for(int i=0; i<ChanMgr::MAX_HITLISTS; i++)
2664 ChanHitList *chl = &chanMgr->hitlists[i];
2666 hits[numHits++] = chl;
2673 for(int k=0; k<numHits; k++)
2675 ChanHitList *chl = hits[k];
2678 for (int j=0; j<ChanHitList::MAX_HITS; j++ )
2680 ChanHit *hit = &chl->hits[j];
2681 if (hit->host.isValid() && (h2.ip == hit->host.ip))
2683 if (hit->firewalled)
2685 numRelay = hit->numRelays;
2691 if ((isfw==true) && (numRelay==0))
2695 if (servMgr->isCheckPushStream())
2697 s->thread.active = false;
2698 LOG_ERROR("Stop firewalled Servent : %s",hostName);
2702 chanMgr->hitlistlock.on();
2703 ChanHitList *chl = chanMgr->findHitListByID(s->chanID);
2705 ChanHit *hit = chl->hit;
2707 if ((hit->numHops == 1) && hit->host.isValid() && (h2.ip == hit->host.ip) && hit->firewalled /*&& !hit->numRelays*/)
2711 if (servMgr->isCheckPushStream())
2713 s->thread.active = false;
2714 LOG_ERROR("Stop firewalled Servent : %s",hostName);
2721 chanMgr->hitlistlock.off();
2728 LOG_DEBUG("Servent scan finished.");
2732 // --------------------------------------------------
2734 static ChanHit *findServentHit(Servent *s)
2736 ChanHitList *chl = chanMgr->findHitListByID(s->chanID);
2737 Host h = s->getHost();
2741 ChanHit *hit = chl->hit;
2744 if ((hit->numHops == 1) && hit->host.isValid() && (h.ip == hit->host.ip))
2752 // --------------------------------------------------
2753 int ServMgr::kickUnrelayableHost(GnuID &chid, ChanHit &sendhit)
2756 Servent *s = servMgr->servents;
2760 if (s->type == Servent::T_RELAY && s->chanID.isSame(chid) && !s->isPrivate())
2762 Host h = s->getHost();
2764 ChanHit hit = s->serventHit;
2765 if (!hit.relay && hit.numRelays == 0 || hit.firewalled)
2769 //s->thread.active = false;
2770 LOG_DEBUG("unrelayable Servent : %s",hostName);
2771 if (!ks || s->lastConnect < ks->lastConnect) // elder servent
2780 if (sendhit.rhost[0].port)
2783 MemoryStream mem(pack.data,sizeof(pack.data));
2784 AtomStream atom(mem);
2785 sendhit.writeAtoms(atom, chid);
2787 pack.type = ChanPacket::T_PCP;
2791 ks->sendPacket(pack, chid, noID, noID, Servent::T_RELAY);
2794 ks->setStatus(Servent::S_CLOSING);
2795 ks->thread.active = false;
2798 ks->getHost().toStr(hostName);
2800 LOG_DEBUG("Stop unrelayable Servent : %s",hostName);