bool SectorManager::CallSlotEvents(long index) { bool called_event = false; TimeNodeVec::iterator itrTNode; //traverse this node list and call all the nodes for (itrTNode = m_EventSlotHead[index].begin(); itrTNode < m_EventSlotHead[index].end(); ++itrTNode) { MakeTimedCall(*itrTNode); called_event = true; } m_EventSlotHead[index].clear(); return called_event; }
bool SectorManager::CallLongTermEvents(long index) { bool called_event = false; TimeNodeVec::iterator itrTNode; //now check for long term time nodes, check every 5 seconds, and only pull one off at a time if ( (index % 50 == 0) && (m_LongTermTimeNodes.size() > 0) ) { for (itrTNode = m_LongTermTimeNodes.begin(); itrTNode < m_LongTermTimeNodes.end(); ++itrTNode) { if ( (*itrTNode)->event_time > GetNet7TickCount() ) { MakeTimedCall(*itrTNode); m_LongTermTimeNodes.erase(itrTNode); called_event = true; break; } } } return called_event; }
static void ClientBody(void *arg) { RPC2_Handle thisconn; RPC2_Integer thisopcode; RPC2_PacketBuffer *request, *reply; long retcode, rpctime = 0; struct timeval t1, t2; char myprivatefile[256]; char myhashmark; RPC2_BindParms bp; SE_Descriptor sed; #define MakeTimedCall(whichse)\ if (VerboseFlag) gettimeofday(&t1, 0);\ retcode = RPC2_MakeRPC(ConnVector[thisconn].ConnHandle, request, whichse, &reply, NULL, 0);\ if (VerboseFlag) gettimeofday(&t2, 0);\ if (VerboseFlag) rpctime = ((t2.tv_sec - t1.tv_sec)*1000) + ((t2.tv_usec - t1.tv_usec)/1000); memset(&sed, 0, sizeof(SE_Descriptor)); sed.Tag = SMARTFTP; strcpy(myprivatefile, MakeName(LWP_Name())); myhashmark = NextHashMark++; LWP_DispatchProcess(); /* initial courtesy to parent */ RPC2_AllocBuffer(1000, &request); reply = NULL; ClientsReady++; LWP_WaitProcess((char *)&ClientsReady); /* wait for main() to tap me on shoulder */ while(1) { if (reply) RPC2_FreeBuffer(&reply); RanDelay(MaxThinkTime); SelectParms(&thisconn, &thisopcode); ConnVector[thisconn].Status = BUSY; request->Header.Opcode = thisopcode; if (VerboseFlag) fprintf(stderr, "Making request %d to %s for %s\n", thisopcode, ConnVector[thisconn].RemoteHost.Value.Name, ConnVector[thisconn].NameBuf); switch(thisopcode) { case 1: /* return Unix epoch time */ { request->Header.BodyLength = 0; MakeTimedCall(NULL); if (retcode == RPC2_SUCCESS) { if (VerboseFlag) fprintf(stderr, "Time on %s is %s (%ld msecs)\n", ConnVector[thisconn].RemoteHost.Value.Name, reply->Body, rpctime); break; } else HandleRPCFailure(thisconn, retcode, ntohl(request->Header.Opcode)); } case 2: /* square the input integer */ { uint32_t *op = (uint32_t *)request->Body; uint32_t x = (uint32_t)random() % 100; op[0] = htonl(x); request->Header.BodyLength = sizeof(uint32_t); MakeTimedCall(NULL); if (retcode == RPC2_SUCCESS) { if (VerboseFlag) { uint32_t *ip = (uint32_t *)reply->Body; fprintf(stderr, " %s says square of %u is %u (%ld msecs)\n", ConnVector[thisconn].RemoteHost.Value.Name, x, ntohl(ip[0]), rpctime); } break; } else HandleRPCFailure(thisconn, retcode, ntohl(request->Header.Opcode)); break; } case 3: /* cube the input integer */ { uint32_t *op = (uint32_t *)request->Body; uint32_t x = (uint32_t)random() % 100; op[0] = htonl(x); request->Header.BodyLength = sizeof(uint32_t); MakeTimedCall(NULL); if (retcode == RPC2_SUCCESS) { if (VerboseFlag) { uint32_t *ip = (uint32_t *)reply->Body; fprintf(stderr, "%s says cube of %d is %u (%ld msecs)\n", ConnVector[thisconn].RemoteHost.Value.Name, x, ntohl(ip[0]), rpctime); } break; } else HandleRPCFailure(thisconn, retcode, ntohl(request->Header.Opcode)); break; } case 4: /* Return your machine name */ { request->Header.BodyLength = 0; MakeTimedCall(NULL); if (retcode == RPC2_SUCCESS) { if (VerboseFlag) fprintf(stderr, "%s says its name is \"%s\" (%ld msecs)\n", ConnVector[thisconn].RemoteHost.Value.Name, reply->Body, rpctime); break; } else HandleRPCFailure(thisconn, retcode, ntohl(request->Header.Opcode)); break; } case 5: /* Fetch a random file */ { if (AvoidBulk) { ConnVector[thisconn].Status = SFREE; continue; } request->Header.BodyLength = 0; sed.Value.SmartFTPD.TransmissionDirection = SERVERTOCLIENT; sed.Value.SmartFTPD.FileInfo.ByName.ProtectionBits = 0644; sed.Value.SmartFTPD.SeekOffset = 0; sed.Value.SmartFTPD.Tag = FILEBYNAME; strcpy(sed.Value.SmartFTPD.FileInfo.ByName.LocalFileName, myprivatefile); if (VerboseFlag) sed.Value.SmartFTPD.hashmark = myhashmark; else sed.Value.SmartFTPD.hashmark = 0; MakeTimedCall(&sed); if (retcode != RPC2_SUCCESS) { HandleRPCFailure(thisconn, retcode, ntohl(request->Header.Opcode)); break; } else if (VerboseFlag) fprintf(stderr, "%ld bytes transferred\n", sed.Value.SmartFTPD.BytesTransferred); break; } case 6: /* Store a random file */ { uint32_t randval; if (AvoidBulk) { ConnVector[thisconn].Status = SFREE; continue; } request->Header.BodyLength = 0; sed.Value.SmartFTPD.TransmissionDirection = CLIENTTOSERVER; sed.Value.SmartFTPD.SeekOffset = 0; sed.Value.SmartFTPD.Tag = FILEBYNAME; randval = (uint32_t)random(); strcpy(sed.Value.SmartFTPD.FileInfo.ByName.LocalFileName, SysFiles[randval % SysFileCount]); if (VerboseFlag) sed.Value.SmartFTPD.hashmark = myhashmark; else sed.Value.SmartFTPD.hashmark = 0; MakeTimedCall(&sed); if (retcode != RPC2_SUCCESS) { HandleRPCFailure(thisconn, retcode, ntohl(request->Header.Opcode)); break; } else if (VerboseFlag) fprintf(stderr, "%ld bytes transferred\n", sed.Value.SmartFTPD.BytesTransferred); break; } case 7: /* Unbind */ { request->Header.BodyLength = 0; MakeTimedCall(NULL); if (retcode == RPC2_SUCCESS) { if (VerboseFlag) fprintf(stderr, "Unbound connection to %s for %s after %ld calls\n", ConnVector[thisconn].RemoteHost.Value.Name, ConnVector[thisconn].Identity.SeqBody, ConnVector[thisconn].CallsMade); assert(RPC2_Unbind(ConnVector[thisconn].ConnHandle) == RPC2_SUCCESS); } else {HandleRPCFailure(thisconn, retcode, ntohl(request->Header.Opcode));} ConnVector[thisconn].Status = UNBOUND; break; } case 8: /* Rebind */ { bp.SecurityLevel = ConnVector[thisconn].SecurityLevel; bp.EncryptionType = RPC2_XOR; bp.SideEffectType = SMARTFTP; bp.ClientIdent = &ConnVector[thisconn].Identity; bp.SharedSecret = &ConnVector[thisconn].Password; retcode = RPC2_NewBinding(&ConnVector[thisconn].RemoteHost, &PortId, &SubsysId, &bp, &ConnVector[thisconn].ConnHandle); if (retcode < RPC2_ELIMIT) { HandleRPCFailure(thisconn, retcode, ntohl(request->Header.Opcode)); } else { if (VerboseFlag) fprintf(stderr, "Rebound connection to %s for %s\n", ConnVector[thisconn].RemoteHost.Value.Name, ConnVector[thisconn].Identity.SeqBody); } break; } case 999: /* Quit */ { } default: /* unknown opcode */ printf("Arrrgggghhh .... bogus opcode\n"); abort(); break; } if (ConnVector[thisconn].Status == BUSY) ConnVector[thisconn].Status = SFREE; if (retcode == RPC2_CONNBUSY) continue; /* you didn't really do it */ /* Indicate progress */ ConnVector[thisconn].CallsMade++; if(ConnVector[thisconn].CallsMade % Announce == 1) { struct CVEntry *ce = &ConnVector[thisconn]; printf("\n%ld successful calls to %s for %s at %s", ce->CallsMade, ce->RemoteHost.Value.Name, ce->NameBuf, TimeNow()); PrintStats(); } else { int xx; xx = (1.0*Announce)/100.0 + 0.5; /* ceiling */ if (xx == 0 || ConnVector[thisconn].CallsMade % xx == 1) printf("%c", myhashmark); } } }