[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]