Bläddra i källkod

+ support check-function for netware

armin 23 år sedan
förälder
incheckning
b9f1677a0c
4 ändrade filer med 396 tillägg och 342 borttagningar
  1. 5 1
      compiler/targets/t_nwm.pas
  2. 3 2
      rtl/netware/Makefile
  3. 350 336
      rtl/netware/nwsys.inc
  4. 38 3
      rtl/netware/system.pp

+ 5 - 1
compiler/targets/t_nwm.pas

@@ -352,6 +352,7 @@ begin
   { start and stop-procedures }
   LinkRes.Add ('START _Prelude');  { defined in rtl/netware/nwpre.pp }
   LinkRes.Add ('EXIT _Stop');
+  LinkRes.Add ('CHECK FPC_NW_CHECKFUNCTION');
 
   if not (cs_link_strip in aktglobalswitches) then
     LinkRes.Add ('DEBUG');
@@ -551,7 +552,10 @@ initialization
 end.
 {
   $Log$
-  Revision 1.16  2002-03-29 17:19:51  armin
+  Revision 1.17  2002-03-30 09:09:47  armin
+  + support check-function for netware
+
+  Revision 1.16  2002/03/29 17:19:51  armin
   + allow exports for netware
 
   Revision 1.15  2002/03/19 20:23:57  armin

+ 3 - 2
rtl/netware/Makefile

@@ -4,7 +4,8 @@
 UNITDIR = $(INSTALL_PREFIX)/usr/lib/fpc/1.1/units/netware/rtl
 #PPC386OPT = -n -dMT -dDEBUG_MT -di386 -dSYSTEMDEBUG -O3 -Sg -Tnetware -Aelf -a -al -gg -FE.
 #PPC386OPT = -n -di386 -dSYSTEMDEBUG -O3 -Sg -Tnetware -Aelf -a -al -gg -FE.
-PPC386OPT = -n -di386 -O3 -Og -Sg -Tnetware -Aelf -a -al -FE.
+#PPC386OPT = -n -di386 -O3 -Og -Sg -Tnetware -Aelf -a -al -FE.
+PPC386OPT = -n -di386 -O3 -Og -Sg -Tnetware -Aelf -a -al -FE. -dMT
 PPC386OPTDBG = -n -di386 -O3 -Sg -Tnetware -Aelf -a -al -gg -FE.
 INCLUDES = -I../inc -I../i386 -I../objpas
 
@@ -76,9 +77,9 @@ install: $(OBJS)
 	cp -f os_types.$(PPUEXT) $(UNITDIR)
 	cp -f winsock2.$(OBJEXT) $(UNITDIR)
 	cp -f winsock2.$(PPUEXT) $(UNITDIR)
-	cp -f aio.$(OBJEXT) $(UNITDIR)
 	cp -f aio.$(PPUEXT) $(UNITDIR)
 	cp -f nwimp/*.imp $(UNITDIR)
+	cp -f *.a $(UNITDIR)
 
 clean:
 	rm -f *.$(OBJEXT) *.$(PPUEXT) *.$(ASMEXT) *.bak *.rst *.a

+ 350 - 336
rtl/netware/nwsys.inc

@@ -1,338 +1,352 @@
-{
-    $Id$
-    This file is part of the Free Pascal run time library.
-    Copyright (c) 1999-2000 by the Free Pascal development team
-    Copyright (c) 2001 Armin Diehl
-
-    Interface to netware clib
-
-    See the file COPYING.FPC, included in this distribution,
-    for details about the copyright.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
- **********************************************************************}
-
-{ 2000/08/27 armin: first version
-  2001/03/08 armin: additional functions
-  2001/04/14 armin: additional functions for crt-unit
-}
-
-CONST Clib       = 'clib.nlm';
-      NlmLib     = 'nlmlib.nlm';
-      Threads    = 'threads.nlm';
-      CalNlm     = 'calnlm32.nlm';
-      ClxNlm     = 'clxnlm32.nlm';
-      NitNlm     = 'nit.nlm';
-      ThreadsNlm = 'threads.nlm';
-
-TYPE
-  dev_t         = LONGINT;
-  ino_t         = LONGINT;
-  unsignedshort = WORD;
-  unsignedlong  = LONGINT;
-  unsignedint   = LONGINT;
-  off_t         = LONGINT;
-  size_t        = LONGINT;
-  time_t        = LONGINT;
-  NWStatBufT = PACKED RECORD
-   st_dev        : dev_t;         (* volume number *)
-   st_ino        : ino_t;         (* directory entry number of the st_name *)
-   st_mode       : unsignedshort; (* emulated file mode *)
-   st_nlink      : unsignedshort; (* count of hard links (always 1) *)
-   st_uid        : unsignedlong;  (* object id of owner *)
-   st_gid        : unsignedshort; (* group-id (always 0) *)
-   st_rdev       : dev_t;         (* device type (always 0) *)
-   st_size       : off_t;         (* total file size--files only *)
-   st_atime      : time_t;        (* last access date--files only *)
-   st_mtime      : time_t;        (* last modify date and time *)
-   st_ctime      : time_t;        (* POSIX: last status change time... *)
-                                  (* ...NetWare: creation date/time *)
-   st_btime      : time_t;        (* last archived date and time *)
-   st_attr       : unsignedlong;  (* file attributes *)
-   st_archivedID : unsignedlong;  (* user/object ID of last archive *)
-   st_updatedID  : unsignedlong;  (* user/object ID of last update *)
-   st_inheritedRightsMask
-                 : unsignedshort; (* inherited rights mask *)
-   st_originatingNameSpace
-                 : BYTE;          (* namespace of creation       *)
-   st_name       : ARRAY [0..255] OF CHAR;
-                                  (* TARGET_NAMESPACE name *)
-   st_blksize    : LONGINT;
-   st_blocks     : LONGINT;
-   st_flags      : LONGINT;
-   st_spare      : ARRAY [0..3] OF LONGINT;
-  END;
-
-FUNCTION  _stat  (path : PCHAR; VAR buf : NWStatBufT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'stat_411';
-FUNCTION  _fstat (Fileno : LONGINT; VAR buf : NWStatBufT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'fstat_411';
-
-PROCEDURE NWFree   (P : POINTER); CDECL; EXTERNAL Clib NAME 'free';
-
-PROCEDURE PressAnyKeyToContinue; CDecl; EXTERNAL; // Clib;
-
-
-PROCEDURE ExitThread (action_code, termination_code : LONGINT); CDecl; EXTERNAL CLib;
-FUNCTION _BeginThread (func, stack : pointer; Stacksize : LONGINT; arg : pointer) : LONGINT; Cdecl; EXTERNAL Threads NAME 'BeginThread';
-FUNCTION _GetThreadDataAreaPtr : POINTER; CDecl; EXTERNAL NlmLib NAME 'GetThreadDataAreaPtr';
-PROCEDURE _SaveThreadDataAreaPtr (P : POINTER); CDecl; EXTERNAL NlmLib NAME 'SaveThreadDataAreaPtr';
-PROCEDURE _exit (ExitCode : LONGINT); CDecl; EXTERNAL CLib;
-PROCEDURE ConsolePrintf (FormatStr : PCHAR; Param : LONGINT); CDecl; EXTERNAL CLib;
-PROCEDURE printf (FormatStr : PCHAR; Param : LONGINT); CDecl; EXTERNAL CLib;
-PROCEDURE ConsolePrintf3 (FormatStr : PCHAR; P1,P2,P3 : LONGINT); CDecl; EXTERNAL CLib NAME 'ConsolePrintf';
-
-// values for __action_code used with ExitThread()
-CONST
-  TSR_THREAD  = -1; //-Terminate only the current thread.
-  EXIT_THREAD = 0;  //-Terminate the current thread; if the current thread is
-                    // also the last thread, terminate the NLM.
-  EXIT_NLM    = 1;  //-Terminate the entire NLM.
-
-FUNCTION _GetStdIn  : POINTER; CDECL; EXTERNAL Clib NAME '__get_stdin';  // result: **FILE
-FUNCTION _GetStdOut : POINTER; CDECL; EXTERNAL Clib NAME '__get_stdout';
-FUNCTION _GetStdErr : POINTER; CDECL; EXTERNAL Clib NAME '__get_stderr';
-
-// FileIO by Fileno
-FUNCTION _open   (FileName : PCHAR; access, mode : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'open';
-FUNCTION _close  (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'close';
-FUNCTION _lseek  (FileNo,Pos,whence :LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'lseek';
-FUNCTION _chsize (FileNo,Pos : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'chsize';
-FUNCTION _tell   (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'tell';
-FUNCTION _write  (FileNo : LONGINT; BufP : POINTER; Len : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'write';
-FUNCTION _read   (FileNo : LONGINT; BufP : POINTER; Len : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'read';
-FUNCTION _filelength (filedes : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'filelength';
-
-TYPE 
-  NWModifyStructure =
-    RECORD
-       MModifyName            : PCHAR;
-       MFileAttributes        : LONGINT;
-       MFileAttributesMask    : LONGINT;
-       MCreateDate            : WORD;
-       MCreateTime            : WORD;
-       MOwnerID               : LONGINT;
-       MLastArchivedDate      : WORD;
-       MLastArchivedTime      : WORD;
-       MLastArchivedID        : LONGINT;
-       MLastUpdatedDate       : WORD;
-       MLastUpdatedTime       : WORD;
-       MLastUpdatedID         : LONGINT;
-       MLastAccessedDate      : WORD;
-       MInheritanceGrantMask  : WORD;
-       MInheritanceRevokeMask : WORD;
-       MMaximumSpace          : LONGINT;
-       MLastUpdatedInSeconds  : LONGINT
-     END;
-     
-CONST MModifyNameBit                 = $0001;
-      MFileAtrributesBit             = $0002;
-      MCreateDateBit                 = $0004;
-      MCreateTimeBit                 = $0008;
-      MOwnerIDBit                    = $0010;
-      MLastArchivedDateBit           = $0020; 
-      MLastArchivedTimeBit           = $0040;
-      MLastArchivedIDBit             = $0080;
-      MLastUpdatedDateBit            = $0100;
-      MLastUpdatedTimeBit            = $0200;
-      MLastUpdatedIDBit              = $0400;
-      MLastAccessedDateBit           = $0800;
-      MInheritanceRestrictionMaskBit = $1000; 
-      MMaximumSpaceBit               = $2000;
-      MLastUpdatedInSecondsBit       = $4000;
-
-// Directory
-FUNCTION _chdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'chdir';
-FUNCTION _getcwd (path : PCHAR; pathlen : LONGINT) : PCHAR; CDECL; EXTERNAL NlmLib NAME 'getcwd';
-FUNCTION _mkdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'mkdir';
-FUNCTION _rmdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'rmdir';
-FUNCTION _ChangeDirectoryEntry (PathName : PCHAR; VAR ModyStruct : NWModifyStructure; ModifyBits, AllowWildcard : LONGINT) : LONGINT; CDECL; EXTERNAL NitNlm NAME 'ChangeDirectoryEntry';
-
-// get fileno from stream
-FUNCTION _fileno (Handle : LONGINT) : LONGINT; CDECL; EXTERNAL Clib NAME 'fileno';
-FUNCTION _isatty (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'isatty';
-
-(* values for 'o_flag' in open()... *)
-CONST O_RDONLY     = $0000;   (* open for read only *)
-      O_WRONLY     = $0001;   (* open for write only *)
-      O_RDWR       = $0002;   (* open for read and write *)
-      O_ACCMODE    = $0003;   (* AND with value to extract access flags *)
-      O_APPEND     = $0010;   (* writes done at end of file *)
-      O_CREAT      = $0020;   (* create new file *)
-      O_TRUNC      = $0040;   (* truncate existing file *)
-      O_EXCL       = $0080;   (* exclusive open *)
-      O_TEXT       = $0100;   (* text file--unsupported *)
-      O_BINARY     = $0200;   (* binary file *)
-      O_NDELAY     = $0400;   (* nonblocking flag *)
-      O_NOCTTY     = $0800;   (* currently unsupported *)
-      O_NONBLOCK   = O_NDELAY;
-
-
-// File Utils
-FUNCTION _unlink (FileName : PCHAR) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'unlink';
-FUNCTION _rename (oldpath, newpath : PCHAR) : LONGINT; CDECL; EXTERNAL Clib NAME 'rename';
-
-// Error
-TYPE _PLONGINT = ^LONGINT;
-FUNCTION __get_errno_ptr : _PLONGINT; CDECL; EXTERNAL Clib;
-
-// Memory
-FUNCTION _malloc (size : LONGINT) : POINTER; CDECL; EXTERNAL Threads NAME 'malloc';
-FUNCTION _realloc (p : POINTER; size : LONGINT) : POINTER; CDECL; EXTERNAL Threads NAME 'realloc';
-PROCEDURE _free (what : POINTER); CDECL; EXTERNAL Threads NAME 'free';
-FUNCTION _stackavail : LONGINT; CDECL; EXTERNAL Threads NAME 'stackavail';
-
-// Debug
-PROCEDURE _EnterDebugger; CDECL; EXTERNAL Clib NAME 'EnterDebugger';
-
-// String
-FUNCTION _strlen (P : PCHAR) : LONGINT; CDECL; EXTERNAL Clib NAME 'strlen';
-
-// Time/Date
-TYPE NWTM = RECORD
-              tm_sec, tm_min, tm_hour,
-              tm_mday, tm_mon, tm_year,
-              tm_wday, tm_yday, tm_isdst : LONGINT;
-            END;
-     PNWTM = ^NWTM;
-FUNCTION _localtime (VAR time : time_t) : PNWTM; CDECL; EXTERNAL Clib NAME 'localtime';
-FUNCTION _time (tloc : POINTER) : LONGINT; CDECL; EXTERNAL Clib NAME 'time';
-PROCEDURE _ConvertTimeToDOS (time : time_t; VAR DosDate, DosTime : WORD); CDECL; EXTERNAL Clib NAME '_ConvertTimeToDOS';
-PROCEDURE _tzset; CDECL; EXTERNAL Clib NAME 'tzset';
-
-
-//-----------------------------------------------------------------------
-
-CONST NWDEFCONN_HANDLE = 0;
-
-TYPE NWCONN_HANDLE = LONGINT;
-     NWRCODE = LONGINT;
-     NWDateAndTime = PACKED RECORD
-                       Year,Month,Day,
-                       Hour,Minute,Second,DayOfWeek : BYTE;
-                     END;
-
-PROCEDURE GetFileServerDateAndTime (VAR TimeBuf : NWDateAndTime); CDECL; EXTERNAL NitNlm NAME 'GetFileServerDateAndTime';
-FUNCTION  SetFileServerDateAndTime(year:WORD; month:WORD; day:WORD; hour:WORD; minute:WORD;
-               second:WORD):longint;cdecl; EXTERNAL NitNlm Name 'SetFileServerDateAndTime';
-
-TYPE   FILE_SERV_INFO = record
-            serverName              : array[0..47] of char;
-            netwareVersion          : BYTE;
-            netwareSubVersion       : BYTE;
-            maxConnectionsSupported : WORD;
-            connectionsInUse        : WORD;
-            maxVolumesSupported     : WORD;
-            revisionLevel           : BYTE;
-            SFTLevel                : BYTE;
-            TTSLevel                : BYTE;
-            peakConnectionsUsed     : WORD;
-            accountingVersion       : BYTE;
-            VAPversion              : BYTE;
-            queingVersion           : BYTE;
-            printServerVersion      : BYTE;
-            virtualConsoleVersion   : BYTE;
-            securityRestrictionLevel: BYTE;
-            internetBridgeSupport   : BYTE;
-            reserved                : array[0..59] of BYTE;
-            CLibMajorVersion        : BYTE;
-            CLibMinorVersion        : BYTE;
-            CLibRevision            : BYTE;
-         end;
-   pFILE_SERV_INFO = ^FILE_SERV_INFO;
-
-FUNCTION GetServerInformation(returnSize:longint; serverInfo:pFILE_SERV_INFO):longint;cdecl; EXTERNAL NitNlm NAME 'GetServerInformation';
-
-// Directory
-TYPE NWDirEnt =
-  PACKED RECORD
-    d_attr                : LONGINT;
-    d_time                : WORD;           {modification time}
-    d_date                : WORD;           {modification date}
-    d_size                : LONGINT;        {filesize}
-    d_ino                 : LONGINT;        {serial number}
-    d_dev                 : LONGINT;        {volume number}
-    d_cdatetime           : time_t;         {creation date and time}
-    d_adatetime           : time_t;         {last access - files only}
-    d_bdatetime           : time_t;         {last archive date and time}
-    d_uid                 : LONGINT;        {owner id (object id) }
-    d_archivedID          : LONGINT;
-    d_updatedID           : LONGINT;
-    d_nameDOS             : ARRAY [0..12] OF CHAR;
-    d_inheritedRightsMask : WORD;
-    d_originatingNameSpace: BYTE;
-    d_ddatetime           : time_t;         {deleted date time}
-    d_deletedID           : LONGINT;
-    {---- new fields starting in v4.11 ----}
-    d_name                : ARRAY [0..255] OF CHAR;  { enty's namespace name }
-  END;
-  PNWDirEnt = ^NWDirEnt;
-
-  FUNCTION _opendir (pathname : PCHAR) : PNWDirEnt; CDECL; EXTERNAL NlmLib NAME 'opendir_411';
-  FUNCTION _closedir (dirH : PNWDirEnt) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'closedir';
-  FUNCTION _readdir  (dirH : PNWDirEnt) : PNWDirEnt; CDECL; EXTERNAL NlmLib NAME 'readdir';
-  FUNCTION _SetReaddirAttribute (dirH : PNWDirEnt; Attribute : LONGINT) : LONGINT; EXTERNAL NlmLib NAME 'SetReaddirAttribute';
-
-// Environment
-  FUNCTION _getenv (name : PCHAR) : PCHAR; CDECL; EXTERNAL NlmLib NAME 'getenv';
-
-// Volumes
-  FUNCTION _GetVolumeName (volumeNumber : LONGINT; volumeName : PCHAR) : LONGINT; CDECL; EXTERNAL NitNlm NAME 'GetVolumeName';
-  FUNCTION _GetVolumeNumber (volumeName : PCHAR; VAR volumeNumber : LONGINT) : LONGINT; CDECL; EXTERNAL NitNlm NAME 'GetVolumeNumber';
-  FUNCTION _GetVolumeInfoWithNumber (VolumeNumber : BYTE;
-                                     VolumeName   : PCHAR;
-                                 VAR TotalBlocks  : WORD;
-                                 VAR SectorsPerBlock : WORD;
-                                 VAR availableBlocks : WORD;
-                                 VAR totalDirectorySlots : WORD;
-                                 VAR availableDirSlots   : WORD;
-                                 VAR volumeisRemovable   : WORD) : LONGINT; CDECL; EXTERNAL NitNlm NAME 'GetVolumeInfoWithNumber';
-  FUNCTION _GetNumberOfVolumes : LONGINT; CDECL; EXTERNAL NitNlm NAME 'GetNumberOfVolumes';
-
-// Screen/Keyboad
-PROCEDURE _CopyToScreenMemory (Height, Width : WORD; Data : POINTER; x, y : WORD); CDECL; EXTERNAL ThreadsNlm NAME 'CopyToScreenMemory';
-PROCEDURE _CopyFromScreenMemory (Height, Width : WORD; Data : POINTER; x, y : WORD); CDECL; EXTERNAL ThreadsNlm NAME 'CopyFromScreenMemory';
-FUNCTION  _DisplayInputCursor : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'DisplayInputCursor';
-FUNCTION  _HideInputCursor : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'HideInputCursor';
-FUNCTION  _SetPositionOfInputCursor (row,col : WORD): LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'SetPositionOfInputCursor';
-PROCEDURE _GotoXY (col, row : WORD); CDECL; EXTERNAL ThreadsNlm NAME 'gotoxy';
-FUNCTION  _GetSizeOfScreen (VAR height,width : WORD): LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'GetSizeOfScreen';
-FUNCTION  _IsColorMonitor : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'IsColorMonitor';
-PROCEDURE _RingTheBell; CDECL; EXTERNAL ThreadsNlm NAME 'RingTheBell';
-FUNCTION  _SetCursorShape (startline,endline : BYTE) : WORD; CDECL; EXTERNAL ThreadsNlm NAME 'SetCursorShape';
-FUNCTION  _GetCursorShape (VAR startline,endline : BYTE) : WORD; CDECL; EXTERNAL ThreadsNlm NAME 'GetCursorShape';
-FUNCTION  _wherex : WORD; CDECL; EXTERNAL ThreadsNlm NAME 'wherex';
-FUNCTION  _wherey : WORD; CDECL; EXTERNAL ThreadsNlm NAME 'wherey';
-PROCEDURE _clrscr; CDECL; EXTERNAL ThreadsNlm NAME 'clrscr';
-FUNCTION  _kbhit : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'kbhit';
-FUNCTION  _getch : CHAR; CDECL; EXTERNAL ThreadsNlm NAME 'getch';
-PROCEDURE _delay (miliseconds : longint); CDECL; EXTERNAL ThreadsNlm NAME 'delay';
-FUNCTION  _SetCtrlCharCheckMode (Enabled : BOOLEAN) : BOOLEAN; CDECL; EXTERNAL ThreadsNlm NAME 'SetCtrlCharCheckMode';
-FUNCTION  _SetAutoScreenDestructionMode (Enabled : BOOLEAN) : BOOLEAN; CDECL; EXTERNAL ThreadsNlm NAME 'SetAutoScreenDestructionMode';
-
-// Misc
-FUNCTION _memcpy (Dest, Src : POINTER; Len : LONGINT) : POINTER; CDECL; EXTERNAL ThreadsNlm NAME 'memcpy';
-
-FUNCTION _OpenLocalSemaphore (InitialValue : LONGINT) : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'OpenLocalSemaphore';
-FUNCTION _WaitOnLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'WaitOnLocalSemaphore';
-FUNCTION _SignalLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'SignalLocalSemaphore';
-FUNCTION _CloseLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'CloseLocalSemaphore';
-FUNCTION _EnterCritSec : LONGINT; CDecl; EXTERNAL ThreadsNlm NAME 'EnterCritSec';
-FUNCTION _ExitCritSec : LONGINT; CDecl; EXTERNAL ThreadsNlm NAME 'ExitCritSec';
-
-
-
-{
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 1999-2000 by the Free Pascal development team
+    Copyright (c) 2001 Armin Diehl
+
+    Interface to netware clib
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+{ 2000/08/27 armin: first version
+  2001/03/08 armin: additional functions
+  2001/04/14 armin: additional functions for crt-unit
+}
+
+CONST Clib       = 'clib.nlm';
+      NlmLib     = 'nlmlib.nlm';
+      Threads    = 'threads.nlm';
+      CalNlm     = 'calnlm32.nlm';
+      ClxNlm     = 'clxnlm32.nlm';
+      NitNlm     = 'nit.nlm';
+      ThreadsNlm = 'threads.nlm';
+
+TYPE
+  dev_t         = LONGINT;
+  ino_t         = LONGINT;
+  unsignedshort = WORD;
+  unsignedlong  = LONGINT;
+  unsignedint   = LONGINT;
+  off_t         = LONGINT;
+  size_t        = LONGINT;
+  time_t        = LONGINT;
+  NWStatBufT = PACKED RECORD
+   st_dev        : dev_t;         (* volume number *)
+   st_ino        : ino_t;         (* directory entry number of the st_name *)
+   st_mode       : unsignedshort; (* emulated file mode *)
+   st_nlink      : unsignedshort; (* count of hard links (always 1) *)
+   st_uid        : unsignedlong;  (* object id of owner *)
+   st_gid        : unsignedshort; (* group-id (always 0) *)
+   st_rdev       : dev_t;         (* device type (always 0) *)
+   st_size       : off_t;         (* total file size--files only *)
+   st_atime      : time_t;        (* last access date--files only *)
+   st_mtime      : time_t;        (* last modify date and time *)
+   st_ctime      : time_t;        (* POSIX: last status change time... *)
+                                  (* ...NetWare: creation date/time *)
+   st_btime      : time_t;        (* last archived date and time *)
+   st_attr       : unsignedlong;  (* file attributes *)
+   st_archivedID : unsignedlong;  (* user/object ID of last archive *)
+   st_updatedID  : unsignedlong;  (* user/object ID of last update *)
+   st_inheritedRightsMask
+                 : unsignedshort; (* inherited rights mask *)
+   st_originatingNameSpace
+                 : BYTE;          (* namespace of creation       *)
+   st_name       : ARRAY [0..255] OF CHAR;
+                                  (* TARGET_NAMESPACE name *)
+   st_blksize    : LONGINT;
+   st_blocks     : LONGINT;
+   st_flags      : LONGINT;
+   st_spare      : ARRAY [0..3] OF LONGINT;
+  END;
+
+FUNCTION  _stat  (path : PCHAR; VAR buf : NWStatBufT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'stat_411';
+FUNCTION  _fstat (Fileno : LONGINT; VAR buf : NWStatBufT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'fstat_411';
+
+PROCEDURE NWFree   (P : POINTER); CDECL; EXTERNAL Clib NAME 'free';
+
+PROCEDURE PressAnyKeyToContinue; CDecl; EXTERNAL; // Clib;
+
+
+PROCEDURE ExitThread (action_code, termination_code : LONGINT); CDecl; EXTERNAL CLib;
+FUNCTION _BeginThread (func, stack : pointer; Stacksize : LONGINT; arg : pointer) : LONGINT; Cdecl; EXTERNAL Threads NAME 'BeginThread';
+FUNCTION _GetThreadDataAreaPtr : POINTER; CDecl; EXTERNAL NlmLib NAME 'GetThreadDataAreaPtr';
+PROCEDURE _SaveThreadDataAreaPtr (P : POINTER); CDecl; EXTERNAL NlmLib NAME 'SaveThreadDataAreaPtr';
+PROCEDURE _exit (ExitCode : LONGINT); CDecl; EXTERNAL CLib;
+
+PROCEDURE ConsolePrintf (FormatStr : PCHAR; Param : LONGINT); CDecl; EXTERNAL CLib Name 'ConsolePrintf';
+PROCEDURE ConsolePrintf3 (FormatStr : PCHAR; P1,P2,P3 : LONGINT); CDecl; EXTERNAL CLib Name 'ConsolePrintf';
+PROCEDURE ConsolePrintf (FormatStr : PCHAR); CDecl; EXTERNAL CLib Name 'ConsolePrintf';
+// this gives internet compiler error 1234124 ??
+//PROCEDURE ConsolePrintf (FormatStr : PCHAR; Param : array of const); CDecl; EXTERNAL CLib;
+
+PROCEDURE _printf (FormatStr : PCHAR; Param : LONGINT); CDecl; EXTERNAL CLib;
+PROCEDURE _printf (FormatStr : PCHAR); CDecl; EXTERNAL CLib;
+// this gives internet compiler error 1234124 ??
+// PROCEDURE _printf (FormatStr : PCHAR; Param : array of const); CDecl; EXTERNAL CLib;
+
+// values for __action_code used with ExitThread()
+CONST
+  TSR_THREAD  = -1; //-Terminate only the current thread.
+  EXIT_THREAD = 0;  //-Terminate the current thread; if the current thread is
+                    // also the last thread, terminate the NLM.
+  EXIT_NLM    = 1;  //-Terminate the entire NLM.
+
+FUNCTION _GetStdIn  : POINTER; CDECL; EXTERNAL Clib NAME '__get_stdin';  // result: **FILE
+FUNCTION _GetStdOut : POINTER; CDECL; EXTERNAL Clib NAME '__get_stdout';
+FUNCTION _GetStdErr : POINTER; CDECL; EXTERNAL Clib NAME '__get_stderr';
+
+// FileIO by Fileno
+FUNCTION _open   (FileName : PCHAR; access, mode : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'open';
+FUNCTION _close  (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'close';
+FUNCTION _lseek  (FileNo,Pos,whence :LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'lseek';
+FUNCTION _chsize (FileNo,Pos : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'chsize';
+FUNCTION _tell   (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'tell';
+FUNCTION _write  (FileNo : LONGINT; BufP : POINTER; Len : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'write';
+FUNCTION _read   (FileNo : LONGINT; BufP : POINTER; Len : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'read';
+FUNCTION _filelength (filedes : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'filelength';
+
+TYPE 
+  NWModifyStructure =
+    RECORD
+       MModifyName            : PCHAR;
+       MFileAttributes        : LONGINT;
+       MFileAttributesMask    : LONGINT;
+       MCreateDate            : WORD;
+       MCreateTime            : WORD;
+       MOwnerID               : LONGINT;
+       MLastArchivedDate      : WORD;
+       MLastArchivedTime      : WORD;
+       MLastArchivedID        : LONGINT;
+       MLastUpdatedDate       : WORD;
+       MLastUpdatedTime       : WORD;
+       MLastUpdatedID         : LONGINT;
+       MLastAccessedDate      : WORD;
+       MInheritanceGrantMask  : WORD;
+       MInheritanceRevokeMask : WORD;
+       MMaximumSpace          : LONGINT;
+       MLastUpdatedInSeconds  : LONGINT
+     END;
+     
+CONST MModifyNameBit                 = $0001;
+      MFileAtrributesBit             = $0002;
+      MCreateDateBit                 = $0004;
+      MCreateTimeBit                 = $0008;
+      MOwnerIDBit                    = $0010;
+      MLastArchivedDateBit           = $0020; 
+      MLastArchivedTimeBit           = $0040;
+      MLastArchivedIDBit             = $0080;
+      MLastUpdatedDateBit            = $0100;
+      MLastUpdatedTimeBit            = $0200;
+      MLastUpdatedIDBit              = $0400;
+      MLastAccessedDateBit           = $0800;
+      MInheritanceRestrictionMaskBit = $1000; 
+      MMaximumSpaceBit               = $2000;
+      MLastUpdatedInSecondsBit       = $4000;
+
+// Directory
+FUNCTION _chdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'chdir';
+FUNCTION _getcwd (path : PCHAR; pathlen : LONGINT) : PCHAR; CDECL; EXTERNAL NlmLib NAME 'getcwd';
+FUNCTION _mkdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'mkdir';
+FUNCTION _rmdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'rmdir';
+FUNCTION _ChangeDirectoryEntry (PathName : PCHAR; VAR ModyStruct : NWModifyStructure; ModifyBits, AllowWildcard : LONGINT) : LONGINT; CDECL; EXTERNAL NitNlm NAME 'ChangeDirectoryEntry';
+
+// get fileno from stream
+FUNCTION _fileno (Handle : LONGINT) : LONGINT; CDECL; EXTERNAL Clib NAME 'fileno';
+FUNCTION _isatty (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'isatty';
+
+(* values for 'o_flag' in open()... *)
+CONST O_RDONLY     = $0000;   (* open for read only *)
+      O_WRONLY     = $0001;   (* open for write only *)
+      O_RDWR       = $0002;   (* open for read and write *)
+      O_ACCMODE    = $0003;   (* AND with value to extract access flags *)
+      O_APPEND     = $0010;   (* writes done at end of file *)
+      O_CREAT      = $0020;   (* create new file *)
+      O_TRUNC      = $0040;   (* truncate existing file *)
+      O_EXCL       = $0080;   (* exclusive open *)
+      O_TEXT       = $0100;   (* text file--unsupported *)
+      O_BINARY     = $0200;   (* binary file *)
+      O_NDELAY     = $0400;   (* nonblocking flag *)
+      O_NOCTTY     = $0800;   (* currently unsupported *)
+      O_NONBLOCK   = O_NDELAY;
+
+
+// File Utils
+FUNCTION _unlink (FileName : PCHAR) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'unlink';
+FUNCTION _rename (oldpath, newpath : PCHAR) : LONGINT; CDECL; EXTERNAL Clib NAME 'rename';
+
+// Error
+TYPE _PLONGINT = ^LONGINT;
+FUNCTION __get_errno_ptr : _PLONGINT; CDECL; EXTERNAL Clib;
+
+// Memory
+FUNCTION _malloc (size : LONGINT) : POINTER; CDECL; EXTERNAL Threads NAME 'malloc';
+FUNCTION _realloc (p : POINTER; size : LONGINT) : POINTER; CDECL; EXTERNAL Threads NAME 'realloc';
+PROCEDURE _free (what : POINTER); CDECL; EXTERNAL Threads NAME 'free';
+FUNCTION _stackavail : LONGINT; CDECL; EXTERNAL Threads NAME 'stackavail';
+
+// Debug
+PROCEDURE _EnterDebugger; CDECL; EXTERNAL Clib NAME 'EnterDebugger';
+
+// String
+FUNCTION _strlen (P : PCHAR) : LONGINT; CDECL; EXTERNAL Clib NAME 'strlen';
+
+// Time/Date
+TYPE NWTM = RECORD
+              tm_sec, tm_min, tm_hour,
+              tm_mday, tm_mon, tm_year,
+              tm_wday, tm_yday, tm_isdst : LONGINT;
+            END;
+     PNWTM = ^NWTM;
+FUNCTION _localtime (VAR time : time_t) : PNWTM; CDECL; EXTERNAL Clib NAME 'localtime';
+FUNCTION _time (tloc : POINTER) : LONGINT; CDECL; EXTERNAL Clib NAME 'time';
+PROCEDURE _ConvertTimeToDOS (time : time_t; VAR DosDate, DosTime : WORD); CDECL; EXTERNAL Clib NAME '_ConvertTimeToDOS';
+PROCEDURE _tzset; CDECL; EXTERNAL Clib NAME 'tzset';
+
+
+//-----------------------------------------------------------------------
+
+CONST NWDEFCONN_HANDLE = 0;
+
+TYPE NWCONN_HANDLE = LONGINT;
+     NWRCODE = LONGINT;
+     NWDateAndTime = PACKED RECORD
+                       Year,Month,Day,
+                       Hour,Minute,Second,DayOfWeek : BYTE;
+                     END;
+
+PROCEDURE GetFileServerDateAndTime (VAR TimeBuf : NWDateAndTime); CDECL; EXTERNAL NitNlm NAME 'GetFileServerDateAndTime';
+FUNCTION  SetFileServerDateAndTime(year:WORD; month:WORD; day:WORD; hour:WORD; minute:WORD;
+               second:WORD):longint;cdecl; EXTERNAL NitNlm Name 'SetFileServerDateAndTime';
+
+TYPE   FILE_SERV_INFO = record
+            serverName              : array[0..47] of char;
+            netwareVersion          : BYTE;
+            netwareSubVersion       : BYTE;
+            maxConnectionsSupported : WORD;
+            connectionsInUse        : WORD;
+            maxVolumesSupported     : WORD;
+            revisionLevel           : BYTE;
+            SFTLevel                : BYTE;
+            TTSLevel                : BYTE;
+            peakConnectionsUsed     : WORD;
+            accountingVersion       : BYTE;
+            VAPversion              : BYTE;
+            queingVersion           : BYTE;
+            printServerVersion      : BYTE;
+            virtualConsoleVersion   : BYTE;
+            securityRestrictionLevel: BYTE;
+            internetBridgeSupport   : BYTE;
+            reserved                : array[0..59] of BYTE;
+            CLibMajorVersion        : BYTE;
+            CLibMinorVersion        : BYTE;
+            CLibRevision            : BYTE;
+         end;
+   pFILE_SERV_INFO = ^FILE_SERV_INFO;
+
+FUNCTION GetServerInformation(returnSize:longint; serverInfo:pFILE_SERV_INFO):longint;cdecl; EXTERNAL NitNlm NAME 'GetServerInformation';
+
+// Directory
+TYPE NWDirEnt =
+  PACKED RECORD
+    d_attr                : LONGINT;
+    d_time                : WORD;           {modification time}
+    d_date                : WORD;           {modification date}
+    d_size                : LONGINT;        {filesize}
+    d_ino                 : LONGINT;        {serial number}
+    d_dev                 : LONGINT;        {volume number}
+    d_cdatetime           : time_t;         {creation date and time}
+    d_adatetime           : time_t;         {last access - files only}
+    d_bdatetime           : time_t;         {last archive date and time}
+    d_uid                 : LONGINT;        {owner id (object id) }
+    d_archivedID          : LONGINT;
+    d_updatedID           : LONGINT;
+    d_nameDOS             : ARRAY [0..12] OF CHAR;
+    d_inheritedRightsMask : WORD;
+    d_originatingNameSpace: BYTE;
+    d_ddatetime           : time_t;         {deleted date time}
+    d_deletedID           : LONGINT;
+    {---- new fields starting in v4.11 ----}
+    d_name                : ARRAY [0..255] OF CHAR;  { enty's namespace name }
+  END;
+  PNWDirEnt = ^NWDirEnt;
+
+  FUNCTION _opendir (pathname : PCHAR) : PNWDirEnt; CDECL; EXTERNAL NlmLib NAME 'opendir_411';
+  FUNCTION _closedir (dirH : PNWDirEnt) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'closedir';
+  FUNCTION _readdir  (dirH : PNWDirEnt) : PNWDirEnt; CDECL; EXTERNAL NlmLib NAME 'readdir';
+  FUNCTION _SetReaddirAttribute (dirH : PNWDirEnt; Attribute : LONGINT) : LONGINT; EXTERNAL NlmLib NAME 'SetReaddirAttribute';
+
+// Environment
+  FUNCTION _getenv (name : PCHAR) : PCHAR; CDECL; EXTERNAL NlmLib NAME 'getenv';
+
+// Volumes
+  FUNCTION _GetVolumeName (volumeNumber : LONGINT; volumeName : PCHAR) : LONGINT; CDECL; EXTERNAL NitNlm NAME 'GetVolumeName';
+  FUNCTION _GetVolumeNumber (volumeName : PCHAR; VAR volumeNumber : LONGINT) : LONGINT; CDECL; EXTERNAL NitNlm NAME 'GetVolumeNumber';
+  FUNCTION _GetVolumeInfoWithNumber (VolumeNumber : BYTE;
+                                     VolumeName   : PCHAR;
+                                 VAR TotalBlocks  : WORD;
+                                 VAR SectorsPerBlock : WORD;
+                                 VAR availableBlocks : WORD;
+                                 VAR totalDirectorySlots : WORD;
+                                 VAR availableDirSlots   : WORD;
+                                 VAR volumeisRemovable   : WORD) : LONGINT; CDECL; EXTERNAL NitNlm NAME 'GetVolumeInfoWithNumber';
+  FUNCTION _GetNumberOfVolumes : LONGINT; CDECL; EXTERNAL NitNlm NAME 'GetNumberOfVolumes';
+
+// Screen/Keyboad
+PROCEDURE _CopyToScreenMemory (Height, Width : WORD; Data : POINTER; x, y : WORD); CDECL; EXTERNAL ThreadsNlm NAME 'CopyToScreenMemory';
+PROCEDURE _CopyFromScreenMemory (Height, Width : WORD; Data : POINTER; x, y : WORD); CDECL; EXTERNAL ThreadsNlm NAME 'CopyFromScreenMemory';
+FUNCTION  _DisplayInputCursor : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'DisplayInputCursor';
+FUNCTION  _HideInputCursor : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'HideInputCursor';
+FUNCTION  _SetPositionOfInputCursor (row,col : WORD): LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'SetPositionOfInputCursor';
+PROCEDURE _GotoXY (col, row : WORD); CDECL; EXTERNAL ThreadsNlm NAME 'gotoxy';
+FUNCTION  _GetSizeOfScreen (VAR height,width : WORD): LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'GetSizeOfScreen';
+FUNCTION  _IsColorMonitor : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'IsColorMonitor';
+PROCEDURE _RingTheBell; CDECL; EXTERNAL ThreadsNlm NAME 'RingTheBell';
+FUNCTION  _SetCursorShape (startline,endline : BYTE) : WORD; CDECL; EXTERNAL ThreadsNlm NAME 'SetCursorShape';
+FUNCTION  _GetCursorShape (VAR startline,endline : BYTE) : WORD; CDECL; EXTERNAL ThreadsNlm NAME 'GetCursorShape';
+FUNCTION  _wherex : WORD; CDECL; EXTERNAL ThreadsNlm NAME 'wherex';
+FUNCTION  _wherey : WORD; CDECL; EXTERNAL ThreadsNlm NAME 'wherey';
+PROCEDURE _clrscr; CDECL; EXTERNAL ThreadsNlm NAME 'clrscr';
+FUNCTION  _kbhit : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'kbhit';
+FUNCTION  _getch : CHAR; CDECL; EXTERNAL ThreadsNlm NAME 'getch';
+PROCEDURE _delay (miliseconds : longint); CDECL; EXTERNAL ThreadsNlm NAME 'delay';
+FUNCTION  _SetCtrlCharCheckMode (Enabled : BOOLEAN) : BOOLEAN; CDECL; EXTERNAL ThreadsNlm NAME 'SetCtrlCharCheckMode';
+FUNCTION  _SetAutoScreenDestructionMode (Enabled : BOOLEAN) : BOOLEAN; CDECL; EXTERNAL ThreadsNlm NAME 'SetAutoScreenDestructionMode';
+
+// Misc
+FUNCTION _memcpy (Dest, Src : POINTER; Len : LONGINT) : POINTER; CDECL; EXTERNAL ThreadsNlm NAME 'memcpy';
+
+FUNCTION _OpenLocalSemaphore (InitialValue : LONGINT) : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'OpenLocalSemaphore';
+FUNCTION _WaitOnLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'WaitOnLocalSemaphore';
+FUNCTION _SignalLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'SignalLocalSemaphore';
+FUNCTION _CloseLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL ThreadsNlm NAME 'CloseLocalSemaphore';
+FUNCTION _EnterCritSec : LONGINT; CDecl; EXTERNAL ThreadsNlm NAME 'EnterCritSec';
+FUNCTION _ExitCritSec : LONGINT; CDecl; EXTERNAL ThreadsNlm NAME 'ExitCritSec';
+
+
+FUNCTION _SetThreadGroupID (id : longint) : longint; CDecl; EXTERNAL ThreadsNlm NAME 'SetThreadGroupID';
+FUNCTION _GetThreadGroupID : longint; CDecl; EXTERNAL ThreadsNlm NAME 'GetThreadGroupID';
+
+
+{
   $Log$
-  Revision 1.4  2002-03-08 19:06:47  armin
+  Revision 1.5  2002-03-30 09:09:47  armin
+  + support check-function for netware
+
+  Revision 1.4  2002/03/08 19:06:47  armin
   	* Additional routines needed for MT
-
-  Revision 1.3  2001/04/16 18:39:50  florian
-    * updates from Armin commited
-
-  Revision 1.2  2001/04/11 14:17:00  florian
-    * added logs, fixed email address of Armin, it is
-      [email protected]
-
-}
+
+  Revision 1.3  2001/04/16 18:39:50  florian
+    * updates from Armin commited
+
+  Revision 1.2  2001/04/11 14:17:00  florian
+    * added logs, fixed email address of Armin, it is
+      [email protected]
+
+}

+ 38 - 3
rtl/netware/system.pp

@@ -72,14 +72,24 @@ CONST
 
    sLineBreak : STRING = LineEnding;
    DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsCRLF;
+   
+TYPE
+   TNWCheckFunction = procedure (var code : longint);
 
 VAR
    ArgC   : INTEGER;
    ArgV   : ppchar;
+   NetwareCheckFunction    : TNWCheckFunction;
+   NetwareMainThreadGroupID: longint;
 
 CONST   
    envp   : ppchar = nil;   {dummy to make heaptrc happy}
-
+   
+   
+PROCEDURE ConsolePrintf (FormatStr : PCHAR; Param : LONGINT); CDecl;
+PROCEDURE ConsolePrintf3 (FormatStr : PCHAR; P1,P2,P3 : LONGINT);  CDecl;
+PROCEDURE ConsolePrintf (FormatStr : PCHAR);  CDecl;
+   
 
 implementation
 
@@ -127,13 +137,32 @@ END;
 {$ifdef MT}
 PROCEDURE CloseAllRemainingSemaphores; FORWARD;
 {$endif}
+
+{ if return-value is <> 0, netware shows the message
+  Unload Anyway ?
+  To Disable unload at all, SetNLMDontUnloadFlag can be used on
+  Netware >= 4.0 }
+function CheckFunction : longint; CDECL; [public,alias: 'FPC_NW_CHECKFUNCTION'];
+var oldTG:longint;
+begin
+  if @NetwareCheckFunction <> nil then
+  begin
+    { this function is called without clib context, to allow clib
+      calls, we set the thread group id before calling the
+      user-function }
+    oldTG := _SetThreadGroupID (NetwareMainThreadGroupID);
+    result := 0;
+    NetwareCheckFunction (result);
+    _SetThreadGroupID (oldTG);
+  end else
+    result := 0;
+end;
 
 {*****************************************************************************
                          System Dependent Exit code
 *****************************************************************************}
 Procedure system_exit;
 begin
-  {ConsolePrintf ('system_exit called'#13#10,0);}
   {$ifdef MT}
   CloseAllRemainingSemaphores;
   {$endif}
@@ -589,6 +618,9 @@ Begin
   { the exceptions use threadvars so do this _before_ initexceptions }
   AllocateThreadVars;
 {$endif MT}
+
+  NetwareCheckFunction := nil;
+  NetwareMainThreadGroupID := _GetThreadGroupID;
 
 { Setup heap }
   InitHeap;
@@ -614,7 +646,10 @@ Begin
 End.
 {
   $Log$
-  Revision 1.7  2002-03-17 17:57:33  armin
+  Revision 1.8  2002-03-30 09:09:47  armin
+  + support check-function for netware
+
+  Revision 1.7  2002/03/17 17:57:33  armin
   + threads and winsock2 implemented
 
   Revision 1.5  2001/06/18 14:26:16  jonas