Subj : Re: Renegade and IEMSI
To : Ozz Nixon
From : Nick Andre
Date : Mon Feb 18 2019 12:40 am
On 17 Feb 19 11:10:48, Ozz Nixon said the following to All:
ON> A couple nights ago, I was testing my terminal program, went to the Telnet
ON> Guide, and worked my way through different BBS packages.
ON>
ON> However, when I got to the Renegade 3 listings, two of them send the wrong
ON> handshake string.
ON>
ON> It is supposed to be (based upon FTSC) **EMSI_REQ#### and I reply back
ON> **EMSI_INQ####. Instead these two BBSes sent **EMSI_INQ#### ... is this a B
ON> or is the FTSC wrong?
Good question. This is the code from Renegade Y2KA2 for EMSI.
procedure IEMSI;
var
Tries:byte;
T1,T2:longint;
EMSI_IRQ:string[20];
Done, Success:boolean;
s,ISI:string;
c:char;
i:integer;
buffer:array[1..2048] of char;
buffptr:integer;
u:userrec;
NextItemPointer:integer;
function NextItem:string;
var s:astr;
begin
s := '';
while (NextItemPointer < 2048) and (buffer[NextItemPointer] <> #0) and
(buffer[NextItemPointer] <> '{') do
inc(NextItemPointer);
if (buffer[NextItemPointer] = '{') then
inc(NextItemPointer);
while (NextItemPointer < 2048) and (buffer[NextItemPointer] <> #0) and
(buffer[NextItemPointer] <> '}') do
begin
s := s + buffer[NextItemPointer];
inc(NextItemPointer);
end;
if (buffer[NextItemPointer] = '}') then
inc(NextItemPointer);
NextItem := s;
end;
begin
fillchar(IEMSIRec, sizeof(IEMSIRec), 0);
if (Speed = 0) or (not General.useIEMSI) then exit;
repeat
hangup := not com_carrier;
if (abs(T1 - Timer) > 2) then
begin
T1 := Timer;
inc(Tries);
if (Tries >= 2) then
Done := TRUE
else
begin
com_flush_rx;
SerialOut(EMSI_IRQ);
end;
end;
if (abs(T2 - Timer) >= 8) then
Done := TRUE;
c := cinkey;
if (c > #0) then
begin
if (length(s) >= 160) then
delete(s, 1, 120);
s := s + c;
if (pos('**EMSI_ICI', s) > 0) then
begin
delete(s, 1, pos('EMSI_ICI',s) - 1);
move(s[1], buffer[1], length(s));
buffptr := length(s);
T1 := Timer;
repeat
c := cinkey;
if not (c in [#0, #13]) then
begin
inc(buffptr);
buffer[buffptr] := c;
end;
until (hangup) or (abs(Timer - T1) > 4) or (c = ^M) or (buffptr =
2048);
s[0] := #8;
move(buffer[buffptr - 7], s[1], 8);
dec(buffptr, 8);
if (s = Hex(UpdateCRC32($FFFFFFFF, buffer[1], buffptr), 8)) then
begin
loadurec(u, 1);
ISI := '{Renegade,'+ver+'}{'+General.BBSName+'}{'+u.citystate+
'}{'+General.SysOpName+'}{'+Hex(getpackdatetime, 8)+
'}{Live free or die!}{}{Everything!}';
ISI := 'EMSI_ISI'+Hex(length(ISI), 4) + ISI;
ISI := ISI + Hex(UpdateCRC32($FFFFFFFF, ISI[1], length(ISI)),
8);
ISI := '**' + ISI + ^M;
com_flush_rx;
SerialOut(ISI);
Tries := 0; T1 := Timer; s := '';
repeat
if (abs(Timer - T1) >= 3) then
begin
T1 := Timer;
inc(Tries);
com_flush_rx;
SerialOut(ISI);
end;
c := cinkey;
if (c > #0) then
begin
if (length(s) >= 160) then
delete(s, 1, 120);
s := s + c;
if (pos('**EMSI_ACK', s) > 0) then
begin
com_flush_rx;
com_purge_tx;
Done := TRUE;
Success := TRUE;
end
else
if (pos('**EMSI_NAKEEC3', s) > 0) then
begin
com_flush_rx;
SerialOut(ISI);
inc(Tries);
end;
end;
until (Tries >= 3) or (Done);
end
else
begin
SerialOut('**EMSI_NAKEEC3');
T1 := Timer;
end;
end;
end;
until (Done) or (Hangup);
if (Success) then
begin
writeln('success.');
sl1('Successful IEMSI negotiation.');
end
else
writeln('failure.');
NextItemPointer := 1;
with IEMSIRec do
begin
UserName := NextItem;
Handle := NextItem;
CityState := NextItem;
ph := NextItem;
s := NextItem;
pw := allcaps(NextItem);
i := value('$'+NextItem);
if (i > 0) then
bdate := pd2date(i);
end;
com_flush_rx;
end;
Nick
--- Renegade vY2Ka2
* Origin: Joey, do you like movies about gladiators? (1:229/426)