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;
144 noVersionCheck = false;
146 // retrieve newest version number from DNS
147 // for windows ONLY. Linux or other OS is NOT supported.
152 he = gethostbyname(PCP_CLIENT_VERSION_URL);
153 if (he && he->h_addrtype == AF_INET)
155 versionDNS = ((struct in_addr*)he->h_addr_list[0])->S_un.S_un_b.s_b3;
163 // init gray/black-lists
165 IP_graylist = new WTSVector<addrCont>();
166 IP_blacklist = new WTSVector<addrCont>();
175 maxRelaysIndexTxt = 1; // for PCRaw (relay)
179 guiSimpleChannelList = false;
180 guiSimpleConnectionList = false;
183 guiChanListDisplays = 10;
184 guiConnListDisplays = 10;
186 guiTitleModify = false;
187 guiTitleModifyNormal = "PeerCast
\8eรณ
\90M:%rx.kbits.1%kbps
\91\97\90M:%tx.kbits.1%kbps";
188 guiTitleModifyMinimized = "R:%rx.kbytes%KB/s T:%tx.kbytes%KB/s";
190 guiAntennaNotifyIcon = false;
193 disableAutoBumpIfDirect = 1;
197 // start thread (graylist)
201 t.func = ServMgr::graylistThreadFunc;
203 sys->startThread(&t);
206 // -----------------------------------
207 BCID *ServMgr::findValidBCID(int index)
210 BCID *bcid = validBCID;
220 // -----------------------------------
221 BCID *ServMgr::findValidBCID(GnuID &id)
223 BCID *bcid = validBCID;
226 if (bcid->id.isSame(id))
232 // -----------------------------------
233 void ServMgr::removeValidBCID(GnuID &id)
235 BCID *bcid = validBCID,*prev=0;
238 if (bcid->id.isSame(id))
241 prev->next = bcid->next;
243 validBCID = bcid->next;
250 // -----------------------------------
251 void ServMgr::addValidBCID(BCID *bcid)
253 removeValidBCID(bcid->id);
255 bcid->next = validBCID;
259 // -----------------------------------
260 void ServMgr::connectBroadcaster()
262 if (!rootHost.isEmpty())
264 if (!numUsed(Servent::T_COUT))
266 Servent *sv = allocServent();
269 sv->initOutgoing(Servent::T_COUT);
275 // -----------------------------------
276 void ServMgr::addVersion(unsigned int ver)
278 for(int i=0; i<numVersions; i++)
279 if (clientVersions[i] == ver)
285 if (numVersions < MAX_VERSIONS)
287 clientVersions[numVersions] = ver;
288 clientCounts[numVersions] = 1;
293 // -----------------------------------
294 void ServMgr::setFilterDefaults()
298 filters[numFilters].host.fromStrIP("255.255.255.255",0);
299 // filters[numFilters].flags = ServFilter::F_NETWORK|ServFilter::F_DIRECT;
300 filters[numFilters].flags = ServFilter::F_NETWORK;
304 LOG_DEBUG("numFilters = %d", numFilters);
307 // -----------------------------------
308 void ServMgr::setPassiveSearch(unsigned int t)
310 // if ((t > 0) && (t < 60))
312 // passiveSearch = t;
314 // -----------------------------------
315 bool ServMgr::seenHost(Host &h, ServHost::TYPE type,unsigned int time)
317 time = sys->getTime()-time;
319 for(int i=0; i<MAX_HOSTCACHE; i++)
320 if (hostCache[i].type == type)
321 if (hostCache[i].host.ip == h.ip)
322 if (hostCache[i].time >= time)
327 // -----------------------------------
328 void ServMgr::addHost(Host &h, ServHost::TYPE type, unsigned int time)
336 for(i=0; i<MAX_HOSTCACHE; i++)
337 if (hostCache[i].type == type)
338 if (hostCache[i].host.isSame(h))
348 LOG_DEBUG("New host: %s - %s",str,ServHost::getTypeStr(type));
350 LOG_DEBUG("Old host: %s - %s",str,ServHost::getTypeStr(type));
352 h.value = 0; // make sure dead count is zero
358 for(i=0; i<MAX_HOSTCACHE; i++)
359 if (hostCache[i].type == ServHost::T_NONE)
365 // otherwise, find oldest host and replace
367 for(i=0; i<MAX_HOSTCACHE; i++)
368 if (hostCache[i].type != ServHost::T_NONE)
372 if (hostCache[i].time < sh->time)
381 sh->init(h,type,time);
384 // -----------------------------------
385 void ServMgr::deadHost(Host &h,ServHost::TYPE t)
387 for(int i=0; i<MAX_HOSTCACHE; i++)
388 if (hostCache[i].type == t)
389 if (hostCache[i].host.ip == h.ip)
390 if (hostCache[i].host.port == h.port)
393 // -----------------------------------
394 void ServMgr::clearHostCache(ServHost::TYPE type)
396 for(int i=0; i<MAX_HOSTCACHE; i++)
397 if ((hostCache[i].type == type) || (type == ServHost::T_NONE))
401 // -----------------------------------
402 unsigned int ServMgr::numHosts(ServHost::TYPE type)
404 unsigned int cnt = 0;
405 for(int i=0; i<MAX_HOSTCACHE; i++)
406 if ((hostCache[i].type == type) || (type == ServHost::T_NONE))
410 // -----------------------------------
411 int ServMgr::getNewestServents(Host *hl,int max,Host &rh)
414 for(int i=0; i<max; i++)
416 // find newest host not in list
418 for(int j=0; j<MAX_HOSTCACHE; j++)
420 // find newest servent
421 if (hostCache[j].type == ServHost::T_SERVENT)
422 if (!(rh.globalIP() && !hostCache[j].host.globalIP()))
424 // and not in list already
426 for(int k=0; k<cnt; k++)
427 if (hl[k].isSame(hostCache[j].host))
439 if (hostCache[j].time > sh->time)
453 // -----------------------------------
454 ServHost ServMgr::getOutgoingServent(GnuID &netid)
458 Host lh(ClientSocket::getIP(NULL),0);
460 // find newest host not in list
462 for(int j=0; j<MAX_HOSTCACHE; j++)
464 ServHost *hc=&hostCache[j];
465 // find newest servent not already connected.
466 if (hc->type == ServHost::T_SERVENT)
468 if (!((lh.globalIP() && !hc->host.globalIP()) || lh.isSame(hc->host)))
471 if (!findServent(Servent::T_OUTGOING,hc->host,netid))
477 if (hc->time > sh->time)
491 // -----------------------------------
492 Servent *ServMgr::findOldestServent(Servent::TYPE type, bool priv)
494 Servent *oldest=NULL;
496 Servent *s = servents;
500 if (s->thread.active)
501 if (s->isOlderThan(oldest))
502 if (s->isPrivate() == priv)
508 // -----------------------------------
509 Servent *ServMgr::findServent(Servent::TYPE type, Host &host, GnuID &netid)
512 Servent *s = servents;
517 Host h = s->getHost();
518 if (h.isSame(host) && s->networkID.isSame(netid))
531 // -----------------------------------
532 Servent *ServMgr::findServent(unsigned int ip, unsigned short port, GnuID &netid)
535 Servent *s = servents;
538 if (s->type != Servent::T_NONE)
540 Host h = s->getHost();
541 if ((h.ip == ip) && (h.port == port) && (s->networkID.isSame(netid)))
554 // -----------------------------------
555 Servent *ServMgr::findServent(Servent::TYPE t)
557 Servent *s = servents;
566 // -----------------------------------
567 Servent *ServMgr::findServentByIndex(int id)
569 Servent *s = servents;
581 // -----------------------------------
582 Servent *ServMgr::findServentByServentID(int id)
584 Servent *s = servents;
587 if (id == s->servent_id){
595 // -----------------------------------
596 Servent *ServMgr::allocServent()
600 Servent *s = servents;
603 if (s->status == Servent::S_FREE)
610 s = new Servent(++serventNum);
614 LOG_DEBUG("allocated servent %d",serventNum);
616 LOG_DEBUG("reused servent %d",s->serventIndex);
625 // --------------------------------------------------
626 void ServMgr::closeConnections(Servent::TYPE type)
628 Servent *sv = servents;
631 if (sv->isConnected())
632 if (sv->type == type)
633 sv->thread.active = false;
638 // -----------------------------------
639 unsigned int ServMgr::numConnected(int type,bool priv,unsigned int uptime)
643 unsigned int ctime=sys->getTime();
644 Servent *s = servents;
647 if (s->thread.active)
648 if (s->isConnected())
650 if (s->isPrivate()==priv)
651 if ((ctime-s->lastConnect) >= uptime)
658 // -----------------------------------
659 unsigned int ServMgr::numConnected()
663 Servent *s = servents;
666 if (s->thread.active)
667 if (s->isConnected())
674 // -----------------------------------
675 unsigned int ServMgr::numServents()
679 Servent *s = servents;
688 // -----------------------------------
689 unsigned int ServMgr::numUsed(int type)
693 Servent *s = servents;
702 // -----------------------------------
703 unsigned int ServMgr::numActiveOnPort(int port)
707 Servent *s = servents;
710 if (s->thread.active && s->sock && (s->servPort == port))
716 // -----------------------------------
717 unsigned int ServMgr::numActive(Servent::TYPE tp)
721 Servent *s = servents;
724 if (s->thread.active && s->sock && (s->type == tp))
731 // -----------------------------------
732 unsigned int ServMgr::totalOutput(bool all)
734 unsigned int tot = 0;
735 Servent *s = servents;
738 if (s->isConnected())
739 if (all || !s->isPrivate())
741 tot += s->sock->bytesOutPerSec;
748 // -----------------------------------
749 unsigned int ServMgr::totalInput(bool all)
751 unsigned int tot = 0;
752 Servent *s = servents;
755 if (s->isConnected())
756 if (all || !s->isPrivate())
758 tot += s->sock->bytesInPerSec;
765 // -----------------------------------
766 unsigned int ServMgr::numOutgoing()
770 Servent *s = servents;
773 // if ((s->type == Servent::T_INCOMING) ||
774 // (s->type == Servent::T_OUTGOING))
781 // -----------------------------------
782 bool ServMgr::seenPacket(GnuPacket &p)
784 Servent *s = servents;
787 if (s->isConnected())
788 if (s->seenIDs.contains(p.id))
795 // -----------------------------------
798 LOG_DEBUG("ServMgr is quitting..");
800 serverThread.shutdown();
802 idleThread.shutdown();
804 Servent *s = servents;
809 if (s->thread.active)
811 s->thread.shutdown();
814 }catch(StreamException &)
821 // -----------------------------------
822 int ServMgr::broadcast(GnuPacket &pack,Servent *src)
827 Servent *s = servents;
832 if (s->isConnected())
833 if (s->type == Servent::T_PGNU)
834 if (!s->seenIDs.contains(pack.id))
838 if (!src->networkID.isSame(s->networkID))
841 if (s->outputPacket(pack,false))
848 LOG_NETWORK("broadcast: %s (%d) to %d servents",GNU_FUNC_STR(pack.func),pack.ttl,cnt);
852 // -----------------------------------
853 int ServMgr::route(GnuPacket &pack, GnuID &routeID, Servent *src)
858 Servent *s = servents;
862 if (s->isConnected())
863 if (s->type == Servent::T_PGNU)
864 if (!s->seenIDs.contains(pack.id))
865 if (s->seenIDs.contains(routeID))
868 if (!src->networkID.isSame(s->networkID))
871 if (s->outputPacket(pack,true))
879 LOG_NETWORK("route: %s (%d) to %d servents",GNU_FUNC_STR(pack.func),pack.ttl,cnt);
882 // -----------------------------------
883 bool ServMgr::checkForceIP()
885 if (!forceIP.isEmpty())
887 unsigned int newIP = ClientSocket::getIP(forceIP.cstr());
888 if (serverHost.ip != newIP)
890 serverHost.ip = newIP;
892 serverHost.IPtoStr(ipstr);
893 LOG_DEBUG("Server IP changed to %s",ipstr);
900 // -----------------------------------
901 void ServMgr::checkFirewall()
903 if ((getFirewall() == FW_UNKNOWN) && !servMgr->rootHost.isEmpty())
906 LOG_DEBUG("Checking firewall..");
908 host.fromStrName(servMgr->rootHost.cstr(),DEFAULT_PORT);
910 ClientSocket *sock = sys->createSocket();
912 throw StreamException("Unable to create socket");
913 sock->setReadTimeout(30000);
917 AtomStream atom(*sock);
919 atom.writeInt(PCP_CONNECT,1);
923 Servent::handshakeOutgoingPCP(atom,sock->host,remoteID,agent,true);
925 atom.writeInt(PCP_QUIT,PCP_ERROR_QUIT);
932 // -----------------------------------
933 void ServMgr::setFirewall(FW_STATE state)
935 if (firewalled != state)
952 LOG_DEBUG("Firewall is set to %s",str);
956 // -----------------------------------
957 bool ServMgr::isFiltered(int fl, Host &h)
959 for(int i=0; i<numFilters; i++)
960 if (filters[i].flags & fl)
961 if (h.isMemberOf(filters[i].host))
968 // -----------------------------------
969 bool ServMgr::canServeHost(Host &h)
973 Host sh = server->getHost();
975 if (sh.globalIP() || (sh.localIP() && h.localIP()))
982 // --------------------------------------------------
983 void writeServerSettings(IniFile &iniFile, unsigned int a)
985 iniFile.writeBoolValue("allowHTML",a & Servent::ALLOW_HTML);
986 iniFile.writeBoolValue("allowBroadcast",a & Servent::ALLOW_BROADCAST);
987 iniFile.writeBoolValue("allowNetwork",a & Servent::ALLOW_NETWORK);
988 iniFile.writeBoolValue("allowDirect",a & Servent::ALLOW_DIRECT);
990 // --------------------------------------------------
991 void writeFilterSettings(IniFile &iniFile, ServFilter &f)
994 f.host.IPtoStr(ipstr);
995 iniFile.writeStrValue("ip",ipstr);
996 iniFile.writeBoolValue("private",f.flags & ServFilter::F_PRIVATE);
997 iniFile.writeBoolValue("ban",f.flags & ServFilter::F_BAN);
998 iniFile.writeBoolValue("network",f.flags & ServFilter::F_NETWORK);
999 iniFile.writeBoolValue("direct",f.flags & ServFilter::F_DIRECT);
1002 // --------------------------------------------------
1003 static void writeServHost(IniFile &iniFile, ServHost &sh)
1005 iniFile.writeSection("Host");
1008 sh.host.toStr(ipStr);
1009 iniFile.writeStrValue("type",ServHost::getTypeStr(sh.type));
1010 iniFile.writeStrValue("address",ipStr);
1011 iniFile.writeIntValue("time",sh.time);
1013 iniFile.writeLine("[End]");
1018 extern WINDOWPLACEMENT winPlace;
1022 // --------------------------------------------------
1023 void ServMgr::saveSettings(const char *fn)
1026 if (!iniFile.openWriteReplace(fn))
1028 LOG_ERROR("Unable to open ini file");
1030 LOG_DEBUG("Saving settings to: %s",fn);
1034 iniFile.writeSection("Server");
1035 iniFile.writeIntValue("serverPort",servMgr->serverHost.port);
1036 iniFile.writeBoolValue("autoServe",servMgr->autoServe);
1037 iniFile.writeStrValue("forceIP",servMgr->forceIP);
1038 iniFile.writeBoolValue("isRoot",servMgr->isRoot);
1039 iniFile.writeIntValue("maxBitrateOut",servMgr->maxBitrateOut);
1040 iniFile.writeIntValue("maxRelays",servMgr->maxRelays);
1041 iniFile.writeIntValue("maxDirect",servMgr->maxDirect);
1042 iniFile.writeIntValue("maxRelaysPerChannel",chanMgr->maxRelaysPerChannel);
1043 iniFile.writeIntValue("firewallTimeout",firewallTimeout);
1044 iniFile.writeBoolValue("forceNormal",forceNormal);
1045 iniFile.writeStrValue("rootMsg",rootMsg.cstr());
1046 iniFile.writeStrValue("authType",servMgr->authType==ServMgr::AUTH_COOKIE?"cookie":"http-basic");
1047 iniFile.writeStrValue("cookiesExpire",servMgr->cookieList.neverExpire==true?"never":"session");
1048 iniFile.writeStrValue("htmlPath",servMgr->htmlPath);
1049 iniFile.writeIntValue("minPGNUIncoming",servMgr->minGnuIncoming);
1050 iniFile.writeIntValue("maxPGNUIncoming",servMgr->maxGnuIncoming);
1051 iniFile.writeIntValue("maxServIn",servMgr->maxServIn);
1052 iniFile.writeStrValue("chanLog",servMgr->chanLog.cstr());
1054 networkID.toStr(idStr);
1055 iniFile.writeStrValue("networkID",idStr);
1058 iniFile.writeSection("Broadcast");
1059 iniFile.writeIntValue("broadcastMsgInterval",chanMgr->broadcastMsgInterval);
1060 iniFile.writeStrValue("broadcastMsg",chanMgr->broadcastMsg.cstr());
1061 iniFile.writeIntValue("icyMetaInterval",chanMgr->icyMetaInterval);
1062 chanMgr->broadcastID.toStr(idStr);
1063 iniFile.writeStrValue("broadcastID",idStr);
1064 iniFile.writeIntValue("hostUpdateInterval",chanMgr->hostUpdateInterval);
1065 iniFile.writeIntValue("maxControlConnections",servMgr->maxControl);
1066 iniFile.writeStrValue("rootHost",servMgr->rootHost.cstr());
1068 iniFile.writeSection("Client");
1069 iniFile.writeIntValue("refreshHTML",refreshHTML);
1070 iniFile.writeIntValue("relayBroadcast",servMgr->relayBroadcast);
1071 iniFile.writeIntValue("minBroadcastTTL",chanMgr->minBroadcastTTL);
1072 iniFile.writeIntValue("maxBroadcastTTL",chanMgr->maxBroadcastTTL);
1073 iniFile.writeIntValue("pushTries",chanMgr->pushTries);
1074 iniFile.writeIntValue("pushTimeout",chanMgr->pushTimeout);
1075 iniFile.writeIntValue("maxPushHops",chanMgr->maxPushHops);
1076 iniFile.writeIntValue("autoQuery",chanMgr->autoQuery);
1077 iniFile.writeIntValue("queryTTL",servMgr->queryTTL);
1080 iniFile.writeSection("Privacy");
1081 iniFile.writeStrValue("password",servMgr->password);
1082 iniFile.writeIntValue("maxUptime",chanMgr->maxUptime);
1085 iniFile.writeSection("Extend");
1086 iniFile.writeIntValue("autoRelayKeep",servMgr->autoRelayKeep);
1087 iniFile.writeIntValue("autoMaxRelaySetting",servMgr->autoMaxRelaySetting);
1088 iniFile.writeIntValue("autoBumpSkipCount",servMgr->autoBumpSkipCount);
1089 iniFile.writeIntValue("kickPushStartRelays",servMgr->kickPushStartRelays);
1090 iniFile.writeIntValue("kickPushInterval",servMgr->kickPushInterval);
1091 iniFile.writeIntValue("allowConnectPCST",servMgr->allowConnectPCST);
1092 iniFile.writeIntValue("enableGetName",servMgr->enableGetName);
1094 iniFile.writeIntValue("maxRelaysIndexTxt", servMgr->maxRelaysIndexTxt); // for PCRaw (relay)
1097 iniFile.writeIntValue("disableAutoBumpIfDirect",servMgr->disableAutoBumpIfDirect);
1098 iniFile.writeIntValue("asxDetailedMode",servMgr->asxDetailedMode);
1100 iniFile.writeSection("PP");
1102 iniFile.writeBoolValue("ppClapSound", servMgr->ppClapSound);
1103 iniFile.writeStrValue("ppClapSoundPath", servMgr->ppClapSoundPath.cstr());
1108 iniFile.writeSection("Windows");
1109 iniFile.writeBoolValue("getModulePath",servMgr->getModulePath);
1110 iniFile.writeBoolValue("clearPLS",servMgr->clearPLS);
1111 iniFile.writeBoolValue("writeLogFile",servMgr->writeLogFile);
1114 iniFile.writeStrValue("rootHost2",servMgr->rootHost2.cstr());
1115 iniFile.writeBoolValue("autoPort0Kick",servMgr->autoPort0Kick);
1116 iniFile.writeBoolValue("allowOnlyVP",servMgr->allowOnlyVP);
1117 iniFile.writeIntValue("kickKeepTime",servMgr->kickKeepTime);
1118 iniFile.writeBoolValue("vpDebug", servMgr->vpDebug);
1119 iniFile.writeBoolValue("saveIniChannel", servMgr->saveIniChannel);
1121 iniFile.writeBoolValue("saveGuiPos", servMgr->saveGuiPos);
1123 GetWindowPlacement(guiWnd, &winPlace);
1124 iniFile.writeIntValue("guiTop", winPlace.rcNormalPosition.top);
1125 iniFile.writeIntValue("guiBottom", winPlace.rcNormalPosition.bottom);
1126 iniFile.writeIntValue("guiLeft", winPlace.rcNormalPosition.left);
1127 iniFile.writeIntValue("guiRight", winPlace.rcNormalPosition.right);
1131 iniFile.writeBoolValue("guiSimpleChannelList", servMgr->guiSimpleChannelList);
1132 iniFile.writeBoolValue("guiSimpleConnectionList", servMgr->guiSimpleConnectionList);
1133 iniFile.writeBoolValue("guiTopMost", servMgr->guiTopMost);
1135 iniFile.writeIntValue("guiChanListDisplays", servMgr->guiChanListDisplays);
1136 iniFile.writeIntValue("guiConnListDisplays", servMgr->guiConnListDisplays);
1138 iniFile.writeBoolValue("guiTitleModify", servMgr->guiTitleModify);
1139 iniFile.writeStrValue("guiTitleModifyNormal", servMgr->guiTitleModifyNormal.cstr());
1140 iniFile.writeStrValue("guiTitleModifyMinimized", servMgr->guiTitleModifyMinimized.cstr());
1142 iniFile.writeBoolValue("guiAntennaNotifyIcon", servMgr->guiAntennaNotifyIcon);
1145 iniFile.writeBoolValue("topmostGui", servMgr->topmostGui);
1146 iniFile.writeBoolValue("startWithGui", servMgr->startWithGui);
1147 iniFile.writeBoolValue("preventSS", servMgr->preventSS);
1148 iniFile.writeBoolValue("noVersionCheck", servMgr->noVersionCheck);
1152 for(i=0; i<servMgr->numFilters; i++)
1154 iniFile.writeSection("Filter");
1155 writeFilterSettings(iniFile,servMgr->filters[i]);
1156 iniFile.writeLine("[End]");
1159 iniFile.writeSection("Notify");
1160 iniFile.writeBoolValue("PeerCast",notifyMask&NT_PEERCAST);
1161 iniFile.writeBoolValue("Broadcasters",notifyMask&NT_BROADCASTERS);
1162 iniFile.writeBoolValue("TrackInfo",notifyMask&NT_TRACKINFO);
1163 iniFile.writeBoolValue("Applause",notifyMask&NT_APPLAUSE); //JP-MOD
1164 iniFile.writeLine("[End]");
1167 iniFile.writeSection("Server1");
1168 writeServerSettings(iniFile,allowServer1);
1169 iniFile.writeLine("[End]");
1171 iniFile.writeSection("Server2");
1172 writeServerSettings(iniFile,allowServer2);
1173 iniFile.writeLine("[End]");
1177 iniFile.writeSection("Debug");
1178 iniFile.writeBoolValue("logDebug",(showLog&(1<<LogBuffer::T_DEBUG))!=0);
1179 iniFile.writeBoolValue("logErrors",(showLog&(1<<LogBuffer::T_ERROR))!=0);
1180 iniFile.writeBoolValue("logNetwork",(showLog&(1<<LogBuffer::T_NETWORK))!=0);
1181 iniFile.writeBoolValue("logChannel",(showLog&(1<<LogBuffer::T_CHANNEL))!=0);
1182 iniFile.writeBoolValue("pauseLog",pauseLog);
1183 iniFile.writeIntValue("idleSleepTime",sys->idleSleepTime);
1186 if (servMgr->validBCID)
1188 BCID *bcid = servMgr->validBCID;
1191 iniFile.writeSection("ValidBCID");
1193 bcid->id.toStr(idstr);
1194 iniFile.writeStrValue("id",idstr);
1195 iniFile.writeStrValue("name",bcid->name.cstr());
1196 iniFile.writeStrValue("email",bcid->email.cstr());
1197 iniFile.writeStrValue("url",bcid->url.cstr());
1198 iniFile.writeBoolValue("valid",bcid->valid);
1199 iniFile.writeLine("[End]");
1205 if (servMgr->saveIniChannel){
1206 Channel *c = chanMgr->channel;
1210 if (c->isActive() && c->stayConnected)
1214 iniFile.writeSection("RelayChannel");
1215 iniFile.writeStrValue("name",c->getName());
1216 iniFile.writeStrValue("genre",c->info.genre.cstr());
1217 if (!c->sourceURL.isEmpty())
1218 iniFile.writeStrValue("sourceURL",c->sourceURL.cstr());
1219 iniFile.writeStrValue("sourceProtocol",ChanInfo::getProtocolStr(c->info.srcProtocol));
1220 iniFile.writeStrValue("contentType",ChanInfo::getTypeStr(c->info.contentType));
1221 iniFile.writeIntValue("bitrate",c->info.bitrate);
1222 iniFile.writeStrValue("contactURL",c->info.url.cstr());
1223 iniFile.writeStrValue("id",idstr);
1224 iniFile.writeBoolValue("stayConnected",c->stayConnected);
1226 ChanHitList *chl = chanMgr->findHitListByID(c->info.id);
1231 chs.trackersOnly = true;
1232 if (chl->pickHits(chs))
1235 chs.best[0].host.toStr(ipStr);
1236 iniFile.writeStrValue("tracker",ipStr);
1239 iniFile.writeLine("[End]");
1248 Servent *s = servents;
1251 if (s->type == Servent::T_OUTGOING)
1252 if (s->isConnected())
1255 Host h = s->getHost();
1256 sh.init(h,ServHost::T_SERVENT,0,s->networkID);
1257 writeServHost(iniFile,sh);
1263 for(i=0; i<ServMgr::MAX_HOSTCACHE; i++)
1265 ServHost *sh = &servMgr->hostCache[i];
1266 if (sh->type != ServHost::T_NONE)
1267 writeServHost(iniFile,*sh);
1273 // --------------------------------------------------
1274 unsigned int readServerSettings(IniFile &iniFile, unsigned int a)
1276 while (iniFile.readNext())
1278 if (iniFile.isName("[End]"))
1280 else if (iniFile.isName("allowHTML"))
1281 a = iniFile.getBoolValue()?a|Servent::ALLOW_HTML:a&~Servent::ALLOW_HTML;
1282 else if (iniFile.isName("allowDirect"))
1283 a = iniFile.getBoolValue()?a|Servent::ALLOW_DIRECT:a&~Servent::ALLOW_DIRECT;
1284 else if (iniFile.isName("allowNetwork"))
1285 a = iniFile.getBoolValue()?a|Servent::ALLOW_NETWORK:a&~Servent::ALLOW_NETWORK;
1286 else if (iniFile.isName("allowBroadcast"))
1287 a = iniFile.getBoolValue()?a|Servent::ALLOW_BROADCAST:a&~Servent::ALLOW_BROADCAST;
1291 // --------------------------------------------------
1292 void readFilterSettings(IniFile &iniFile, ServFilter &sv)
1296 while (iniFile.readNext())
1298 if (iniFile.isName("[End]"))
1300 else if (iniFile.isName("ip"))
1301 sv.host.fromStrIP(iniFile.getStrValue(),0);
1302 else if (iniFile.isName("private"))
1303 sv.flags = (sv.flags & ~ServFilter::F_PRIVATE) | (iniFile.getBoolValue()?ServFilter::F_PRIVATE:0);
1304 else if (iniFile.isName("ban"))
1305 sv.flags = (sv.flags & ~ServFilter::F_BAN) | (iniFile.getBoolValue()?ServFilter::F_BAN:0);
1306 else if (iniFile.isName("allow") || iniFile.isName("network"))
1307 sv.flags = (sv.flags & ~ServFilter::F_NETWORK) | (iniFile.getBoolValue()?ServFilter::F_NETWORK:0);
1308 else if (iniFile.isName("direct"))
1309 sv.flags = (sv.flags & ~ServFilter::F_DIRECT) | (iniFile.getBoolValue()?ServFilter::F_DIRECT:0);
1313 // --------------------------------------------------
1314 void ServMgr::loadSettings(const char *fn)
1318 if (!iniFile.openReadOnly(fn))
1322 servMgr->numFilters = 0;
1325 if (iniFile.openReadOnly(fn))
1327 while (iniFile.readNext())
1330 if (iniFile.isName("serverPort"))
1331 servMgr->serverHost.port = iniFile.getIntValue();
1332 else if (iniFile.isName("autoServe"))
1333 servMgr->autoServe = iniFile.getBoolValue();
1334 else if (iniFile.isName("autoConnect"))
1335 servMgr->autoConnect = iniFile.getBoolValue();
1336 else if (iniFile.isName("icyPassword")) // depreciated
1337 strcpy(servMgr->password,iniFile.getStrValue());
1338 else if (iniFile.isName("forceIP"))
1339 servMgr->forceIP = iniFile.getStrValue();
1340 else if (iniFile.isName("isRoot"))
1341 servMgr->isRoot = iniFile.getBoolValue();
1342 else if (iniFile.isName("broadcastID"))
1344 chanMgr->broadcastID.fromStr(iniFile.getStrValue());
1345 chanMgr->broadcastID.id[0] = PCP_BROADCAST_FLAGS; // hacky, but we need to fix old clients
1347 }else if (iniFile.isName("htmlPath"))
1348 strcpy(servMgr->htmlPath,iniFile.getStrValue());
1349 else if (iniFile.isName("maxPGNUIncoming"))
1350 servMgr->maxGnuIncoming = iniFile.getIntValue();
1351 else if (iniFile.isName("minPGNUIncoming"))
1352 servMgr->minGnuIncoming = iniFile.getIntValue();
1354 else if (iniFile.isName("maxControlConnections"))
1356 servMgr->maxControl = iniFile.getIntValue();
1359 else if (iniFile.isName("maxBitrateOut"))
1360 servMgr->maxBitrateOut = iniFile.getIntValue();
1362 else if (iniFile.isName("maxStreamsOut")) // depreciated
1363 servMgr->setMaxRelays(iniFile.getIntValue());
1364 else if (iniFile.isName("maxRelays"))
1365 servMgr->setMaxRelays(iniFile.getIntValue());
1366 else if (iniFile.isName("maxDirect"))
1367 servMgr->maxDirect = iniFile.getIntValue();
1369 else if (iniFile.isName("maxStreamsPerChannel")) // depreciated
1370 chanMgr->maxRelaysPerChannel = iniFile.getIntValue();
1371 else if (iniFile.isName("maxRelaysPerChannel"))
1372 chanMgr->maxRelaysPerChannel = iniFile.getIntValue();
1374 else if (iniFile.isName("firewallTimeout"))
1375 firewallTimeout = iniFile.getIntValue();
1376 else if (iniFile.isName("forceNormal"))
1377 forceNormal = iniFile.getBoolValue();
1378 else if (iniFile.isName("broadcastMsgInterval"))
1379 chanMgr->broadcastMsgInterval = iniFile.getIntValue();
1380 else if (iniFile.isName("broadcastMsg"))
1381 chanMgr->broadcastMsg.set(iniFile.getStrValue(),String::T_ASCII);
1382 else if (iniFile.isName("hostUpdateInterval"))
1383 chanMgr->hostUpdateInterval = iniFile.getIntValue();
1384 else if (iniFile.isName("icyMetaInterval"))
1385 chanMgr->icyMetaInterval = iniFile.getIntValue();
1386 else if (iniFile.isName("maxServIn"))
1387 servMgr->maxServIn = iniFile.getIntValue();
1388 else if (iniFile.isName("chanLog"))
1389 servMgr->chanLog.set(iniFile.getStrValue(),String::T_ASCII);
1391 else if (iniFile.isName("rootMsg"))
1392 rootMsg.set(iniFile.getStrValue());
1393 else if (iniFile.isName("networkID"))
1394 networkID.fromStr(iniFile.getStrValue());
1395 else if (iniFile.isName("authType"))
1397 char *t = iniFile.getStrValue();
1398 if (stricmp(t,"cookie")==0)
1399 servMgr->authType = ServMgr::AUTH_COOKIE;
1400 else if (stricmp(t,"http-basic")==0)
1401 servMgr->authType = ServMgr::AUTH_HTTPBASIC;
1402 }else if (iniFile.isName("cookiesExpire"))
1404 char *t = iniFile.getStrValue();
1405 if (stricmp(t,"never")==0)
1406 servMgr->cookieList.neverExpire = true;
1407 else if (stricmp(t,"session")==0)
1408 servMgr->cookieList.neverExpire = false;
1414 else if (iniFile.isName("password"))
1415 strcpy(servMgr->password,iniFile.getStrValue());
1416 else if (iniFile.isName("maxUptime"))
1417 chanMgr->maxUptime = iniFile.getIntValue();
1421 else if (iniFile.isName("rootHost"))
1424 servMgr->rootHost = iniFile.getStrValue();
1426 }else if (iniFile.isName("deadHitAge"))
1427 chanMgr->deadHitAge = iniFile.getIntValue();
1428 else if (iniFile.isName("tryoutDelay"))
1429 servMgr->tryoutDelay = iniFile.getIntValue();
1430 else if (iniFile.isName("refreshHTML"))
1431 refreshHTML = iniFile.getIntValue();
1432 else if (iniFile.isName("relayBroadcast"))
1434 servMgr->relayBroadcast = iniFile.getIntValue();
1435 if (servMgr->relayBroadcast < 30)
1436 servMgr->relayBroadcast = 30;
1438 else if (iniFile.isName("minBroadcastTTL"))
1439 chanMgr->minBroadcastTTL = iniFile.getIntValue();
1440 else if (iniFile.isName("maxBroadcastTTL"))
1441 chanMgr->maxBroadcastTTL = iniFile.getIntValue();
1442 else if (iniFile.isName("pushTimeout"))
1443 chanMgr->pushTimeout = iniFile.getIntValue();
1444 else if (iniFile.isName("pushTries"))
1445 chanMgr->pushTries = iniFile.getIntValue();
1446 else if (iniFile.isName("maxPushHops"))
1447 chanMgr->maxPushHops = iniFile.getIntValue();
1448 else if (iniFile.isName("autoQuery"))
1450 chanMgr->autoQuery = iniFile.getIntValue();
1451 if ((chanMgr->autoQuery < 300) && (chanMgr->autoQuery > 0))
1452 chanMgr->autoQuery = 300;
1454 else if (iniFile.isName("queryTTL"))
1456 servMgr->queryTTL = iniFile.getIntValue();
1460 else if (iniFile.isName("autoRelayKeep"))
1461 servMgr->autoRelayKeep = iniFile.getIntValue();
1462 else if (iniFile.isName("autoMaxRelaySetting"))
1463 servMgr->autoMaxRelaySetting = iniFile.getIntValue();
1464 else if (iniFile.isName("autoBumpSkipCount"))
1465 servMgr->autoBumpSkipCount = iniFile.getIntValue();
1466 else if (iniFile.isName("kickPushStartRelays"))
1467 servMgr->kickPushStartRelays = iniFile.getIntValue();
1468 else if (iniFile.isName("kickPushInterval"))
1470 servMgr->kickPushInterval = iniFile.getIntValue();
1471 if (servMgr->kickPushInterval < 60)
1472 servMgr->kickPushInterval = 0;
1474 else if (iniFile.isName("allowConnectPCST"))
1475 servMgr->allowConnectPCST = iniFile.getIntValue();
1476 else if (iniFile.isName("enableGetName"))
1477 servMgr->enableGetName = iniFile.getIntValue();
1479 else if (iniFile.isName("maxRelaysIndexTxt")) // for PCRaw (relay)
1480 servMgr->maxRelaysIndexTxt = iniFile.getIntValue();
1483 else if (iniFile.isName("disableAutoBumpIfDirect"))
1484 servMgr->disableAutoBumpIfDirect = iniFile.getIntValue();
1485 else if (iniFile.isName("asxDetailedMode"))
1486 servMgr->asxDetailedMode = iniFile.getIntValue();
1489 else if (iniFile.isName("ppClapSound"))
1490 servMgr->ppClapSound = iniFile.getBoolValue();
1491 else if (iniFile.isName("ppClapSoundPath"))
1492 servMgr->ppClapSoundPath.set(iniFile.getStrValue(),String::T_ASCII);
1496 else if (iniFile.isName("getModulePath"))
1497 servMgr->getModulePath = iniFile.getBoolValue();
1498 else if (iniFile.isName("clearPLS"))
1499 servMgr->clearPLS = iniFile.getBoolValue();
1500 else if (iniFile.isName("writeLogFile"))
1501 servMgr->writeLogFile = iniFile.getBoolValue();
1504 else if (iniFile.isName("rootHost2"))
1507 servMgr->rootHost2 = iniFile.getStrValue();
1509 else if (iniFile.isName("autoPort0Kick"))
1510 servMgr->autoPort0Kick = iniFile.getBoolValue();
1511 else if (iniFile.isName("allowOnlyVP"))
1512 servMgr->allowOnlyVP = iniFile.getBoolValue();
1513 else if (iniFile.isName("kickKeepTime"))
1514 servMgr->kickKeepTime = iniFile.getIntValue();
1515 else if (iniFile.isName("vpDebug"))
1516 servMgr->vpDebug = iniFile.getBoolValue();
1517 else if (iniFile.isName("saveIniChannel"))
1518 servMgr->saveIniChannel = iniFile.getBoolValue();
1520 else if (iniFile.isName("saveGuiPos"))
1521 servMgr->saveGuiPos = iniFile.getBoolValue();
1522 else if (iniFile.isName("guiTop"))
1523 winPlace.rcNormalPosition.top = iniFile.getIntValue();
1524 else if (iniFile.isName("guiBottom"))
1525 winPlace.rcNormalPosition.bottom = iniFile.getIntValue();
1526 else if (iniFile.isName("guiLeft"))
1527 winPlace.rcNormalPosition.left = iniFile.getIntValue();
1528 else if (iniFile.isName("guiRight")){
1529 winPlace.rcNormalPosition.right = iniFile.getIntValue();
1530 winPlace.length = sizeof(winPlace);
1532 winPlace.showCmd = 1;
1533 winPlace.ptMinPosition.x = -1;
1534 winPlace.ptMinPosition.y = -1;
1535 winPlace.ptMaxPosition.x = -1;
1536 winPlace.ptMaxPosition.y = -1;
1537 if (servMgr->saveGuiPos){
1540 }else if (iniFile.isName("guiSimpleChannelList")) //JP-MOD
1541 servMgr->guiSimpleChannelList = iniFile.getBoolValue();
1542 else if (iniFile.isName("guiSimpleConnectionList")) //JP-MOD
1543 servMgr->guiSimpleConnectionList = iniFile.getBoolValue();
1544 else if (iniFile.isName("guiTopMost")) //JP-MOD
1545 servMgr->guiTopMost = iniFile.getBoolValue();
1546 else if (iniFile.isName("guiChanListDisplays")) //JP-MOD
1547 servMgr->guiChanListDisplays = iniFile.getIntValue();
1548 else if (iniFile.isName("guiConnListDisplays")) //JP-MOD
1549 servMgr->guiConnListDisplays = iniFile.getIntValue();
1550 else if (iniFile.isName("guiTitleModify")) //JP-MOD
1551 servMgr->guiTitleModify = iniFile.getBoolValue();
1552 else if (iniFile.isName("guiTitleModifyNormal")) //JP-MOD
1553 servMgr->guiTitleModifyNormal.set(iniFile.getStrValue(),String::T_ASCII);
1554 else if (iniFile.isName("guiTitleModifyMinimized")) //JP-MOD
1555 servMgr->guiTitleModifyMinimized.set(iniFile.getStrValue(),String::T_ASCII);
1556 else if (iniFile.isName("guiAntennaNotifyIcon")) //JP-MOD
1557 servMgr->guiAntennaNotifyIcon = iniFile.getBoolValue();
1559 else if (iniFile.isName("topmostGui"))
1560 servMgr->topmostGui = iniFile.getBoolValue();
1561 else if (iniFile.isName("startWithGui"))
1562 servMgr->startWithGui = iniFile.getBoolValue();
1563 else if (iniFile.isName("preventSS"))
1564 servMgr->preventSS = iniFile.getBoolValue();
1565 else if (iniFile.isName("noVersionCheck"))
1566 servMgr->noVersionCheck = iniFile.getBoolValue();
1570 else if (iniFile.isName("logDebug"))
1571 showLog |= iniFile.getBoolValue() ? 1<<LogBuffer::T_DEBUG:0;
1572 else if (iniFile.isName("logErrors"))
1573 showLog |= iniFile.getBoolValue() ? 1<<LogBuffer::T_ERROR:0;
1574 else if (iniFile.isName("logNetwork"))
1575 showLog |= iniFile.getBoolValue() ? 1<<LogBuffer::T_NETWORK:0;
1576 else if (iniFile.isName("logChannel"))
1577 showLog |= iniFile.getBoolValue() ? 1<<LogBuffer::T_CHANNEL:0;
1578 else if (iniFile.isName("pauseLog"))
1579 pauseLog = iniFile.getBoolValue();
1580 else if (iniFile.isName("idleSleepTime"))
1581 sys->idleSleepTime = iniFile.getIntValue();
1582 else if (iniFile.isName("[Server1]"))
1583 allowServer1 = readServerSettings(iniFile,allowServer1);
1584 else if (iniFile.isName("[Server2]"))
1585 allowServer2 = readServerSettings(iniFile,allowServer2);
1586 else if (iniFile.isName("[Filter]"))
1588 readFilterSettings(iniFile,filters[numFilters]);
1590 if (numFilters < (MAX_FILTERS-1))
1592 LOG_DEBUG("*** numFilters = %d", numFilters);
1594 else if (iniFile.isName("[Notify]"))
1596 notifyMask = NT_UPGRADE;
1597 while (iniFile.readNext())
1599 if (iniFile.isName("[End]"))
1601 else if (iniFile.isName("PeerCast"))
1602 notifyMask |= iniFile.getBoolValue()?NT_PEERCAST:0;
1603 else if (iniFile.isName("Broadcasters"))
1604 notifyMask |= iniFile.getBoolValue()?NT_BROADCASTERS:0;
1605 else if (iniFile.isName("TrackInfo"))
1606 notifyMask |= iniFile.getBoolValue()?NT_TRACKINFO:0;
1607 else if (iniFile.isName("Applause")) //JP-MOD
1608 notifyMask |= iniFile.getBoolValue()?NT_APPLAUSE:0;
1612 else if (iniFile.isName("[RelayChannel]"))
1615 bool stayConnected=false;
1617 while (iniFile.readNext())
1619 if (iniFile.isName("[End]"))
1621 else if (iniFile.isName("name"))
1622 info.name.set(iniFile.getStrValue());
1623 else if (iniFile.isName("id"))
1624 info.id.fromStr(iniFile.getStrValue());
1625 else if (iniFile.isName("sourceType"))
1626 info.srcProtocol = ChanInfo::getProtocolFromStr(iniFile.getStrValue());
1627 else if (iniFile.isName("contentType"))
1628 info.contentType = ChanInfo::getTypeFromStr(iniFile.getStrValue());
1629 else if (iniFile.isName("stayConnected"))
1630 stayConnected = iniFile.getBoolValue();
1631 else if (iniFile.isName("sourceURL"))
1632 sourceURL.set(iniFile.getStrValue());
1633 else if (iniFile.isName("genre"))
1634 info.genre.set(iniFile.getStrValue());
1635 else if (iniFile.isName("contactURL"))
1636 info.url.set(iniFile.getStrValue());
1637 else if (iniFile.isName("bitrate"))
1638 info.bitrate = atoi(iniFile.getStrValue());
1639 else if (iniFile.isName("tracker"))
1644 hit.host.fromStrName(iniFile.getStrValue(),DEFAULT_PORT);
1645 hit.rhost[0] = hit.host;
1646 hit.rhost[1] = hit.host;
1647 hit.chanID = info.id;
1649 chanMgr->addHit(hit);
1653 if (sourceURL.isEmpty())
1655 chanMgr->createRelay(info,stayConnected);
1658 info.bcID = chanMgr->broadcastID;
1659 Channel *c = chanMgr->createChannel(info,NULL);
1661 c->startURL(sourceURL.cstr());
1663 } else if (iniFile.isName("[Host]"))
1666 ServHost::TYPE type=ServHost::T_NONE;
1667 bool firewalled=false;
1668 unsigned int time=0;
1669 while (iniFile.readNext())
1671 if (iniFile.isName("[End]"))
1673 else if (iniFile.isName("address"))
1674 h.fromStrIP(iniFile.getStrValue(),DEFAULT_PORT);
1675 else if (iniFile.isName("type"))
1676 type = ServHost::getTypeFromStr(iniFile.getStrValue());
1677 else if (iniFile.isName("time"))
1678 time = iniFile.getIntValue();
1680 servMgr->addHost(h,type,time);
1682 } else if (iniFile.isName("[ValidBCID]"))
1684 BCID *bcid = new BCID();
1685 while (iniFile.readNext())
1687 if (iniFile.isName("[End]"))
1689 else if (iniFile.isName("id"))
1690 bcid->id.fromStr(iniFile.getStrValue());
1691 else if (iniFile.isName("name"))
1692 bcid->name.set(iniFile.getStrValue());
1693 else if (iniFile.isName("email"))
1694 bcid->email.set(iniFile.getStrValue());
1695 else if (iniFile.isName("url"))
1696 bcid->url.set(iniFile.getStrValue());
1697 else if (iniFile.isName("valid"))
1698 bcid->valid = iniFile.getBoolValue();
1700 servMgr->addValidBCID(bcid);
1706 setFilterDefaults();
1708 LOG_DEBUG("numFilters = %d", numFilters);
1711 // --------------------------------------------------
1712 unsigned int ServMgr::numStreams(GnuID &cid, Servent::TYPE tp, bool all)
1715 Servent *sv = servents;
1718 if (sv->isConnected())
1720 if (sv->chanID.isSame(cid))
1721 if (all || !sv->isPrivate())
1727 // --------------------------------------------------
1728 unsigned int ServMgr::numStreams(Servent::TYPE tp, bool all)
1731 Servent *sv = servents;
1734 if (sv->isConnected())
1736 if (all || !sv->isPrivate())
1738 // for PCRaw (relay) start.
1739 if(tp == Servent::T_RELAY)
1741 Channel *ch = chanMgr->findChannelByID(sv->chanID);
1743 // index.txt
\82ร
\83J
\83E
\83\93\83g
\82ยต
\82ร
\82ยข
1748 // for PCRaw (relay) end.
1758 // --------------------------------------------------
1759 bool ServMgr::getChannel(char *str,ChanInfo &info, bool relay)
1761 // remove file extension (only added for winamp)
1762 //char *ext = strstr(str,".");
1763 //if (ext) *ext = 0;
1765 procConnectArgs(str,info);
1767 WLockBlock wb(&(chanMgr->channellock));
1772 ch = chanMgr->findChannelByNameID(info);
1773 if (ch && ch->thread.active)
1776 if (!ch->isPlaying())
1780 ch->info.lastPlayStart = 0; // force reconnect
1781 ch->info.lastPlayEnd = 0;
1786 info = ch->info; // get updated channel info
1789 } else if (ch && ch->thread.finish)
1791 // wait until deleting channel
1795 ch = chanMgr->findChannelByNameID(info);
1798 // same as else block
1802 ch = chanMgr->findAndRelay(info);
1805 //
\81ยซException point
1806 info = ch->info; //get updated channel info
1815 ch = chanMgr->findAndRelay(info);
1818 //
\81ยซException point
1819 info = ch->info; //get updated channel info
1827 // --------------------------------------------------
1828 int ServMgr::findChannel(ChanInfo &info)
1832 info.id.toStr(idStr);
1835 if (info.id.isSet())
1837 // if we have an ID then try and connect to known hosts carrying channel.
1838 ServHost sh = getOutgoingServent(info.id);
1839 addOutgoing(sh.host,info.id,true);
1845 XML::Node *n = info.createQueryXML();
1847 pack.initFind(NULL,&xml,servMgr->queryTTL);
1849 addReplyID(pack.id);
1850 int cnt = broadcast(pack,NULL);
1852 LOG_NETWORK("Querying network: %s %s - %d servents",info.name.cstr(),idStr,cnt);
1858 // --------------------------------------------------
1859 // add outgoing network connection from string (ip:port format)
1860 bool ServMgr::addOutgoing(Host h, GnuID &netid, bool pri)
1865 if (!findServent(h.ip,h.port,netid))
1867 Servent *sv = allocServent();
1871 sv->priorityConnect = true;
1872 sv->networkID = netid;
1873 sv->initOutgoing(h,Servent::T_OUTGOING);
1881 // --------------------------------------------------
1882 Servent *ServMgr::findConnection(Servent::TYPE t,GnuID &sid)
1884 Servent *sv = servents;
1887 if (sv->isConnected())
1889 if (sv->remoteID.isSame(sid))
1896 // --------------------------------------------------
1897 void ServMgr::procConnectArgs(char *str,ChanInfo &info)
1899 char arg[MAX_CGI_LEN];
1900 char curr[MAX_CGI_LEN];
1902 char *args = strstr(str,"?");
1906 info.initNameID(str);
1911 while (args=nextCGIarg(args,curr,arg))
1913 LOG_DEBUG("cmd: %s, arg: %s",curr,arg);
1915 if (strcmp(curr,"sip")==0)
1916 // sip - add network connection to client with channel
1919 h.fromStrName(arg,DEFAULT_PORT);
1920 if (addOutgoing(h,servMgr->networkID,true))
1921 LOG_NETWORK("Added connection: %s",arg);
1923 }else if (strcmp(curr,"pip")==0)
1924 // pip - add private network connection to client with channel
1927 h.fromStrName(arg,DEFAULT_PORT);
1928 if (addOutgoing(h,info.id,true))
1929 LOG_NETWORK("Added private connection: %s",arg);
1930 }else if (strcmp(curr,"ip")==0)
1934 h.fromStrName(arg,DEFAULT_PORT);
1939 hit.rhost[1].init();
1940 hit.chanID = info.id;
1943 chanMgr->addHit(hit);
1944 }else if (strcmp(curr,"tip")==0)
1945 // tip - add tracker hit
1948 h.fromStrName(arg,DEFAULT_PORT);
1949 chanMgr->hitlistlock.on();
1950 chanMgr->addHit(h,info.id,true);
1951 chanMgr->hitlistlock.off();
1960 // --------------------------------------------------
1961 bool ServMgr::start()
1967 #if PRIVATE_BROADCASTER
1974 LOG_DEBUG("Peercast %s, %s %s",PCX_VERSTRING_EX,peercastApp->getClientTypeOS(),priv);
1977 LOG_DEBUG("Peercast %s, %s %s",PCX_VERSTRING,peercastApp->getClientTypeOS(),priv);
1980 sessionID.toStr(idStr);
1981 LOG_DEBUG("SessionID: %s",idStr);
1983 chanMgr->broadcastID.toStr(idStr);
1984 LOG_DEBUG("BroadcastID: %s",idStr);
1988 serverThread.func = ServMgr::serverProc;
1989 if (!sys->startThread(&serverThread))
1992 idleThread.func = ServMgr::idleProc;
1993 if (!sys->startThread(&idleThread))
1998 // --------------------------------------------------
1999 int ServMgr::clientProc(ThreadInfo *thread)
2005 netID = servMgr->networkID;
2007 while(thread->active)
2009 if (servMgr->autoConnect)
2011 if (servMgr->needConnections() || servMgr->forceLookup)
2013 if (servMgr->needHosts() || servMgr->forceLookup)
2015 // do lookup to find some hosts
2018 lh.fromStrName(servMgr->connectHost,DEFAULT_PORT);
2021 if (!servMgr->findServent(lh.ip,lh.port,netID))
2023 Servent *sv = servMgr->allocServent();
2026 LOG_DEBUG("Lookup: %s",servMgr->connectHost);
2027 sv->networkID = netID;
2028 sv->initOutgoing(lh,Servent::T_LOOKUP);
2029 servMgr->forceLookup = false;
2034 for(int i=0; i<MAX_TRYOUT; i++)
2036 if (servMgr->outUsedFull())
2038 if (servMgr->tryFull())
2042 ServHost sh = servMgr->getOutgoingServent(netID);
2044 if (!servMgr->addOutgoing(sh.host,netID,false))
2045 servMgr->deadHost(sh.host,ServHost::T_SERVENT);
2046 sys->sleep(servMgr->tryoutDelay);
2052 Servent *s = servMgr->servents;
2056 if (s->type == Servent::T_OUTGOING)
2057 s->thread.active = false;
2068 // -----------------------------------
2069 bool ServMgr::acceptGIV(ClientSocket *sock)
2071 Servent *sv = servents;
2074 if (sv->type == Servent::T_COUT)
2076 if (sv->acceptGIV(sock))
2084 // -----------------------------------
2085 int ServMgr::broadcastPushRequest(ChanHit &hit, Host &to, GnuID &chanID, Servent::TYPE type)
2088 MemoryStream pmem(pack.data,sizeof(pack.data));
2089 AtomStream atom(pmem);
2092 atom.writeParent(PCP_BCST,8);
2094 atom.writeParent(PCP_BCST,10);
2096 atom.writeChar(PCP_BCST_GROUP,PCP_BCST_GROUP_ALL);
2097 atom.writeChar(PCP_BCST_HOPS,0);
2098 atom.writeChar(PCP_BCST_TTL,7);
2099 atom.writeBytes(PCP_BCST_DEST,hit.sessionID.id,16);
2100 atom.writeBytes(PCP_BCST_FROM,servMgr->sessionID.id,16);
2101 atom.writeInt(PCP_BCST_VERSION,PCP_CLIENT_VERSION);
2102 atom.writeInt(PCP_BCST_VERSION_VP,PCP_CLIENT_VERSION_VP);
2105 atom.writeBytes(PCP_BCST_VERSION_EX_PREFIX,PCP_CLIENT_VERSION_EX_PREFIX,2);
2106 atom.writeShort(PCP_BCST_VERSION_EX_NUMBER,PCP_CLIENT_VERSION_EX_NUMBER);
2108 atom.writeParent(PCP_PUSH,3);
2109 atom.writeInt(PCP_PUSH_IP,to.ip);
2110 atom.writeShort(PCP_PUSH_PORT,to.port);
2111 atom.writeBytes(PCP_PUSH_CHANID,chanID.id,16);
2114 pack.len = pmem.pos;
2115 pack.type = ChanPacket::T_PCP;
2121 return servMgr->broadcastPacket(pack,noID,servMgr->sessionID,hit.sessionID,type);
2124 // --------------------------------------------------
2125 void ServMgr::writeRootAtoms(AtomStream &atom, bool getUpdate)
2127 atom.writeParent(PCP_ROOT,5 + (getUpdate?1:0));
2128 atom.writeInt(PCP_ROOT_UPDINT,chanMgr->hostUpdateInterval);
2129 atom.writeString(PCP_ROOT_URL,"download.php");
2130 atom.writeInt(PCP_ROOT_CHECKVER,PCP_ROOT_VERSION);
2131 atom.writeInt(PCP_ROOT_NEXT,chanMgr->hostUpdateInterval);
2132 atom.writeString(PCP_MESG_ASCII,rootMsg.cstr());
2134 atom.writeParent(PCP_ROOT_UPDATE,0);
2137 // --------------------------------------------------
2138 void ServMgr::broadcastRootSettings(bool getUpdate)
2144 MemoryStream mem(pack.data,sizeof(pack.data));
2145 AtomStream atom(mem);
2146 if (version_ex == 0)
2148 atom.writeParent(PCP_BCST,7);
2151 atom.writeParent(PCP_BCST,9);
2153 atom.writeChar(PCP_BCST_GROUP,PCP_BCST_GROUP_TRACKERS);
2154 atom.writeChar(PCP_BCST_HOPS,0);
2155 atom.writeChar(PCP_BCST_TTL,7);
2156 atom.writeBytes(PCP_BCST_FROM,sessionID.id,16);
2157 atom.writeInt(PCP_BCST_VERSION,PCP_CLIENT_VERSION);
2158 atom.writeInt(PCP_BCST_VERSION_VP,PCP_CLIENT_VERSION_VP);
2161 atom.writeBytes(PCP_BCST_VERSION_EX_PREFIX,PCP_CLIENT_VERSION_EX_PREFIX,2);
2162 atom.writeShort(PCP_BCST_VERSION_EX_NUMBER,PCP_CLIENT_VERSION_EX_NUMBER);
2164 writeRootAtoms(atom,getUpdate);
2173 broadcastPacket(pack,noID,servMgr->sessionID,noID,Servent::T_CIN);
2176 // --------------------------------------------------
2177 int ServMgr::broadcastPacket(ChanPacket &pack,GnuID &chanID,GnuID &srcID, GnuID &destID, Servent::TYPE type)
2181 Servent *sv = servents;
2184 if (sv->sendPacket(pack,chanID,srcID,destID,type))
2191 // --------------------------------------------------
2192 int ServMgr::idleProc(ThreadInfo *thread)
2197 unsigned int lastPasvFind=0;
2198 unsigned int lastBroadcast=0;
2201 // nothing much to do for the first couple of seconds, so just hang around.
2204 unsigned int lastBWcheck=0;
2205 unsigned int bytesIn=0,bytesOut=0;
2207 unsigned int lastBroadcastConnect = 0;
2208 unsigned int lastRootBroadcast = 0;
2210 unsigned int lastForceIPCheck = 0;
2212 while(thread->active)
2218 unsigned int ctime = sys->getTime();
2221 if (!servMgr->forceIP.isEmpty())
2223 if ((ctime-lastForceIPCheck) > 60)
2225 if (servMgr->checkForceIP())
2229 chanMgr->broadcastTrackerUpdate(noID,true);
2231 lastForceIPCheck = ctime;
2236 if (chanMgr->isBroadcasting())
2238 if ((ctime-lastBroadcastConnect) > 30)
2240 servMgr->connectBroadcaster();
2241 lastBroadcastConnect = ctime;
2245 if (servMgr->isRoot)
2247 if ((servMgr->lastIncoming) && ((ctime-servMgr->lastIncoming) > 60*60))
2249 peercastInst->saveSettings();
2253 if ((ctime-lastRootBroadcast) > chanMgr->hostUpdateInterval)
2255 servMgr->broadcastRootSettings(true);
2256 lastRootBroadcast = ctime;
2262 chanMgr->clearDeadHits(true);
2264 if (servMgr->kickPushStartRelays && servMgr->kickPushInterval) //JP-EX
2266 servMgr->banFirewalledHost();
2269 if (servMgr->shutdownTimer)
2271 if (--servMgr->shutdownTimer <= 0)
2273 peercastInst->saveSettings();
2278 // shutdown idle channels
2279 if (chanMgr->numIdleChannels() > ChanMgr::MAX_IDLE_CHANNELS)
2280 chanMgr->closeOldestIdle();
2286 sys->endThread(thread);
2287 // thread->unlock();
2291 // --------------------------------------------------
2292 int ServMgr::serverProc(ThreadInfo *thread)
2297 Servent *serv = servMgr->allocServent();
2298 Servent *serv2 = servMgr->allocServent();
2300 unsigned int lastLookupTime=0;
2303 while (thread->active)
2306 if (servMgr->restartServer)
2308 serv->abort(); // force close
2309 serv2->abort(); // force close
2312 servMgr->restartServer = false;
2315 if (servMgr->autoServe)
2317 serv->allow = servMgr->allowServer1;
2318 serv2->allow = servMgr->allowServer2;
2321 if ((!serv->sock) || (!serv2->sock))
2323 LOG_DEBUG("Starting servers");
2324 // servMgr->forceLookup = true;
2326 //if (servMgr->serverHost.ip != 0)
2329 if (servMgr->forceNormal)
2330 servMgr->setFirewall(ServMgr::FW_OFF);
2332 servMgr->setFirewall(ServMgr::FW_UNKNOWN);
2334 Host h = servMgr->serverHost;
2337 serv->initServer(h);
2341 serv2->initServer(h);
2348 serv->abort(); // force close
2349 serv2->abort(); // force close
2351 // cancel incoming connectuions
2352 Servent *s = servMgr->servents;
2355 if (s->type == Servent::T_INCOMING)
2356 s->thread.active = false;
2360 servMgr->setFirewall(ServMgr::FW_ON);
2367 sys->endThread(thread);
2368 // thread->unlock();
2372 // -----------------------------------
2373 void ServMgr::setMaxRelays(int max)
2375 if (max < MIN_RELAYS)
2380 // -----------------------------------
2381 XML::Node *ServMgr::createServentXML()
2384 return new XML::Node("servent agent=\"%s\" ",PCX_AGENT);
2387 // --------------------------------------------------
2388 const char *ServHost::getTypeStr(TYPE t)
2392 case T_NONE: return "NONE";
2393 case T_STREAM: return "STREAM";
2394 case T_CHANNEL: return "CHANNEL";
2395 case T_SERVENT: return "SERVENT";
2396 case T_TRACKER: return "TRACKER";
2400 // --------------------------------------------------
2401 ServHost::TYPE ServHost::getTypeFromStr(const char *s)
2403 if (stricmp(s,"NONE")==0)
2405 else if (stricmp(s,"SERVENT")==0)
2407 else if (stricmp(s,"STREAM")==0)
2409 else if (stricmp(s,"CHANNEL")==0)
2411 else if (stricmp(s,"TRACKER")==0)
2418 // --------------------------------------------------
2419 bool ServFilter::writeVariable(Stream &out, const String &var)
2423 if (var == "network")
2424 strcpy(buf,(flags & F_NETWORK)?"1":"0");
2425 else if (var == "private")
2426 strcpy(buf,(flags & F_PRIVATE)?"1":"0");
2427 else if (var == "direct")
2428 strcpy(buf,(flags & F_DIRECT)?"1":"0");
2429 else if (var == "banned")
2430 strcpy(buf,(flags & F_BAN)?"1":"0");
2431 else if (var == "ip")
2437 out.writeString(buf);
2440 // --------------------------------------------------
2441 bool BCID::writeVariable(Stream &out, const String &var)
2447 else if (var == "name")
2448 strcpy(buf,name.cstr());
2449 else if (var == "email")
2450 strcpy(buf,email.cstr());
2451 else if (var == "url")
2452 strcpy(buf,url.cstr());
2453 else if (var == "valid")
2454 strcpy(buf,valid?"Yes":"No");
2459 out.writeString(buf);
2464 // --------------------------------------------------
2465 bool ServMgr::writeVariable(Stream &out, const String &var)
2470 if (var == "version")
2473 strcpy(buf,PCX_VERSTRING_EX);
2476 strcpy(buf,PCX_VERSTRING);
2478 else if (var == "uptime")
2480 str.setFromStopwatch(getUptime());
2481 str.convertTo(String::T_HTML);
2482 strcpy(buf,str.cstr());
2483 }else if (var == "numRelays")
2484 sprintf(buf,"%d",numStreams(Servent::T_RELAY,true));
2485 else if (var == "numDirect")
2486 sprintf(buf,"%d",numStreams(Servent::T_DIRECT,true));
2487 else if (var == "totalConnected")
2488 sprintf(buf,"%d",totalConnected());
2489 else if (var == "numServHosts")
2490 sprintf(buf,"%d",numHosts(ServHost::T_SERVENT));
2491 else if (var == "numServents")
2492 sprintf(buf,"%d",numServents());
2493 else if (var == "serverPort")
2494 sprintf(buf,"%d",serverHost.port);
2495 else if (var == "serverIP")
2496 serverHost.IPtoStr(buf);
2497 else if (var == "ypAddress")
2498 strcpy(buf,rootHost.cstr());
2499 else if (var == "password")
2500 strcpy(buf,password);
2501 else if (var == "isFirewalled")
2502 sprintf(buf,"%d",getFirewall()==FW_ON?1:0);
2503 else if (var == "firewallKnown")
2504 sprintf(buf,"%d",getFirewall()==FW_UNKNOWN?0:1);
2505 else if (var == "rootMsg")
2506 strcpy(buf,rootMsg);
2507 else if (var == "isRoot"){
2508 LOG_DEBUG("isRoot = %d", isRoot);
2509 sprintf(buf,"%d",isRoot?1:0);
2511 else if (var == "isPrivate")
2512 sprintf(buf,"%d",(PCP_BROADCAST_FLAGS&1)?1:0);
2513 else if (var == "forceYP")
2514 sprintf(buf,"%d",PCP_FORCE_YP?1:0);
2515 else if (var == "refreshHTML")
2516 sprintf(buf,"%d",refreshHTML?refreshHTML:0x0fffffff);
2517 else if (var == "maxRelays")
2518 sprintf(buf,"%d",maxRelays);
2519 else if (var == "maxDirect")
2520 sprintf(buf,"%d",maxDirect);
2521 else if (var == "maxBitrateOut")
2522 sprintf(buf,"%d",maxBitrateOut);
2523 else if (var == "maxControlsIn")
2524 sprintf(buf,"%d",maxControl);
2525 else if (var == "maxServIn")
2526 sprintf(buf,"%d",maxServIn);
2527 else if (var == "numFilters") {
2528 LOG_DEBUG("*-* numFilters = %d", numFilters);
2529 sprintf(buf,"%d",numFilters+1);
2531 else if (var == "maxPGNUIn")
2532 sprintf(buf,"%d",maxGnuIncoming);
2533 else if (var == "minPGNUIn")
2534 sprintf(buf,"%d",minGnuIncoming);
2535 else if (var == "numActive1")
2536 sprintf(buf,"%d",numActiveOnPort(serverHost.port));
2537 else if (var == "numActive2")
2538 sprintf(buf,"%d",numActiveOnPort(serverHost.port+1));
2539 else if (var == "numPGNU")
2540 sprintf(buf,"%d",numConnected(Servent::T_PGNU));
2541 else if (var == "numCIN")
2542 sprintf(buf,"%d",numConnected(Servent::T_CIN));
2543 else if (var == "numCOUT")
2544 sprintf(buf,"%d",numConnected(Servent::T_COUT));
2545 else if (var == "numIncoming")
2546 sprintf(buf,"%d",numActive(Servent::T_INCOMING));
2547 else if (var == "numValidBCID")
2550 BCID *bcid = validBCID;
2556 sprintf(buf,"%d",cnt);
2559 else if (var == "disabled")
2560 sprintf(buf,"%d",isDisabled);
2563 else if (var.startsWith("autoRelayKeep")) {
2564 if (var == "autoRelayKeep.0")
2565 strcpy(buf, (autoRelayKeep == 0) ? "1":"0");
2566 else if (var == "autoRelayKeep.1")
2567 strcpy(buf, (autoRelayKeep == 1) ? "1":"0");
2568 else if (var == "autoRelayKeep.2")
2569 strcpy(buf, (autoRelayKeep == 2) ? "1":"0");
2570 } else if (var == "autoMaxRelaySetting")
2571 sprintf(buf,"%d",autoMaxRelaySetting);
2572 else if (var == "autoBumpSkipCount")
2573 sprintf(buf,"%d",autoBumpSkipCount);
2574 else if (var == "kickPushStartRelays")
2575 sprintf(buf,"%d",kickPushStartRelays);
2576 else if (var == "kickPushInterval")
2577 sprintf(buf,"%d",kickPushInterval);
2578 else if (var == "allowConnectPCST")
2579 strcpy(buf, (allowConnectPCST == 1) ? "1":"0");
2580 else if (var == "enableGetName")
2581 strcpy(buf, (enableGetName == 1)? "1":"0");
2584 else if (var == "disableAutoBumpIfDirect")
2585 strcpy(buf, (disableAutoBumpIfDirect == 1) ? "1":"0");
2586 else if (var.startsWith("asxDetailedMode"))
2588 if (var == "asxDetailedMode.0")
2589 strcpy(buf, (asxDetailedMode == 0) ? "1":"0");
2590 else if (var == "asxDetailedMode.1")
2591 strcpy(buf, (asxDetailedMode == 1) ? "1":"0");
2592 else if (var == "asxDetailedMode.2")
2593 strcpy(buf, (asxDetailedMode == 2) ? "1":"0");
2597 else if (var == "ypAddress2")
2598 strcpy(buf,rootHost2.cstr());
2599 else if (var.startsWith("autoPort0Kick")) {
2600 if (var == "autoPort0Kick.0")
2601 strcpy(buf, (autoPort0Kick == 0) ? "1":"0");
2602 else if (var == "autoPort0Kick.1")
2603 strcpy(buf, (autoPort0Kick == 1) ? "1":"0");
2605 else if (var.startsWith("allowOnlyVP")) {
2606 if (var == "allowOnlyVP.0")
2607 strcpy(buf, (allowOnlyVP == 0) ? "1":"0");
2608 else if (var == "allowOnlyVP.1")
2609 strcpy(buf, (allowOnlyVP == 1) ? "1":"0");
2611 else if (var == "kickKeepTime")
2612 sprintf(buf, "%d",kickKeepTime);
2614 else if (var == "serverPort1")
2615 sprintf(buf,"%d",serverHost.port);
2616 else if (var == "serverLocalIP")
2618 Host lh(ClientSocket::getIP(NULL),0);
2622 }else if (var == "upgradeURL")
2623 strcpy(buf,servMgr->downloadURL);
2624 else if (var == "serverPort2")
2625 sprintf(buf,"%d",serverHost.port+1);
2626 else if (var.startsWith("allow."))
2628 if (var == "allow.HTML1")
2629 strcpy(buf,(allowServer1&Servent::ALLOW_HTML)?"1":"0");
2630 else if (var == "allow.HTML2")
2631 strcpy(buf,(allowServer2&Servent::ALLOW_HTML)?"1":"0");
2632 else if (var == "allow.broadcasting1")
2633 strcpy(buf,(allowServer1&Servent::ALLOW_BROADCAST)?"1":"0");
2634 else if (var == "allow.broadcasting2")
2635 strcpy(buf,(allowServer2&Servent::ALLOW_BROADCAST)?"1":"0");
2636 else if (var == "allow.network1")
2637 strcpy(buf,(allowServer1&Servent::ALLOW_NETWORK)?"1":"0");
2638 else if (var == "allow.direct1")
2639 strcpy(buf,(allowServer1&Servent::ALLOW_DIRECT)?"1":"0");
2640 }else if (var.startsWith("auth."))
2642 if (var == "auth.useCookies")
2643 strcpy(buf,(authType==AUTH_COOKIE)?"1":"0");
2644 else if (var == "auth.useHTTP")
2645 strcpy(buf,(authType==AUTH_HTTPBASIC)?"1":"0");
2646 else if (var == "auth.useSessionCookies")
2647 strcpy(buf,(cookieList.neverExpire==false)?"1":"0");
2649 }else if (var.startsWith("log."))
2651 if (var == "log.debug")
2652 strcpy(buf,(showLog&(1<<LogBuffer::T_DEBUG))?"1":"0");
2653 else if (var == "log.errors")
2654 strcpy(buf,(showLog&(1<<LogBuffer::T_ERROR))?"1":"0");
2655 else if (var == "log.gnet")
2656 strcpy(buf,(showLog&(1<<LogBuffer::T_NETWORK))?"1":"0");
2657 else if (var == "log.channel")
2658 strcpy(buf,(showLog&(1<<LogBuffer::T_CHANNEL))?"1":"0");
2661 }else if (var == "test")
2663 out.writeUTF8(0x304b);
2664 out.writeUTF8(0x304d);
2665 out.writeUTF8(0x304f);
2666 out.writeUTF8(0x3051);
2667 out.writeUTF8(0x3053);
2669 out.writeUTF8(0x0041);
2670 out.writeUTF8(0x0042);
2671 out.writeUTF8(0x0043);
2672 out.writeUTF8(0x0044);
2680 }else if (var == "maxRelaysIndexTxt") // for PCRaw (relay)
2681 sprintf(buf, "%d", maxRelaysIndexTxt);
2685 out.writeString(buf);
2688 // --------------------------------------------------
2690 bool ServMgr::isCheckPushStream()
2692 if (servMgr->kickPushStartRelays)
2693 if (servMgr->numStreams(Servent::T_RELAY,false)>=(servMgr->kickPushStartRelays-1))
2698 // --------------------------------------------------
2700 void ServMgr::banFirewalledHost()
2702 unsigned int kickpushtime = sys->getTime();
2703 if ((kickpushtime-servMgr->kickPushTime) > servMgr->kickPushInterval)
2705 servMgr->kickPushTime = kickpushtime;
2706 Servent *s = servMgr->servents;
2707 LOG_DEBUG("Servent scan start.");
2710 if (s->type != Servent::T_NONE)
2712 Host h = s->getHost();
2716 unsigned int tnum = 0;
2719 tnum = sys->getTime() - s->lastConnect;
2720 if ((s->type==Servent::T_RELAY) && (s->status==Servent::S_CONNECTED) && (tnum>servMgr->kickPushInterval))
2722 /* ChanHitList *hits[ChanMgr::MAX_HITLISTS];
2724 for(int i=0; i<ChanMgr::MAX_HITLISTS; i++)
2726 ChanHitList *chl = &chanMgr->hitlists[i];
2728 hits[numHits++] = chl;
2735 for(int k=0; k<numHits; k++)
2737 ChanHitList *chl = hits[k];
2740 for (int j=0; j<ChanHitList::MAX_HITS; j++ )
2742 ChanHit *hit = &chl->hits[j];
2743 if (hit->host.isValid() && (h2.ip == hit->host.ip))
2745 if (hit->firewalled)
2747 numRelay = hit->numRelays;
2753 if ((isfw==true) && (numRelay==0))
2757 if (servMgr->isCheckPushStream())
2759 s->thread.active = false;
2760 LOG_ERROR("Stop firewalled Servent : %s",hostName);
2764 chanMgr->hitlistlock.on();
2765 ChanHitList *chl = chanMgr->findHitListByID(s->chanID);
2767 ChanHit *hit = chl->hit;
2769 if ((hit->numHops == 1) && hit->host.isValid() && (h2.ip == hit->host.ip) && hit->firewalled /*&& !hit->numRelays*/)
2773 if (servMgr->isCheckPushStream())
2775 s->thread.active = false;
2776 LOG_ERROR("Stop firewalled Servent : %s",hostName);
2783 chanMgr->hitlistlock.off();
2790 LOG_DEBUG("Servent scan finished.");
2794 // --------------------------------------------------
2796 static ChanHit *findServentHit(Servent *s)
2798 ChanHitList *chl = chanMgr->findHitListByID(s->chanID);
2799 Host h = s->getHost();
2803 ChanHit *hit = chl->hit;
2806 if ((hit->numHops == 1) && hit->host.isValid() && (h.ip == hit->host.ip))
2814 // --------------------------------------------------
2815 int ServMgr::kickUnrelayableHost(GnuID &chid, ChanHit &sendhit)
2818 Servent *s = servMgr->servents;
2822 if (s->type == Servent::T_RELAY && s->chanID.isSame(chid) && !s->isPrivate())
2824 Host h = s->getHost();
2826 ChanHit hit = s->serventHit;
2827 if (!hit.relay && hit.numRelays == 0 || hit.firewalled)
2831 //s->thread.active = false;
2832 LOG_DEBUG("unrelayable Servent : %s",hostName);
2833 if (!ks || s->lastConnect < ks->lastConnect) // elder servent
2842 if (sendhit.rhost[0].port)
2845 MemoryStream mem(pack.data,sizeof(pack.data));
2846 AtomStream atom(mem);
2847 sendhit.writeAtoms(atom, chid);
2849 pack.type = ChanPacket::T_PCP;
2853 ks->sendPacket(pack, chid, noID, noID, Servent::T_RELAY);
2856 ks->setStatus(Servent::S_CLOSING);
2857 ks->thread.active = false;
2860 ks->getHost().toStr(hostName);
2862 LOG_DEBUG("Stop unrelayable Servent : %s",hostName);
2870 int WINAPI ServMgr::graylistThreadFunc(ThreadInfo *t)
2874 LOG_DEBUG("******************** check graylist: begin");
2876 servMgr->IP_graylist->lock();
2877 servMgr->IP_blacklist->lock();
2880 for (size_t i=0; i<servMgr->IP_graylist->count; ++i)
2882 addrCont addr = servMgr->IP_graylist->at(i);
2883 LOG_NETWORK("######## %d.%d.%d.%d # %d", (addr.addr >> 24), (addr.addr >> 16) & 0xFF, (addr.addr >> 8) & 0xFF, addr.addr & 0xFF, addr.count);
2884 if (addr.count >= servMgr->dosThreashold)
2886 servMgr->IP_blacklist->push_back(addr);
2887 LOG_DEBUG("BANNED: %d.%d.%d.%d", (addr.addr >> 24), (addr.addr >> 16) & 0xFF, (addr.addr >> 8) & 0xFF, addr.addr & 0xFF);
2891 servMgr->IP_graylist->clear();
2894 servMgr->IP_graylist->unlock();
2895 servMgr->IP_blacklist->unlock();
2897 LOG_DEBUG("******************** check graylist: end");
2899 sys->sleep(servMgr->dosInterval*1000);