[Back to NETWORK SWAG index]  [Back to Main SWAG index]  [Original]

{

   Unit provided with some functions to handle a BANYAN network.

   All informations are been found in the Ralf Brown's Interrupt List.


               ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
               º                                        º°
               º          AVONTURE CHRISTOPHE           º°
               º              AVC SOFTWARE              º°
               º     BOULEVARD EDMOND MACHTENS 157/53   º°
               º           B-1080 BRUXELLES             º°
               º              BELGIQUE                  º°
               º                                        º°
               ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ°
               °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

}

UNIT BANYAN;

INTERFACE

{ Get somes informations about the session }

PROCEDURE Get_Session_Parameter;

{ Logout procedure without any warnings }

PROCEDURE Logout_Vines;

{ Send a message to the user connected: it's you }

PROCEDURE Send_A_Msg_To_Me (Msg : String);

{ Change your name by other any string }

PROCEDURE Set_User_Name (UserName : String);

{ Get the interrupt number used by the BANYAN network }

FUNCTION  Get_Banyan_Int_NO             : Word;

{ Get the name of the user logged in }

FUNCTION  Get_User_Full_Name            : String;
FUNCTION  GetTrueUser (sInput : String) : String;

VAR
   bBANYAN_Installed : Boolean;


IMPLEMENTATION

USES
   Dos;

VAR
   Reg : registers;

TYPE

   { Buffer of 64 Bytes in order to store the full user name }

   TName              = Array[1..64] of Byte;

   { Buffer of 64 Bytes in order to store the service name }

   TService_Name      = Array[1..64] of Byte;

   { Buffer of 64 Bytes in order to store the connection name }

   TConnection_Name   = Array[1..64] of Byte;

   { User record : function number and full user name }

   TUser = RECORD
      Sub_Function : Word;
      Name         : TName;
   END;

   { This record will be user to ask BANYAN to fill in an user name.  For
     example, I can set a true name and BANYAN will return to me the
     STREETALK address of this person. }

   TGetTrueUser = RECORD
     Sub_Function : Word;
     pInput_Name  : Word;      { Pointer (offset) to a 64 bytes buffer }
     pOutput_Name : Word;      { Pointer (offset) to a 64 bytes buffer }
   END;

   { Only to store the LOGOUT function number }

   TLogout = RECORD
      Sub_Function : Word;
   END;

   { Information on the ASYNC connection }

   TConnect_Info = RECORD
      Length_Of_Service_Name    : Word;
      pService_Name             : Pointer;
      Connection_Type           : Byte;
      Length_Of_Connection_Name : Word;
      pConnection_Name          : Pointer;
      Service_Line_Number       : Byte;
   END;

   { Current session informations }

   TSession = RECORD
      Session_ID        : Byte;
      Sub_Function      : Byte;
      Ofs_Connect_Info  : Word;
   END;

VAR
   User       : TUser;
   Session    : TSession;
   Connect    : TConnect_Info;
   Logout     : TLogout;
   Service    : TService_Name;
   Connection : TConnection_Name;
   S          : ^String;

{ Returns the interrupt number used by the BANYAN network }

FUNCTION Get_Banyan_Int_NO : Word;  Assembler;

ASM

     Mov  Ax, 0D701h
     Xor  Bx, Bx

     Int  2Fh

    { Because the return value 0000h in AX tell me that BANYAN is installed,
      I must take the NOT value of this for the Boolean value. }

     Not  Al
     Mov  bBANYAN_Installed, Al

     Mov  Ax, Bx

END;

{ Get the STREETALK address of the actual logged in user }

FUNCTION Get_User_Full_Name : String;

BEGIN

    IF NOT bBANYAN_Installed THEN

       Get_User_Full_Name := ''

    ELSE
       BEGIN

          User.Sub_Function := $0005;

          WITH REG DO
             BEGIN
               AX := $0004;
               DX := Ofs (User);
               DS := Seg (User);
             END;

          INTR (Get_Banyan_Int_NO, Reg);

          S := Ptr (Seg(User.Name), Ofs(User.Name)-1);
          S^[0] := #64;

          Get_User_Full_Name := S^;

       END;

END;

{ This function will return the full STREETALK address of an user that I give
  only the familly name.  For example, if I get to this function the "GATES"
  name, the function will return "GATES Bill@PI.BOSS@MICROSOFT" (it's an
  example).

  The function will return <Unknown> if nobody has this name }

FUNCTION GetTrueUser (sInput : String) : String;

VAR
   User         : TGetTrueUser;
   sInput_Name  : TName;
   sOutput_Name : TName;
   pS           : ^String;
   sResul       : String;
   I            : Byte;

BEGIN

   IF NOT bBANYAN_Installed THEN Exit;

   User.Sub_Function := $012C;  { $0064 : Organization }
                                { $00C8 : Group        }
                                { $012C : Item         }

   { Pointers initialization }

   User.pInput_Name  := Ofs(sInput_Name);
   User.pOutput_Name := Ofs(sOutput_Name);

   pS := Ptr (Seg (sInput_Name), Ofs (sInput_Name)-1);
   pS^:= sInput;

   sInput_Name[Length(sInput)+1] := 0;

   WITH REG DO
      BEGIN
        AX := $0007;
        BX := $0007;
        DX := Ofs (User);
        DS := Seg (User);
      END;

   INTR (Get_Banyan_Int_NO, Reg);

   { AX equals ZERO if the user has been found }

   IF REG.AX = 0 THEN
      BEGIN

         pS := Ptr (Seg (sOutput_Name), Ofs (sOutput_Name)-1);

         sResul := '';
         I := 1;

         WHILE NOT (pS^[I] = #0) DO
           BEGIN

             sResul := sResul + pS^[I];
             Inc (I);

           END;

      END
   ELSE

      { The user is unknown }

      sResul := '<Unknown>';

   GetTrueUser := sResul;

END;

{ Allow to modify the user name of the user actually logged in on this
  station by any string. }

PROCEDURE Set_User_Name (UserName : String);

BEGIN

   IF NOT bBANYAN_Installed THEN Exit;

    { Test if this name exists }

    IF (GetTrueUser (UserName) = '<Unknown>') THEN
       Exit;

    S := Ptr (Seg(User.Name), Ofs(User.Name)-1);
    S^:= UserName;
    S^[64] := #0;

    User.Sub_Function := $0004;

    WITH REG DO
       BEGIN
         AX := $0004;
         DX := Ofs (User);
         DS := Seg (User);
       END;

    INTR (Get_Banyan_Int_NO, Reg);

END;

{ Get somes informations about the BANYAN session }

PROCEDURE Get_Session_Parameter;

BEGIN

    IF NOT bBANYAN_Installed THEN Exit;

    Session.Sub_Function     := $12;
    Session.Ofs_Connect_Info := Ofs(Connect);
    Connect.pService_Name    := @Service;
    Connect.pConnection_Name := @Connection;

    WITH REG DO
       BEGIN
         AX := $0003;
         BX := Ofs (Session);
         DS := Seg (Session);
       END;

    INTR (Get_Banyan_Int_NO, Reg);

END;

{ Send a message through the network to the actual user -you- }

PROCEDURE Send_A_Msg_To_Me (Msg : String);

BEGIN

   IF NOT bBANYAN_Installed THEN Exit;

   Msg := Msg + #0;

   WITH REG DO
      BEGIN
         AX := $0008;
         BX := $0002;
         CX := 2;
         DX := Ofs (Msg);
         DS := Seg (Msg);
      END;

   INTR (Get_Banyan_Int_NO, Reg);

END;

{ Logout procedure: terminates the actual BANYAN session }

PROCEDURE Logout_Vines;

BEGIN

   IF NOT bBANYAN_Installed THEN Exit;

   Logout.Sub_Function := $000c;

   WITH REG DO
      BEGIN
         AX := $0004;
         DX := Ofs (Logout);
         DS := Seg (Logout);
      END;

   INTR (Get_Banyan_Int_NO, Reg);

END;


BEGIN

    { Call first Get_Banyan_Int_NO for setting the bBANYAN_Installed }

    IF Get_Banyan_Int_NO = 0 THEN
       bBANYAN_Installed := False
    ELSE
       bBANYAN_Installed := True;

END.

{ -------------------------- cut here ------------------------------------ }
{ First Sample program }

{$A+,B-,D-,E-,F-,G+,I-,L-,N+,O-,P-,Q-,R-,S-,T-,V+,X+}
{$M 4000,0,8000}

USES
   Banyan;

VAR
   sParam  : String;
   sEmpty  : String;
   PSP_Seg : Word;
   pS      : ^String;
   I       : Byte;
   sResul  : String;

BEGIN

    IF (ParamCount = 0) THEN
       BEGIN
          Writeln ('');
          Writeln ('This little program has been written for, temporary, modify your user name');
          Writeln ('(under Banyan) to the name of an another user.');
          Writeln ('');
          Writeln ('');
          Writeln ('Example:  Chg_User VAN PIPERZEEL Dirk@TYOU.SYS');
          Writeln ('');
          Halt;
       END;

    { There is a problem with the paramstr() variable of Pascal: each time a
      space is found, Pascal think that there is another parameter. So, I
      will used interrupt in order to read the command line }

    Asm
       Mov  Ah, 62h               { Read PSP Segment }
       Int  21h
       Mov  PSP_Seg, Bx           { And Save it }
    End;

    pS := ptr (PSP_Seg, $80);    { Parameters are in PSP_SEG:80h }

    sParam := pS^;
    Delete (sParam, 1, 1);

    IF (GetTrueUser(sParam) = '<Unknown>') THEN
       BEGIN
           sResul := '';
           I := 1;

           WHILE NOT (sParam[I] = #0) DO
             BEGIN

               sResul := sResul + sParam[I];
               Inc (I);

             END;

          Writeln ('');
          Writeln ('Impossible to modify your user name because ',sResul,' isn''t valid.');
          Writeln ('');
          Writeln ('');
          Writeln ('');
          Exit;
       END;

    Writeln ('You are ',Get_User_Full_Name);

    Set_User_Name ('GATES Bill@pi.boss@MICROSOFT'+#0);

    Set_User_Name (GetTrueUser(sParam));
    Writeln ('Now, you are ',Get_User_Full_Name);

END.

{ -------------------------- cut here ------------------------------------ }
{ Second Sample program }

USES
   Crt, Dos, Banyan;

BEGIN

   ClrScr;

   Writeln ('');
   Writeln ('');

   IF bBANYAN_Installed THEN
      BEGIN

         Writeln ('BANYAN Interrupt number         : ',Byte2Hex(Get_Banyan_Int_NO),'h');
         Writeln ('My name (actual logged in user) : ',Get_User_Full_Name);

         Send_A_Msg_To_Me ('Hi, this is a test');

       END
    ELSE
       Writeln ('BANYAN network Not loaded');

END.

[Back to NETWORK SWAG index]  [Back to Main SWAG index]  [Original]