Metropoli BBS
VIEWER: nw40test.pas MODE: TEXT (ASCII)
uses Crt, NW40;

  {
   This program shows how to use the system calls and the NW40 unit to
   send requests to a NW v4.0 server

   Set your default drive to a NetWare v4.x file server before running
   this program
  }


VAR cCode : Word;
    i     : Word;
    key   : Char;

Function ASCIIz(VAR Arr): String;
         {Convert zero delimited ASCII to PASCAL String}
VAR A: Array[1..$FF] of Byte absolute Arr;
    S: String;
    i: Byte;
BEGIN
  S[0] := #$FF;
  Move(A[1], S[1], $FF);
  FOR i := $FF DownTo 1 DO
      IF (A[i]=0) THEN S[0] := Char(i);
  ASCIIz := S;
END;



PROCEDURE PressToContinue;
VAR c : Char;
BEGIN
  Write('Press any key to continue ... ');
  c := ReadKey;  IF c=#0 THEN c := ReadKey;
  Write(#13);
  ClrEol
END;

Procedure ShowMem(VAR MemoryStart; Len: WORD);
          {Dump contents of any memory location defined by MemoryStart}
VAR Memo : Array[0..$7FFF] of CHAR absolute MemoryStart;
    i    : Word;
    j    : Byte;
BEGIN
   i := 0;
   Repeat
       For j := 0 to 15 DO BEGIN
           Write(hex2(Byte(Memo[i+j])), ' ');
           IF j=7 THEN Write(' ');
           END;
       Write(' | ');
       For j := 0 to 15 DO BEGIN
           IF Memo[i+j]<' ' THEN Write('.')
                            else Write(Memo[i+j]);
           IF j=7 THEN Write(' ');
           END;
       WriteLn;
       Inc(i, 16)
       Until i>Len;
END;


Procedure ShowVolInfo;
VAR v      : Byte;
    VolInfo: NW40_ExtVolInfo;
BEGIN
   For v := 0 to 64 do BEGIN
       cCode := NW40_GetExtendedVolumeInformation(v, VolInfo);
       IF (cCode=0) THEN
          WITH VolInfo Do BEGIN

               ShowMem(VolInfo, 200); PressToContinue;

               WriteLn('Volume Name:             ', volumeName);
               WriteLn('Volume Type:             ', volumeType);
               WriteLn('Sector Size:             ', sectorSize);
               WriteLn('Sectors per Cluster:     ', sectorsPerCluster);
               WriteLn('Compressed Sectors:      ', compressedSectors);
               WriteLn('Migrated Files:          ', migratedFiles);
               WriteLn('Dir Entries:             ', totalDirectoryEntries);
               WriteLn('Avail Dir Entries:       ', unUsedDirectoryEntries);
               PressToContinue;
               END
          ELSE IF (cCode<>$98) THEN WriteLn('Get Vol Info returned status ', hex2(cCode), ' for volume ', v)
       END
END;

Procedure Ping_NDS;
VAR PingNDSResult: NW40_PingNDSResult;
BEGIN
   cCode := NW40_PingForNDSNCP(PingNDSResult);
   IF cCode>0
      THEN WriteLn('Ping NDS returned status ', hex2(cCode))
      else WITH PingNDSResult Do BEGIN
           WriteLn('Ping Version:         ', PingVersion);
           WriteLn(ASCIIz(TreeName));
           Write
           END;
END;


Procedure GetBinderyContext;
VAR BinderyContext: NW40_BinderyContext;
    ContextName: String;
BEGIN
   cCode := NW40_ReturnBinderyContext(BinderyContext);
    IF cCode>0
      THEN WriteLn('Get Bindery Context returned status ', hex2(cCode))
      else WITH BinderyContext Do BEGIN
           ContextName := '';
           For i := 1 to NameLength DO ContextName := ContextName + Name[i, 1];
           WriteLn(ContextName);  {we assume std ASCII here}
           END;
END;


Procedure CPUInfo;
VAR CPUInformation: NW40_CPUInfo;
    CPU           : Byte;
    j             : Byte;
BEGIN
   CPU := 0;
   Repeat
       cCode := NW40_CPUInformation(CPU, CPUInformation);
       IF cCode>0
          THEN WriteLn('Get CPU Info (CPU ', CPU, ') returned status ', hex2(cCode))
          else WITH CPUInformation Do BEGIN
               WriteLn('Number of CPUs:       ', NumberOfCPUs);
               j := 1;  i := 0;
               While (j<=3) and (i<=200) DO BEGIN
                  IF CPUInfo.Info[i] <> #0
                     THEN Write(CPUInfo.Info[i])
                     ELSE BEGIN
                          WriteLn;
                          inc(j)
                          END;
                  inc(i);
                  END;
               END;
       inc(CPU)
       Until (CPU>=CPUInformation.NumberOfCPUs) or (cCode>0)
END;


Procedure GetLoadedNLMs;
VAR NLMsLoaded:     NW40_NLMsLoaded;
    NLM_Index:      Byte;
    NLMInformation: NW40_NLMInformation;
    j:              WORD;
    NLMText:        Array[1..3] of String;
BEGIN
   cCode := NW40_GetNLMsLoaded(0, NLMsLoaded);
   IF cCode>0
      THEN WriteLn('Get NLMs Loaded returned status ', hex2(cCode))
      else For NLM_Index := 1 to NLMsLoaded.NLMsReturned DO
               BEGIN
               cCode := NW40_GetNLMInformation(NLMsLoaded.NLMNumbers[NLM_Index], NLMInformation);
               IF cCode>0
                  THEN WriteLn('Get NLM Info returned status ', hex2(cCode))
                  else With NLMInformation DO BEGIN
                       j := 0;
                       MOVE(NLMStrings[j], NLMText[1,0], SizeOf(NLMText[1]));
                       Write(NLMText[1], ' ');
                       Write('(Type ', NLMInfo.NLMtype, ': ');
                       Case NLMInfo.NLMType of
                         0: Write('Std NLM');
                         1: Write('LAN Driver');
                         2: Write('Disk Driver');
                         3: Write('Name Space');
                         4: Write('Support Program');
                         5: Write('Mirrored Server Link');
                         6: Write('OS NLM');
                         7: Write('Paged High NLM');
                         8: Write('Host Adapter Module');
                         9: Write('Custom Device');
                        10: Write('File System Engine');
                        11: Write('Real Mode NLM');
                        12: Write('Hidden NLM');
                        END;
                       Write(')  v', NLMInfo.majorVersion, '.', NLMInfo.minorVersion);
                       IF NLMInfo.revision>0 THEN Write(Char($60+NLMInfo.revision));
                       WriteLn(' (', NLMInfo.month, '-', NLMInfo.day, '-', NLMInfo.year, ')');
                       j := j + 1 + Length(NLMText[1]);
                       MOVE(NLMStrings[j], NLMText[2,0], SizeOf(NLMText[2]));
                       IF Pos(#0, NLMText[2])>0 THEN NLMText[2,0] := Char(Pos(#0, NLMText[2])-1);
                       WriteLn('  ', NLMText[2]);
                       j := j + 1 + Length(NLMText[2]);
                       MOVE(NLMStrings[j], NLMText[3,0], SizeOf(NLMText[3]));
                       IF Pos(#0, NLMText[3])>0 THEN NLMText[3,0] := Char(Pos(#0, NLMText[3])-1);
                       {This corrects bugs in the strings}
                       WriteLn('  ', NLMText[3]);
                       END;
               IF (NLM_Index Mod 6)=0 THEN PressToContinue
               END;
END;

PROCEDURE OSInfo;
VAR OSVersionInformation: NW40_OSVersionInformation;
BEGIN
   cCode := NW40_GetOSVersionInformation(OSVersionInformation);
   IF cCode>0
      THEN WriteLn('Get OS Version Info returned status ', hex2(cCode))
      else With OSVersionInformation DO BEGIN
           WriteLn(' OSMajorVersion              ', OSMajorVersion);
           WriteLn(' OSMinorVersion              ', OSMinorVersion);
           WriteLn(' OSRevisionNum               ', OSRevisionNum);
           WriteLn(' accountingVersion           ', accountingVersion);
           WriteLn(' VAPVersion                  ', VAPVersion);
           WriteLn(' queueingVersion             ', queueingVersion);
           WriteLn(' securityRestrictionsLevel   ', securityRestrictionsLevel);
           WriteLn(' bridgingSupport             ', bridgingSupport);
           WriteLn(' maxNumOfVolumes             ', maxNumOfVolumes);
           WriteLn(' numOfConnSlots              ', numOfConnSlots);
           WriteLn(' maxLoggedInConns            ', maxLoggedInConns);
           WriteLn(' maxNumOfNameSpaces          ', maxNumOfNameSpaces);
           WriteLn(' maxNumOfLans                ', maxNumOfLans);
           WriteLn(' maxNumOfMediaTypes          ', maxNumOfMediaTypes);
           WriteLn(' maxNumOfProtocols           ', maxNumOfProtocols);
           WriteLn(' maxMaxSubdirTreeDepth       ', maxMaxSubdirTreeDepth);
           WriteLn(' maxNumOfDataStreams         ', maxNumOfDataStreams);
           WriteLn(' maxNumOfSpoolPrinters       ', maxNumOfSpoolPrinters);
           WriteLn(' serialNum                   ', serialNum);
           WriteLn(' applicationNum              ', applicationNum);
           END;
END;


Procedure LANInfo;
VAR BoardList:   NW40_BoardList;
    Board_Index: Byte;
    LANConfiguration: NW40_LANConfiguration;
BEGIN
   cCode := NW40_ActiveLANBoardList(0, BoardList);
   IF cCode>0
      THEN WriteLn('Get Board List returned status ', hex2(cCode))
      else With BoardList DO BEGIN
           WriteLn('LAN boards supported:    ', MaxNumOfLANs);
           WriteLn('LAN boards returned:     ', ItemsCount);
           For Board_Index := 1 to ItemsCount DO BEGIN
               cCode := NW40_GetLANConfiguration(BoardNumber[Board_Index], LANConfiguration);
               IF cCode>0
                  THEN WriteLn('Get Board Configuration returned status ', hex2(cCode))
                  else With LANConfiguration DO BEGIN

                       WriteLn(' DriverCFG_MajorVersion     ', DriverCFG_MajorVersion);
                       WriteLn(' DriverCFG_MinorVersion     ', DriverCFG_MinorVersion);
                       Write(  ' DriverNodeAddress          ');
                       For i := 1 to 6 DO Write(hex2(DriverNodeAddress[i])); WriteLn;
                       WriteLn(' DriverModeFlags  	         ', DriverModeFlags  	);
                       WriteLn(' DriverBoardNum  	         ', DriverBoardNum);
                       WriteLn(' DriverBoardInstance        ', DriverBoardInstance);
                       WriteLn(' DriverMaxSize              ', DriverMaxSize);
                       WriteLn(' DriverMaxRecvSize          ', DriverMaxRecvSize);
                       WriteLn(' DriverRecvSize             ', DriverRecvSize);
                       WriteLn(' DriverCardID               ', DriverCardID);
                       WriteLn(' DriverMediaID              ', DriverMediaID);
                       WriteLn(' DriverTransportTime        ', DriverTransportTime);
                       WriteLn(' DriverSrcRouting           ', DriverSrcRouting);
                       WriteLn(' DriverLineSpeed            ', DriverLineSpeed);
                       WriteLn(' DriverReserved             ', DriverReserved);
                       WriteLn(' DriverMajorVersion         ', DriverMajorVersion);
                       WriteLn(' DriverMinorVersion         ', DriverMinorVersion);
                       WriteLn(' DriverFlags                ', DriverFlags);
                       WriteLn(' DriverSendRetries          ', DriverSendRetries);
                       WriteLn(' DriverLink                 ', DriverLink);
                       WriteLn(' DriverSharingFlags         ', DriverSharingFlags);
                       WriteLn(' DriverSlot                 ', DriverSlot);
                       WriteLn(' DriverIOPortsAndLengths[1] ', DriverIOPortsAndLengths[1]);
                       WriteLn(' DriverIOPortsAndLengths[2] ', DriverIOPortsAndLengths[2]);
                       WriteLn(' DriverIOPortsAndLengths[3] ', DriverIOPortsAndLengths[3]);
                       WriteLn(' DriverIOPortsAndLengths[4] ', DriverIOPortsAndLengths[4]);
                       WriteLn(' DriverMemDecode0           ', DriverMemDecode0);
                       WriteLn(' DriverLength0              ', DriverLength0);
                       WriteLn(' DriverMemDecode1           ', DriverMemDecode1);
                       WriteLn(' DriverLength1              ', DriverLength1);
                       WriteLn(' DriverInterrupt[1]         ', DriverInterrupt[1]);
                       WriteLn(' DriverInterrupt[2]         ', DriverInterrupt[2]);
                       WriteLn(' DriverDMAUsage[1]          ', DriverDMAUsage[1]);
                       WriteLn(' DriverDMAUsage[2]          ', DriverDMAUsage[2]);
                       WriteLn(' DriverLogicalName          ', ASCIIz(DriverLogicalName));
                       WriteLn(' DriverCardName             ', ASCIIz(DriverCardName));
                       WriteLn(' DriverMediaType            ', ASCIIz(DriverMediaType));
                       END
               END;
           END;
END;


PROCEDURE GetFileServerInfo;
VAR FileServerInfo : NW40_FileServerInfo;
BEGIN
   cCode := NW40_GetServerInformation(FileServerInfo);
   IF cCode>0
      THEN WriteLn('Get File Server Info returned status ', hex2(cCode))
      else WITH FileServerInfo DO BEGIN
           WriteLn('NCP Total Requests     ', NCPTotalRequests:8);
           WriteLn('Server Utilization     ', ServerUtilization:8);
           WriteLn('Total Packets Serviced ', TotalPacketsServiced:8);
           END;
END;

PROCEDURE GetCacheInfo;
VAR CacheInfo : NW40_CacheCounters;
BEGIN
   cCode := NW40_GetCacheInformation(CacheInfo);
   IF cCode>0
      THEN WriteLn('Get Cache Info returned status ', hex2(cCode))
      else WITH CacheInfo DO BEGIN
           WriteLn('Original Cache Buffers ', originalNumOfCacheBuffers:8);
           WriteLn('Current Cache Buffers  ', currentNumOfCacheBuffers:8);
           WriteLn('Number of Cache Checks ', numCacheChecks:8);
           WriteLn('Number of Cache Hits   ', numCacheHits:8);
           WriteLn('Dirty Cache Buffers    ', numDirtyBlocks:8);
           END
END;

Procedure DisplayServers;
VAR ServerInfo : NWFSE_NETWORK_SERVER_INFO;
BEGIN
   cCode := NW40_GetKnownServers(0, OT_File_ServerL, ServerInfo);
   IF (cCode>0)
      THEN WriteLn('Get Known Servers returned status ', hex2(cCode))
      else ShowMem(ServerInfo, 300);
END;


Procedure UserInfo;
CONST MaxConn = 20;
VAR UserInformation: NW40_UserInformation;
    ConnectionNumber: LongInt;
    kBRead, kBWritten: LongInt;
BEGIN
   ConnectionNumber := 1;
   While ConnectionNumber <= MaxConn DO BEGIN
       cCode := NW40_GetUserInformation(ConnectionNumber, UserInformation);
       Write('Connection', ConnectionNumber:4, ' - ');
       IF (cCode>0)
          THEN WriteLn('Get User Info returned status ', hex2(cCode))
          else With UserInformation DO BEGIN
               Move(totalBytesRead[2],    kBRead,    4);  kBRead    := kBRead div 4;
               Move(totalBytesWritten[2], kBWritten, 4);  kBWritten := kBWritten div 4;
               WriteLn('Connection Number       ', ConnNum);
               WriteLn('Name                    ', UserName);
               WriteLn('kB Read:         ', kBRead:8);
               WriteLn('kB Written:      ', kbWritten:8);
               WriteLn('total Requests:  ', totalRequests:8);
               PressToContinue;
               END;
       Inc(ConnectionNumber)
       END;
END;

Procedure ShowMenu;
BEGIN
   ClrScr;
   WriteLn('  Get Information about a NW v4.0 Server     (ESC to Exit)');
   WriteLn;
   WriteLn('        1: Volume Info');
   WriteLn('        2: NDS    Info');
   WriteLn('        3: CPU    Info');
   WriteLn('        4: NLM    Info');
   WriteLn('        5: OS     Info');
   WriteLn('        6: LAN    Info');
   WriteLn('        7: Server Info');
   WriteLn('        8: Display Servers');
   WriteLn('        9: User   Info');
   WriteLn;  Write('  Enter Choice: ');
END;


BEGIN
   Repeat
      ShowMenu;
      key := ReadKey;
      WriteLn; WriteLn;
      Case Key of
        '1': ShowVolInfo;
        '2': BEGIN
             Ping_NDS;
             ShowMem(ReceiveBuffer, 100);
             GetBinderyContext;
             ShowMem(ReceiveBuffer, 100);
             END;
        '3': CPUInfo;
        '4': GetLoadedNLMs;
        '5': OSInfo;
        '6': LANInfo;
        '7': BEGIN
             GetFileServerInfo;
             GetCacheInfo
             END;
        '8': DisplayServers;
        '9': UserInfo;
        END; {case}
      IF Key in ['1'..'9'] THEN PressToContinue
      until key = #27
END.
[ RETURN TO DIRECTORY ]