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; write('Attempting IEMSI negotiation ... '); fillchar(buffer, sizeof(buffer), 0); T1 := timer; T2 := timer; Tries := 0; Done := FALSE; Success := FALSE; EMSI_IRQ := '**EMSI_IRQ8E08'^M^L; com_flush_rx; SerialOut(EMSI_IRQ); s := ''; 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) .