{ 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 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 := ''; 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) = '') 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) = '') 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.