1{
2    This file is part of the Free Pascal run time library.
3    Copyright (c) 1999-2004 by the Free Pascal development team
4    Copyright (c) 2001-2004 Armin Diehl
5
6    Interface to netware clib
7
8    See the file COPYING.FPC, included in this distribution,
9    for details about the copyright.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
15 **********************************************************************}
16
17
18CONST Clib       = 'clib';
19      ThreadsNlm = 'threads';
20
21TYPE
22  dev_t         = LONGINT;
23  ino_t         = LONGINT;
24  unsignedshort = WORD;
25  unsignedlong  = LONGINT;
26  unsignedint   = LONGINT;
27  off_t         = LONGINT;
28  size_t        = LONGINT;
29  time_t        = LONGINT;
30  NWStatBufT = PACKED RECORD
31   st_dev        : dev_t;         (* volume number *)
32   st_ino        : ino_t;         (* directory entry number of the st_name *)
33   st_mode       : unsignedshort; (* emulated file mode *)
34   st_nlink      : unsignedshort; (* count of hard links (always 1) *)
35   st_uid        : unsignedlong;  (* object id of owner *)
36   st_gid        : unsignedshort; (* group-id (always 0) *)
37   st_rdev       : dev_t;         (* device type (always 0) *)
38   st_size       : off_t;         (* total file size--files only *)
39   st_atime      : time_t;        (* last access date--files only *)
40   st_mtime      : time_t;        (* last modify date and time *)
41   st_ctime      : time_t;        (* POSIX: last status change time... *)
42                                  (* ...NetWare: creation date/time *)
43   st_btime      : time_t;        (* last archived date and time *)
44   st_attr       : unsignedlong;  (* file attributes *)
45   st_archivedID : unsignedlong;  (* user/object ID of last archive *)
46   st_updatedID  : unsignedlong;  (* user/object ID of last update *)
47   st_inheritedRightsMask
48                 : unsignedshort; (* inherited rights mask *)
49   st_originatingNameSpace
50                 : BYTE;          (* namespace of creation       *)
51   st_name       : ARRAY [0..255] OF CHAR;
52                                  (* TARGET_NAMESPACE name *)
53   st_blksize    : LONGINT;
54   st_blocks     : LONGINT;
55   st_flags      : LONGINT;
56   st_spare      : ARRAY [0..3] OF LONGINT;
57  END;
58
59FUNCTION  _stat  (path : PCHAR; VAR buf : NWStatBufT) : LONGINT; CDECL; EXTERNAL Clib NAME 'stat_411';
60FUNCTION  _fstat (Fileno : LONGINT; VAR buf : NWStatBufT) : LONGINT; CDECL; EXTERNAL CLib NAME 'fstat_411';
61
62PROCEDURE NWFree   (P : POINTER); CDECL; EXTERNAL Clib NAME 'free';
63
64PROCEDURE PressAnyKeyToContinue; CDecl; EXTERNAL; // Clib;
65
66
67PROCEDURE ExitThread (action_code, termination_code : LONGINT); CDecl; EXTERNAL CLib;
68FUNCTION _BeginThread (func, stack : pointer; Stacksize : LONGINT; arg : pointer) : LONGINT; Cdecl; EXTERNAL CLib NAME 'BeginThread';
69FUNCTION _GetThreadDataAreaPtr : POINTER; CDecl; EXTERNAL CLib NAME 'GetThreadDataAreaPtr';
70PROCEDURE _SaveThreadDataAreaPtr (P : POINTER); CDecl; EXTERNAL CLib NAME 'SaveThreadDataAreaPtr';
71PROCEDURE _exit (ExitCode : LONGINT); CDecl; EXTERNAL CLib;
72function _SuspendThread(threadID:longint):longint; cdecl;external ThreadsNlm name 'SuspendThread';
73function _GetThreadID:longint; cdecl;external ThreadsNlm name 'GetThreadID';
74procedure _ThreadSwitchWithDelay; cdecl;external ThreadsNlm name 'ThreadSwitchWithDelay';
75function _GetThreadName(threadID:longint; var tName):longint; cdecl;external ThreadsNlm name 'GetThreadName';
76function GetNLMHandle:dword;  cdecl;external ThreadsNlm name 'GetNLMHandle';
77(*
78PROCEDURE ConsolePrintf (FormatStr : PCHAR; Param : LONGINT); CDecl; EXTERNAL CLib Name 'ConsolePrintf';
79PROCEDURE ConsolePrintf (FormatStr : PCHAR; Param : pchar); CDecl; EXTERNAL CLib Name 'ConsolePrintf';
80PROCEDURE ConsolePrintf (FormatStr : PCHAR; P1,P2 : LONGINT); CDecl; EXTERNAL CLib Name 'ConsolePrintf';
81PROCEDURE ConsolePrintf (FormatStr : PCHAR; P1,P2,P3 : LONGINT); CDecl; EXTERNAL CLib Name 'ConsolePrintf';
82PROCEDURE ConsolePrintf (FormatStr : PCHAR; P1,P2,P3,P4 : LONGINT); CDecl; EXTERNAL CLib Name 'ConsolePrintf';
83PROCEDURE ConsolePrintf (FormatStr : PCHAR); CDecl; EXTERNAL CLib Name 'ConsolePrintf';
84*)
85// this gives internal compiler error 1234124 ??
86//PROCEDURE ConsolePrintf (FormatStr : PCHAR; Param : array of const); CDecl; EXTERNAL CLib;
87
88PROCEDURE _printf (FormatStr : PCHAR; Param : LONGINT); CDecl; EXTERNAL CLib;
89PROCEDURE _printf (FormatStr : PCHAR); CDecl; EXTERNAL CLib;
90// this gives internet compiler error 1234124 ??
91// PROCEDURE _printf (FormatStr : PCHAR; Param : array of const); CDecl; EXTERNAL CLib;
92
93// values for __action_code used with ExitThread()
94CONST
95  TSR_THREAD  = -1; //-Terminate only the current thread.
96  EXIT_THREAD = 0;  //-Terminate the current thread; if the current thread is
97                    // also the last thread, terminate the NLM.
98  EXIT_NLM    = 1;  //-Terminate the entire NLM.
99
100FUNCTION _GetStdIn  : POINTER; CDECL; EXTERNAL Clib NAME '__get_stdin';  // result: **FILE
101FUNCTION _GetStdOut : POINTER; CDECL; EXTERNAL Clib NAME '__get_stdout';
102FUNCTION _GetStdErr : POINTER; CDECL; EXTERNAL Clib NAME '__get_stderr';
103
104// FileIO by Fileno
105FUNCTION _open   (FileName : PCHAR; access, mode : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'open';
106FUNCTION _close  (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'close';
107FUNCTION _lseek  (FileNo,Pos,whence :LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'lseek';
108FUNCTION _chsize (FileNo,Pos : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'chsize';
109FUNCTION _tell   (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'tell';
110FUNCTION _write  (FileNo : LONGINT; BufP : POINTER; Len : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'write';
111FUNCTION _read   (FileNo : LONGINT; BufP : POINTER; Len : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'read';
112FUNCTION _filelength (filedes : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'filelength';
113FUNCTION _lock (filedes : LONGINT; Offset, Length : Cardinal) : LONGINT; CDECL; EXTERNAL Clib NAME 'lock';
114FUNCTION _unlock (filedes : LONGINT; Offset, Length : Cardinal) : LONGINT; CDECL; EXTERNAL Clib NAME 'unlock';
115
116TYPE
117  NWModifyStructure =
118    RECORD
119       MModifyName            : PCHAR;
120       MFileAttributes        : LONGINT;
121       MFileAttributesMask    : LONGINT;
122       MCreateDate            : WORD;
123       MCreateTime            : WORD;
124       MOwnerID               : LONGINT;
125       MLastArchivedDate      : WORD;
126       MLastArchivedTime      : WORD;
127       MLastArchivedID        : LONGINT;
128       MLastUpdatedDate       : WORD;
129       MLastUpdatedTime       : WORD;
130       MLastUpdatedID         : LONGINT;
131       MLastAccessedDate      : WORD;
132       MInheritanceGrantMask  : WORD;
133       MInheritanceRevokeMask : WORD;
134       MMaximumSpace          : LONGINT;
135       MLastUpdatedInSeconds  : LONGINT
136     END;
137
138CONST MModifyNameBit                 = $0001;
139      MFileAtrributesBit             = $0002;
140      MCreateDateBit                 = $0004;
141      MCreateTimeBit                 = $0008;
142      MOwnerIDBit                    = $0010;
143      MLastArchivedDateBit           = $0020;
144      MLastArchivedTimeBit           = $0040;
145      MLastArchivedIDBit             = $0080;
146      MLastUpdatedDateBit            = $0100;
147      MLastUpdatedTimeBit            = $0200;
148      MLastUpdatedIDBit              = $0400;
149      MLastAccessedDateBit           = $0800;
150      MInheritanceRestrictionMaskBit = $1000;
151      MMaximumSpaceBit               = $2000;
152      MLastUpdatedInSecondsBit       = $4000;
153
154// Directory
155FUNCTION _chdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL CLib NAME 'chdir';
156FUNCTION _getcwd (path : PCHAR; pathlen : LONGINT) : PCHAR; CDECL; EXTERNAL CLib NAME 'getcwd';
157FUNCTION _mkdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL CLib NAME 'mkdir';
158FUNCTION _rmdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL CLib NAME 'rmdir';
159FUNCTION _ChangeDirectoryEntry (PathName : PCHAR; VAR ModyStruct : NWModifyStructure; ModifyBits, AllowWildcard : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'ChangeDirectoryEntry';
160
161// get fileno from stream
162FUNCTION _fileno (Handle : LONGINT) : LONGINT; CDECL; EXTERNAL Clib NAME 'fileno';
163FUNCTION _isatty (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'isatty';
164
165(* values for 'o_flag' in open()... *)
166CONST O_RDONLY     = $0000;   (* open for read only *)
167      O_WRONLY     = $0001;   (* open for write only *)
168      O_RDWR       = $0002;   (* open for read and write *)
169      O_ACCMODE    = $0003;   (* AND with value to extract access flags *)
170      O_APPEND     = $0010;   (* writes done at end of file *)
171      O_CREAT      = $0020;   (* create new file *)
172      O_TRUNC      = $0040;   (* truncate existing file *)
173      O_EXCL       = $0080;   (* exclusive open *)
174      O_TEXT       = $0100;   (* text file--unsupported *)
175      O_BINARY     = $0200;   (* binary file *)
176      O_NDELAY     = $0400;   (* nonblocking flag *)
177      O_NOCTTY     = $0800;   (* currently unsupported *)
178      O_NONBLOCK   = O_NDELAY;
179
180
181// File Utils
182FUNCTION _unlink (FileName : PCHAR) : LONGINT; CDECL; EXTERNAL CLib NAME 'unlink';
183FUNCTION _rename (oldpath, newpath : PCHAR) : LONGINT; CDECL; EXTERNAL Clib NAME 'rename';
184
185// Error
186TYPE _PLONGINT = ^LONGINT;
187FUNCTION __get_errno_ptr : _PLONGINT; CDECL; EXTERNAL Clib;
188
189// Memory
190FUNCTION _malloc (size : LONGINT) : POINTER; CDECL; EXTERNAL CLib NAME 'malloc';
191FUNCTION _realloc (p : POINTER; size : LONGINT) : POINTER; CDECL; EXTERNAL CLib NAME 'realloc';
192PROCEDURE _free (what : POINTER); CDECL; EXTERNAL CLib NAME 'free';
193FUNCTION _stackavail : CARDINAL; CDECL; EXTERNAL CLib NAME 'stackavail';
194
195// Debug
196PROCEDURE _EnterDebugger; CDECL; EXTERNAL Clib NAME 'EnterDebugger';
197
198// String
199FUNCTION _strlen (P : PCHAR) : LONGINT; CDECL; EXTERNAL Clib NAME 'strlen';
200
201// Time/Date
202TYPE NWTM = RECORD
203              tm_sec, tm_min, tm_hour,
204              tm_mday, tm_mon, tm_year,
205              tm_wday, tm_yday, tm_isdst : LONGINT;
206            END;
207     PNWTM = ^NWTM;
208FUNCTION _localtime (VAR time : time_t) : PNWTM; CDECL; EXTERNAL Clib NAME 'localtime';
209FUNCTION _time (tloc : POINTER) : LONGINT; CDECL; EXTERNAL Clib NAME 'time';
210PROCEDURE _ConvertTimeToDOS (time : time_t; VAR DosDate, DosTime : WORD); CDECL; EXTERNAL Clib NAME '_ConvertTimeToDOS';
211PROCEDURE _tzset; CDECL; EXTERNAL Clib NAME 'tzset';
212
213
214//-----------------------------------------------------------------------
215
216CONST NWDEFCONN_HANDLE = 0;
217
218TYPE NWCONN_HANDLE = LONGINT;
219     NWRCODE = LONGINT;
220     NWDateAndTime = PACKED RECORD
221                       Year,Month,Day,
222                       Hour,Minute,Second,DayOfWeek : BYTE;
223                     END;
224
225PROCEDURE GetFileServerDateAndTime (VAR TimeBuf : NWDateAndTime); CDECL; EXTERNAL CLib NAME 'GetFileServerDateAndTime';
226FUNCTION  SetFileServerDateAndTime(year:WORD; month:WORD; day:WORD; hour:WORD; minute:WORD;
227               second:WORD):longint;cdecl; EXTERNAL CLib Name 'SetFileServerDateAndTime';
228
229TYPE   FILE_SERV_INFO = record
230            serverName              : array[0..47] of char;
231            netwareVersion          : BYTE;
232            netwareSubVersion       : BYTE;
233            maxConnectionsSupported : WORD;
234            connectionsInUse        : WORD;
235            maxVolumesSupported     : WORD;
236            revisionLevel           : BYTE;
237            SFTLevel                : BYTE;
238            TTSLevel                : BYTE;
239            peakConnectionsUsed     : WORD;
240            accountingVersion       : BYTE;
241            VAPversion              : BYTE;
242            queingVersion           : BYTE;
243            printServerVersion      : BYTE;
244            virtualConsoleVersion   : BYTE;
245            securityRestrictionLevel: BYTE;
246            internetBridgeSupport   : BYTE;
247            reserved                : array[0..59] of BYTE;
248            CLibMajorVersion        : BYTE;
249            CLibMinorVersion        : BYTE;
250            CLibRevision            : BYTE;
251         end;
252   pFILE_SERV_INFO = ^FILE_SERV_INFO;
253
254FUNCTION GetServerInformation(returnSize:longint; serverInfo:pFILE_SERV_INFO):longint;cdecl; EXTERNAL CLib NAME 'GetServerInformation';
255
256// Directory
257TYPE NWDirEnt =
258  PACKED RECORD
259    d_attr                : LONGINT;
260    d_time                : WORD;           {modification time}
261    d_date                : WORD;           {modification date}
262    d_size                : LONGINT;        {filesize}
263    d_ino                 : LONGINT;        {serial number}
264    d_dev                 : LONGINT;        {volume number}
265    d_cdatetime           : time_t;         {creation date and time}
266    d_adatetime           : time_t;         {last access - files only}
267    d_bdatetime           : time_t;         {last archive date and time}
268    d_uid                 : LONGINT;        {owner id (object id) }
269    d_archivedID          : LONGINT;
270    d_updatedID           : LONGINT;
271    d_nameDOS             : ARRAY [0..12] OF CHAR;
272    d_inheritedRightsMask : WORD;
273    d_originatingNameSpace: BYTE;
274    d_ddatetime           : time_t;         {deleted date time}
275    d_deletedID           : LONGINT;
276    {---- new fields starting in v4.11 ----}
277    d_name                : ARRAY [0..255] OF CHAR;  { enty's namespace name }
278  END;
279  PNWDirEnt = ^NWDirEnt;
280
281  FUNCTION _opendir (pathname : PCHAR) : PNWDirEnt; CDECL; EXTERNAL CLib NAME 'opendir_411';
282  FUNCTION _closedir (dirH : PNWDirEnt) : LONGINT; CDECL; EXTERNAL CLib NAME 'closedir';
283  FUNCTION _readdir  (dirH : PNWDirEnt) : PNWDirEnt; CDECL; EXTERNAL CLib NAME 'readdir';
284  FUNCTION _SetReaddirAttribute (dirH : PNWDirEnt; Attribute : LONGINT) : LONGINT; EXTERNAL CLib NAME 'SetReaddirAttribute';
285
286// Environment
287  FUNCTION _getenv (name : PCHAR) : PCHAR; CDECL; EXTERNAL CLib NAME 'getenv';
288
289// Volumes
290  FUNCTION _GetVolumeName (volumeNumber : LONGINT; volumeName : PCHAR) : LONGINT; CDECL; EXTERNAL CLib NAME 'GetVolumeName';
291  FUNCTION _GetVolumeNumber (volumeName : PCHAR; VAR volumeNumber : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'GetVolumeNumber';
292  FUNCTION _GetVolumeInfoWithNumber (VolumeNumber : BYTE;
293                                     VolumeName   : PCHAR;
294                                 VAR TotalBlocks  : WORD;
295                                 VAR SectorsPerBlock : WORD;
296                                 VAR availableBlocks : WORD;
297                                 VAR totalDirectorySlots : WORD;
298                                 VAR availableDirSlots   : WORD;
299                                 VAR volumeisRemovable   : WORD) : LONGINT; CDECL; EXTERNAL CLib NAME 'GetVolumeInfoWithNumber';
300  FUNCTION _GetNumberOfVolumes : LONGINT; CDECL; EXTERNAL CLib NAME 'GetNumberOfVolumes';
301
302// Screen/Keyboad
303PROCEDURE _CopyToScreenMemory (Height, Width : WORD; Data : POINTER; x, y : WORD); CDECL; EXTERNAL Clib NAME 'CopyToScreenMemory';
304PROCEDURE _CopyFromScreenMemory (Height, Width : WORD; Data : POINTER; x, y : WORD); CDECL; EXTERNAL CLib NAME 'CopyFromScreenMemory';
305FUNCTION  _DisplayInputCursor : LONGINT; CDECL; EXTERNAL CLib NAME 'DisplayInputCursor';
306FUNCTION  _HideInputCursor : LONGINT; CDECL; EXTERNAL CLib NAME 'HideInputCursor';
307FUNCTION  _SetPositionOfInputCursor (row,col : WORD): LONGINT; CDECL; EXTERNAL Clib NAME 'SetPositionOfInputCursor';
308PROCEDURE _GotoXY (col, row : WORD); CDECL; EXTERNAL Clib NAME 'gotoxy';
309FUNCTION  _GetSizeOfScreen (VAR height,width : WORD): LONGINT; CDECL; EXTERNAL CLib NAME 'GetSizeOfScreen';
310FUNCTION  _IsColorMonitor : LONGINT; CDECL; EXTERNAL CLib NAME 'IsColorMonitor';
311PROCEDURE _RingTheBell; CDECL; EXTERNAL CLib NAME 'RingTheBell';
312FUNCTION  _SetCursorShape (startline,endline : BYTE) : WORD; CDECL; EXTERNAL CLib NAME 'SetCursorShape';
313FUNCTION  _GetCursorShape (VAR startline,endline : BYTE) : WORD; CDECL; EXTERNAL CLib NAME 'GetCursorShape';
314FUNCTION  _wherex : WORD; CDECL; EXTERNAL CLib NAME 'wherex';
315FUNCTION  _wherey : WORD; CDECL; EXTERNAL CLib NAME 'wherey';
316PROCEDURE _clrscr; CDECL; EXTERNAL CLib NAME 'clrscr';
317FUNCTION  _kbhit : LONGINT; CDECL; EXTERNAL Clib NAME 'kbhit';
318FUNCTION  _getch : CHAR; CDECL; EXTERNAL CLib NAME 'getch';
319PROCEDURE _delay (miliseconds : longint); CDECL; EXTERNAL Clib NAME 'delay';
320FUNCTION  _SetCtrlCharCheckMode (Enabled : BOOLEAN) : BOOLEAN; CDECL; EXTERNAL CLib NAME 'SetCtrlCharCheckMode';
321FUNCTION  _SetAutoScreenDestructionMode (Enabled : BOOLEAN) : BOOLEAN; CDECL; EXTERNAL CLib NAME 'SetAutoScreenDestructionMode';
322
323// Misc
324FUNCTION _memcpy (Dest, Src : POINTER; Len : LONGINT) : POINTER; CDECL; EXTERNAL Clib NAME 'memcpy';
325
326FUNCTION _OpenLocalSemaphore (InitialValue : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'OpenLocalSemaphore';
327FUNCTION _WaitOnLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL Clib NAME 'WaitOnLocalSemaphore';
328FUNCTION _SignalLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'SignalLocalSemaphore';
329FUNCTION _CloseLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'CloseLocalSemaphore';
330FUNCTION _EnterCritSec : LONGINT; CDecl; EXTERNAL CLib NAME 'EnterCritSec';
331FUNCTION _ExitCritSec : LONGINT; CDecl; EXTERNAL CLib NAME 'ExitCritSec';
332
333
334FUNCTION _SetThreadGroupID (id : longint) : longint; CDecl; EXTERNAL CLib NAME 'SetThreadGroupID';
335FUNCTION _GetThreadGroupID : longint; CDecl; EXTERNAL CLib NAME 'GetThreadGroupID';
336
337CONST _SIGTERM = 6;
338
339PROCEDURE _Signal (Sig : longint; SigFunc : pointer);  CDECL; EXTERNAL Clib NAME 'signal';
340
341FUNCTION _SetCurrentNameSpace (newNameSpace : BYTE) : BYTE;  CDECL; EXTERNAL Clib NAME 'SetCurrentNameSpace';
342FUNCTION _SetTargetNameSpace  (newNameSpace : BYTE) : BYTE;  CDECL; EXTERNAL Clib NAME 'SetTargetNameSpace';
343
344CONST
345  NW_NS_DOS     = 0;
346  NW_NS_MAC     = 1;
347  NW_NS_NFS     = 2;
348  NW_NS_FTAM    = 3;
349  NW_NS_LONG    = 4;
350
351function _NWAddSearchPathAtEnd (searchPath : pchar; var number : longint) : longint; cdecl; external Clib name 'NWAddSearchPathAtEnd';
352function _NWDeleteSearchPath (searchPathNumber : longint) : longint; cdecl; external Clib name 'NWDeleteSearchPath';
353function _NWInsertSearchPath (searchPathNumber : longint; path : pchar) : longint; cdecl; external Clib name 'NWInsertSearchPath';
354function _NWGetSearchPathElement (searchPathNumber : longint; var isDOSSearchPath : longint; searchPath : pchar) : longint; cdecl; external Clib name 'NWGetSearchPathElement';
355
356
357// values for __mode used with spawnxx()
358CONST
359   P_WAIT                    = 0;
360   P_NOWAIT                  = 1;
361   P_OVERLAY                 = 2;
362   P_NOWAITO                 = 4;
363   P_SPAWN_IN_CURRENT_DOMAIN = 8;
364
365
366//function spawnlp(mode:longint; path:Pchar; arg0:Pchar; args:array of const):longint;cdecl;external CLib name 'spawnlp';
367function spawnlp(mode:longint; path:Pchar; arg0:Pchar):longint;cdecl;external Clib name 'spawnlp';
368function spawnvp(mode:longint; path:Pchar; argv:PPchar):longint;cdecl;external Clib name 'spawnvp';
369
370
371
372