// PupTestEFTP.bcpl - Pup package test program
// Copyright Xerox Corporation 1979, 1982
// Last modified February 15, 1982 5:28 PM by Boggs
get "PupEFTP.decl"
get "PupTest.decl"
external
[
//outgoing procedures
EFTPReceive; EFTPSend
//incoming procedures
GetString; GetPartner
Zero; MoveBlock; BlockEq; Block
Puts; Endofs; Free; Allocate
SetAllocation; ComputeThruput
OpenPort; PutTemplate; Ws; Wss
OpenEFTPSoc; CloseEFTPSoc; SendEFTPEnd
SendEFTPBlock; ReceiveEFTPBlock
//incoming statics
State; Cmmd; checksums; checkdata
keys; dsp; sysZone; pbiCount
checkBuffer; sendPort; tp
]
manifest realTimeClock = 430b
//----------------------------------------------------------------------------
let EFTPReceive() be //a context
//----------------------------------------------------------------------------
[
let inBuffer = Allocate(sysZone, 256)
let soc = vec lenEFTPSoc
[
OpenEFTPSoc(soc, table [ 0; 0; socketEFTPReceive ], 0)
let total = pbiCount/2
SetAllocation(soc, total, total-1, total-1)
soc>>PupSoc.doChecksum = checksums
while ReceiveEFTPBlock(soc, inBuffer, 512, -1) eq 512 do
if checkdata then unless BlockEq(checkBuffer, inBuffer, 256) do
[ Ws("*NRcvr Data Compare Error."); break ]
CloseEFTPSoc(soc)
] repeat
]
//----------------------------------------------------------------------------
and EFTPSend() be
//----------------------------------------------------------------------------
[
Ws("EFTP Send. ")
let soc = vec lenEFTPSoc
test Cmmd eq 0
ifso
[
let name = vec 40
unless GetString("Receive Port: ", name, true, false) return
if GetPartner(name, dsp, sendPort, 0, socketEFTPReceive) break
] repeat
ifnot
[
sendPort>>Port.socket↑1 = 0
sendPort>>Port.socket↑2 = socketEFTPReceive
]
OpenEFTPSoc(soc, 0, sendPort)
let total = pbiCount/2
SetAllocation(soc, total, total-1, total-1)
Ws("- Checksums "); Ws(checksums ? "enabled.*N", "disabled.*N")
soc>>PupSoc.doChecksum = checksums
test SendEFTPBlock(soc, checkBuffer, 512, 12000) eq 512
ifso Ws("Connection open. '!' = 10,000 bytes*N")
ifnot [ Ws("Failed."); CloseEFTPSoc(soc); return ]
State = stateEFTP
Zero(tp, lenTP)
tp>>TP.timer = @realTimeClock
[
if SendEFTPBlock(soc, checkBuffer, 512, 12000) ne 512 then
[ Ws("*NSendEFTPBlock Failed"); break ]
tp>>TP.count = tp>>TP.count + 512
if tp>>TP.count ge 10000 then
[
tp>>TP.count = tp>>TP.count - 10000
Puts(dsp,$!)
tp>>TP.bigCount = tp>>TP.bigCount+1
if tp>>TP.bigCount eq 50 then //500,000 bytes
[
ComputeThruput(tp)
tp>>TP.bigCount = 0
tp>>TP.timer = @realTimeClock
]
]
] repeatwhile Endofs(keys) & Cmmd eq 0
test SendEFTPEnd(soc, 3000)
ifso Ws("*NClosed cleanly")
ifnot Ws("*NClosed uncleanly")
CloseEFTPSoc(soc)
]