static int TryBinding(const RPC2_Integer AuthenticationType, const char *viceName, const int viceNamelen, const char *vicePasswd, const int vicePasswdlen, const struct RPC2_addrinfo *AuthHost, RPC2_Handle *RPCid) { RPC2_BindParms bp; RPC2_HostIdent hident; RPC2_SubsysIdent sident; RPC2_CountedBS cident; RPC2_EncryptionKey hkey; long rc; int len; hident.Tag = RPC2_HOSTBYADDRINFO; hident.Value.AddrInfo = RPC2_copyaddrinfo(AuthHost); sident.Tag = RPC2_SUBSYSBYID; sident.Value.SubsysId = htonl(AUTH_SUBSYSID); cident.SeqLen = viceNamelen; cident.SeqBody = (RPC2_ByteSeq)viceName; len = vicePasswdlen; if ( len > RPC2_KEYSIZE) len = RPC2_KEYSIZE; memset(hkey, 0, RPC2_KEYSIZE); memcpy(hkey, vicePasswd, len); bp.SecurityLevel = RPC2_SECURE; bp.EncryptionType = RPC2_XOR; bp.SideEffectType = 0; bp.AuthenticationType = AuthenticationType; bp.ClientIdent = &cident; bp.SharedSecret = &hkey; rc = RPC2_NewBinding(&hident, NULL, &sident, &bp, RPCid); RPC2_freeaddrinfo(hident.Value.AddrInfo); return (rc); }
static long Bind(char *host, short port, long subsys, RPC2_Handle *cid) { RPC2_HostIdent hostid; RPC2_PortIdent portid; RPC2_SubsysIdent subsysid; RPC2_BindParms bindparms; /* Initialize connection stuff */ hostid.Tag = RPC2_HOSTBYNAME; strcpy(hostid.Value.Name, host); portid.Tag = RPC2_PORTBYINETNUMBER; portid.Value.InetPortNumber = htons(port); subsysid.Tag = RPC2_SUBSYSBYID; subsysid.Value.SubsysId = subsys; bindparms.SideEffectType = 0; bindparms.SecurityLevel = RPC2_OPENKIMONO; bindparms.ClientIdent = NULL; return RPC2_NewBinding(&hostid, &portid, &subsysid, &bindparms, cid); }
static void DoBindings(void) { int i, rc; RPC2_BindParms bp; for (i = 0; i < CVCount; i++) { bp.SecurityLevel = ConnVector[i].SecurityLevel; bp.EncryptionType = RPC2_XOR; bp.SideEffectType = SMARTFTP; bp.ClientIdent = &ConnVector[i].Identity; bp.SharedSecret = &ConnVector[i].Password; rc = RPC2_NewBinding(&ConnVector[i].RemoteHost, &PortId, &SubsysId, &bp,&ConnVector[i].ConnHandle); if (rc < RPC2_ELIMIT) { printf("Couldn't bind to %s for %s ---> %s\n", ConnVector[i].RemoteHost.Value.Name, ConnVector[i].Identity.SeqBody, RPC2_ErrorMsg(rc)); ConnVector[i].Status = BROKEN; continue; } } }
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); } } }