Program  Novell_API_Examples;

{ Misc. Novell Advanced Netware 2.1+ API examples to retrieve info on the
  user who is running this program
}

USES   DOS, CRT;

CONST
  HexDigit: array [0..15] of char = '0123456789ABCDEF';
  Days_Of_Week   : Array[0..6] of string = ('Sunday','Monday','Tuesday',
                                            'Wednesday','Thursday','Friday',
                                            'Saturday');


TYPE
  string2 = STRING[2];
  string4 = STRING[4];


VAR
  Reg          : DOS.Registers;
  RCode        : Integer;
  Connect      : Byte;
  Address      : String;


function HexByte(B: byte): string2;
  begin
    HexByte := HexDigit[B shr 4] + HexDigit[B and $F];
  end;


function Hex(I: integer): string4;
  begin
    Hex := HexByte(hi(I)) + HexByte(lo(I));
  end;


Function Get_Connection_Number : Integer;
  { |
    | Returns the connection number for the current session
    |
  }
  begin
    Reg.AH := $DC;
    intr($21,Reg);
    Get_Connection_Number := Reg.AL;
  end;


Function Get_Station_Address(var Address: String): Integer;
  { |
    |  Returns the Physical Station Address (NIC Number)
    |
  }
  var
    S1, S2, S3 : String;
  begin
    Reg.AH := $EE;
    intr($21,Reg);
    Address := Hex(Reg.CX) + Hex(Reg.BX) + Hex(Reg.AX);
    Get_Station_Address := $00;
  end;


Function Get_Login_Name : String;
  { |
    |  Who's calling?
    |
  }
  var
    Reg           : DOS.REGISTERS;
    Loop,
    Connection    : Byte;
    TmpStr        : String;
    Request_Buf   : Record
                      BufLen     : Integer;
                      SubFunc    : Byte;
                      Connection : Byte;
                    end;
    Reply_Buf     : Record
                      BufLen     : Integer;
                      Obj_ID     : LongInt;
                      Obj_Type   : Integer;
                      Obj_Name   : Array[1..48] of char;
                      Login_Time : Record
                                     Year   : Byte;
                                     Month  : Byte;
                                     Day    : Byte;
                                     Hour   : Byte;
                                     Minute : Byte;
                                     Second : Byte;
                                     Day_No : Byte;
                                   end;
                  end;

  begin
    TmpStr := '';
    RCode := 0;
    Connect := Get_Connection_Number;
    fillchar(Request_Buf,sizeof(Request_Buf),0);
    fillchar(Reply_Buf,sizeof(Reply_Buf),0);

    Request_Buf.SubFunc := $16;
    Request_Buf.Connection := Connect;
    Request_Buf.BufLen := sizeof(Request_Buf);
    Reply_Buf.BufLen := sizeof(Reply_Buf);
    Reg.AH := $E3;
    Reg.DS := seg(Request_Buf);
    Reg.SI := ofs(Request_Buf);
    Reg.ES := seg(Reply_Buf);
    Reg.DI := ofs(Reply_Buf);
    intr($21,Reg);
    Loop := 1;
    while ((Reply_Buf.Obj_Name[Loop] <> #0) and (Loop <= 48)) do
      begin
        TmpStr := TmpStr + Reply_Buf.Obj_Name[Loop];
        inc(loop);
      end;
    Get_Login_Name := TmpStr;
  end;


Procedure Pause;
  var
    ch : char;
  begin
    writeln;
    write('Press Any Key To Continue ');
    ch := readkey;
    writeln;
  end;


BEGIN
  clrscr;
  writeln('Get Novell Station Info  - (C) Rick Ryan, 1989');
  writeln;
  Connect := Get_Connection_Number;
  Writeln('  Connection ID: ', Connect);

  RCode := Get_Station_Address(Address);
  writeln('Station Address: ',Address,'  With ErrCode of ', RCode);

  writeln('Login Name = ',Get_Login_Name);

  Pause;

END.