// PupServEFTP.bcpl -- Pup Server EFTP routines
// Last modified March 19, 1980 12:20 AM by Boggs
get "Streams.d"
get "PupEFTP.decl"
get "PupServEftp.decl"
external
[
// outgoing procedures
PupServSend; PupServReceive
// incoming procedures
OpenEFTPSoc; CloseEFTPSoc
ReceiveEFTPBlock; SendEFTPBlock; SendEFTPEnd
GetPBI; ReleasePBI; Zero
OpenFile; DeleteFile; RenameFile; FilePos
Closes; Endofs; ReadBlock; WriteBlock; Puts
Dismiss; SetTimer; TimerHasExpired
dsp; Ws
]
//----------------------------------------------------------------------------
let PupServSend(eftp) = valof
//----------------------------------------------------------------------------
[
// Ws("*NSend "); Ws(eftp>>EFTP.realName); Puts(dsp, $*N)
let soc = vec lenEFTPSoc
OpenEFTPSoc(soc, eftp>>EFTP.lclPort, eftp>>EFTP.frnPort)
let tempPBI = GetPBI(soc)
let buffer = lv tempPBI>>PBI.pup
let bcnt, timeout = 0, nil
let stream = OpenFile(eftp>>EFTP.realName, ksTypeReadOnly, charItem,
0, eftp>>EFTP.fp)
if stream ne 0 then
[
until Endofs(stream) % bcnt ls 0 do
[
bcnt = ReadBlock(stream, buffer, 256) lshift 1
if (FilePos(stream) & 1) eq 1 then bcnt = bcnt -1
if bcnt eq 0 break
test soc>>EFTPSoc.SeqNum eq 0
ifso
[
timeout = eftp>>EFTP.timeOut1
soc>>EFTPSoc.currentTimeout = 5
]
ifnot timeout = eftp>>EFTP.timeOut2
bcnt = SendEFTPBlock(soc, buffer, bcnt, timeout)
]
if bcnt ge 0 then
bcnt = SendEFTPEnd(soc, eftp>>EFTP.timeOut2)? 0, EFTPTimeout
Closes(stream)
]
ReleasePBI(tempPBI)
CloseEFTPSoc(soc)
resultis stream ne 0 & bcnt eq 0
]
//----------------------------------------------------------------------------
and PupServReceive(eftp) = valof
//----------------------------------------------------------------------------
[
// Ws("*NReceive "); Ws(eftp>>EFTP.realName); Puts(dsp, $*N)
let soc = vec lenEFTPSoc
OpenEFTPSoc(soc, eftp>>EFTP.lclPort, eftp>>EFTP.frnPort)
let tempPBI = GetPBI(soc)
let buffer = lv tempPBI>>PBI.pup
let bcnt, stream = nil, nil
let timer = nil; SetTimer(lv timer, 6000) // 1 minute
[
(eftp>>EFTP.proc1)(soc)
bcnt = ReceiveEFTPBlock(soc, buffer, eftp>>EFTP.timeOut1)
] repeatuntil bcnt gr 0 % TimerHasExpired(lv timer)
if bcnt gr 0 then
[
stream = OpenFile(eftp>>EFTP.tempName, ksTypeWriteOnly, charItem)
if stream ne 0 then
[
[
WriteBlock(stream, buffer, bcnt rshift 1)
if (bcnt & 1) eq 1 then Puts(stream, buffer!(bcnt rshift 1) rshift 8)
bcnt = ReceiveEFTPBlock(soc, buffer, eftp>>EFTP.timeOut2)
] repeatuntil bcnt le 0
if bcnt eq 0 then (eftp>>EFTP.proc2)(stream)
Closes(stream)
if bcnt eq 0 then
[
Dismiss(1)
DeleteFile(eftp>>EFTP.realName)
Dismiss(1)
RenameFile(eftp>>EFTP.tempName, eftp>>EFTP.realName)
compileif alto then
[
Zero(eftp>>EFTP.fp, 5)
Closes(OpenFile(eftp>>EFTP.realName, ksTypeReadOnly,
0, 0, eftp>>EFTP.fp))
]
Dismiss(1)
]
]
]
ReleasePBI(tempPBI)
CloseEFTPSoc(soc)
resultis bcnt ge 0 & stream ne 0
]