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)