2
0
Эх сурвалжийг харах

* support for fcl, support for linking without debug info
* renamed winsock2 to winsock for win32 compatinility
* new sockets unit for netware
* changes for compiler warnings

armin 22 жил өмнө
parent
commit
cc769a33ea

+ 7 - 7
rtl/netware/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 1.1 [2003/03/22]
+# Don't edit, this file is generated by FPCMake Version 1.1 [2003/03/25]
 #
 default: all
-MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx palmos macos macosx emx
+MAKEFILETARGETS=netware
 override PATH:=$(subst \,/,$(PATH))
 ifeq ($(findstring ;,$(PATH)),)
 inUnix=1
@@ -216,9 +216,9 @@ SYSTEMUNIT=sysnetwa
 endif
 override FPCOPT+=-Ur
 override FPCOPT+=-dMT
-CREATESMART=1
+CREATESMART=0
 OBJPASDIR=$(RTL)/objpas
-override TARGET_UNITS+=$(SYSTEMUNIT) systhrds objpas strings netware winsock2 dos crt objects sysutils typinfo math cpu mmx getopts heaptrc lineinfo sockets aio varutils video mouse keyboard types nwsnut nwserv nwnit nwprot
+override TARGET_UNITS+=$(SYSTEMUNIT) systhrds objpas strings winsock dos crt objects sysutils typinfo math cpu mmx getopts heaptrc lineinfo sockets aio varutils video mouse keyboard types nwsnut nwserv nwnit nwprot
 override TARGET_LOADERS+=nwpre prelude
 override TARGET_RSTS+=math typinfo varutils
 override INSTALL_FPCPACKAGE=y
@@ -545,8 +545,8 @@ ZIPSUFFIX=qnx
 endif
 ifeq ($(OS_TARGET),netware)
 STATICLIBPREFIX=
-PPUEXT=.ppn
-OEXT=.on
+PPUEXT=.ppu
+OEXT=.o
 ASMEXT=.s
 SMARTEXT=.sl
 STATICLIBEXT=.a
@@ -1339,7 +1339,7 @@ varutils$(PPUEXT) : $(OBJPASDIR)/cvarutil.inc $(OBJPASDIR)/varutils.inc \
 override INSTALLPPUFILES+=nwimp/aio.imp nwimp/aio.imp nwimp/audnlm32.imp \
 nwimp/calnlm32.imp nwimp/ccs.imp nwimp/ccs-os.imp nwimp/clibaux.imp \
 nwimp/clibctx.imp nwimp/clib.imp nwimp/clxnlm32.imp nwimp/dplsv386.imp \
-nwimp/dsapi.imp nwimp/dsevent.imp nwimp/fpsm.imp nwimp/lib0.imp \
+nwimp/dsapi.imp nwimp/dsevent.imp nwimp/lib0.imp \
 nwimp/locnlm32.imp nwimp/ndpsrpc.imp nwimp/netnlm32.imp nwimp/nit.imp \
 nwimp/nlmlib.imp nwimp/nwpsrv3x.imp nwimp/nwpsrv.imp nwimp/nwsnut.imp \
 nwimp/requestr.imp nwimp/socklib.imp nwimp/streams.imp nwimp/threads.imp \

+ 5 - 3
rtl/netware/Makefile.fpc

@@ -8,7 +8,7 @@ main=rtl
 [target]
 loaders=nwpre prelude
 units=$(SYSTEMUNIT) systhrds objpas strings \
-      netware winsock2 \
+      winsock \
       dos crt objects \
       sysutils typinfo math \
       cpu mmx getopts heaptrc lineinfo \
@@ -53,6 +53,7 @@ endif
 override FPCOPT+=-Ur
 # endif
 
+#debug, -a: dont delete asm, -al include lines
 #override FPCOPT+=-a
 #override FPCOPT+=-al
 
@@ -61,7 +62,8 @@ override FPCOPT+=-Ur
 override FPCOPT+=-dMT
 
 # and alway use smartlinking
-CREATESMART=1
+#CREATESMART=1
+CREATESMART=0
 
 # Paths
 OBJPASDIR=$(RTL)/objpas
@@ -192,7 +194,7 @@ varutils$(PPUEXT) : $(OBJPASDIR)/cvarutil.inc $(OBJPASDIR)/varutils.inc \
 override INSTALLPPUFILES+=nwimp/aio.imp nwimp/aio.imp nwimp/audnlm32.imp \
 nwimp/calnlm32.imp nwimp/ccs.imp nwimp/ccs-os.imp nwimp/clibaux.imp \
 nwimp/clibctx.imp nwimp/clib.imp nwimp/clxnlm32.imp nwimp/dplsv386.imp \
-nwimp/dsapi.imp nwimp/dsevent.imp nwimp/fpsm.imp nwimp/lib0.imp \
+nwimp/dsapi.imp nwimp/dsevent.imp nwimp/lib0.imp \
 nwimp/locnlm32.imp nwimp/ndpsrpc.imp nwimp/netnlm32.imp nwimp/nit.imp \
 nwimp/nlmlib.imp nwimp/nwpsrv3x.imp nwimp/nwpsrv.imp nwimp/nwsnut.imp \
 nwimp/requestr.imp nwimp/socklib.imp nwimp/streams.imp nwimp/threads.imp \

+ 0 - 38
rtl/netware/compile.cmd

@@ -1,38 +0,0 @@
-@echo off
-REM comile and install fpc rtl for netware under winnt/win2k
-REM make seems to have a problem unter nt/w2k
-REM
-SET DEST=\compiler\fpc\units\netware
-
-REM Compile and install system unit first
-SET INC=-I../inc -I../i386 -I../objpas ../inc/strings.pp
-SET OPT=-di386 -XX -O3 -Sg -Tnetware
-
-del /Q *.ppn
-del /Q *.on
-ppc386 %OPT% -dSYSTEMDEBUG  -FE. %INC%
-copy *.ppn %DEST%
-copy *.on %DEST%
-
-REM copy the import files
-copy nwimp\*.imp %DEST%
-
-REM and build other stuff
-#ppc386 -di386 -XX -O3 -Sg -Tnetware -FE. nwpre.pp
-asw nwpre.as -o nwpre.on
-asw prelude.as -o prelude.on
-
-ppc386 %OPT% %INC% dos.pp
-ppc386 %OPT% %INC% crt.pp
-ppc386 %OPT% %INC% ../objpas/objpas.pp
-ppc386 %OPT% %INC% sysutils.pp
-ppc386 %OPT% %INC% keyboard.pp
-ppc386 %OPT% %INC% mouse.pp
-ppc386 %OPT% %INC% video.pp
-ppc386 %OPT% %INC% sockets.pp
-ppc386 %OPT% %INC% netware.pp
-ppc386 %OPT% %INC% winsock2.pp
-ppc386 %OPT% %INC% aio.pp
-
-copy *.on %DEST%
-copy *.ppn %DEST%

+ 10 - 9
rtl/netware/crt.pp

@@ -219,7 +219,7 @@ end;
 
 procedure textmode(mode : integer);
 begin
-  Window (1,1,ScreenWidth,ScreenHeight);
+  Window (1,1,byte(ScreenWidth),byte(ScreenHeight));
   ClrScr;
 end;
 
@@ -325,7 +325,7 @@ begin
      rows   := WinMaxY-WinMinY+1;
      GetMem (p, rows * rowlen * 2);
      FillWord (p^, rows * rowlen, fil);
-     _CopyToScreenMemory (rows,rowlen,p,WinMinX-1,WinMinY-1);
+     _CopyToScreenMemory (word(rows),word(rowlen),p,WinMinX-1,WinMinY-1);
      FreeMem (p, rows * rowlen * 2);
    end;
   Gotoxy(1,1);
@@ -455,8 +455,8 @@ begin
   y:=WinMinY+y-1;
   While (y<=WinMaxY) do
    begin
-     _CopyFromScreenMemory (1,rowlen,p,WinMinX-1,y);
-     _CopyToScreenMemory (1,rowlen,p,WinMinX-1,y-1);
+     _CopyFromScreenMemory (1,rowlen,p,WinMinX-1,word(y));
+     _CopyToScreenMemory (1,rowlen,p,WinMinX-1,word(y-1));
      inc(y);
    end;
   FillWord (p^,rowlen,fil);
@@ -473,9 +473,10 @@ end;
 
 procedure insline;
 var
-  my,y : longint;
+  my : longint;
+  y  : word;
   fil : word;
-  rowlen,x : word;
+  rowlen : word;
   p : pointer;
 begin
   fil:=32 or (textattr shl 8);
@@ -485,12 +486,12 @@ begin
   GetMem (p, rowlen*2);
   while (my>=y) do
    begin
-     _CopyFromScreenMemory (1,rowlen,p,WinMinX-1,my);
-     _CopyToScreenMemory (1,rowlen,p,WinMinX-1,my+1);
+     _CopyFromScreenMemory (1,rowlen,p,WinMinX-1,word(my));
+     _CopyToScreenMemory (1,rowlen,p,WinMinX-1,word(my+1));
      dec(my);
    end;
   FillWord (p^,rowlen,fil);
-  _CopyToScreenMemory (1,rowlen,p,x,y);
+  _CopyToScreenMemory (1,rowlen,p,WinMinX-1,y);
   FreeMem (p, rowlen*2);
 end;
 

+ 12 - 6
rtl/netware/dos.pp

@@ -292,7 +292,7 @@ end;
 
 function getvolnum (drive : byte) : longint;
 var dir : STRING[255];
-    P,PS: BYTE;
+    P,PS,
     V   : LONGINT;
 begin
   if drive = 0 then
@@ -389,10 +389,10 @@ VAR Buf                 : ARRAY [0..255] OF CHAR;
     volumeNumber        : LONGINT;
 begin
   volumeNumber := getvolnum (drive);
-  if volumeNumber >= 0 then
+  if (volumeNumber >= 0) and (volumeNumber <= 255) then
   begin
     {i think thats not the right function but for others i need a connection handle}
-    if _GetVolumeInfoWithNumber (volumeNumber,@Buf,
+    if _GetVolumeInfoWithNumber (byte(volumeNumber),@Buf,
                                  TotalBlocks,
                                  SectorsPerBlock,
                                  availableBlocks,
@@ -419,10 +419,10 @@ VAR Buf                 : ARRAY [0..255] OF CHAR;
     volumeNumber        : LONGINT;
 begin
   volumeNumber := getvolnum (drive);
-  if volumeNumber >= 0 then
+  if (volumeNumber >= 0) and (volumeNumber <= 255) then
   begin
     {i think thats not the right function but for others i need a connection handle}
-    if _GetVolumeInfoWithNumber (volumeNumber,@Buf,
+    if _GetVolumeInfoWithNumber (byte(volumeNumber),@Buf,
                                  TotalBlocks,
                                  SectorsPerBlock,
                                  availableBlocks,
@@ -858,7 +858,13 @@ end;
 end.
 {
   $Log$
-  Revision 1.5  2002-09-07 16:01:20  peter
+  Revision 1.6  2003-03-25 18:17:54  armin
+  * support for fcl, support for linking without debug info
+  * renamed winsock2 to winsock for win32 compatinility
+  * new sockets unit for netware
+  * changes for compiler warnings
+
+  Revision 1.5  2002/09/07 16:01:20  peter
     * old logs removed and tabs fixed
 
 }

+ 34 - 4
rtl/netware/nwpre.as

@@ -45,17 +45,18 @@ _Prelude:
    	pushl	%ebx
      	movl	0x14(%ebp),%edi
      	movl	0x18(%ebp),%esi
+	movl	%esi, __uninitializedDataSize
      	movl	0x1c(%ebp),%ebx
      	movl	0x20(%ebp),%ecx
      	movl	0x28(%ebp),%eax
    	pushl	$_pasStart_
    	pushl	$_kNLMInfo
    	pushl	%eax
-     	movl	0x24(%ebp),%edx
+     	movl	0x24(%ebp),%edx  # 1b7f6
    	pushl	%edx
-       	pushl	%ecx
+       	pushl	%ecx  
    	pushl	%ebx
-       	pushl	%esi
+       	pushl	%esi			# uninitialized data size
        	pushl	%edi
      	movl	0x10(%ebp),%edx
    	pushl	%edx
@@ -105,8 +106,37 @@ _Stop:
 #      LongDoubleSize : LONGINT;		// gcc nwpre defines 12, watcom 8
 #      wchar_tSize    : LONGINT;
 #    END;
-
+    .globl	_kNLMInfo		# will be used as data start
 _kNLMInfo:
 	.ascii	"NLMI"
 	.long	0,1,8,2
+	
+
+.text
+.globl	__getTextStart
+__getTextStart:
+    movl    $.text,%eax
+    ret	
+    
+.text
+.globl	__getDataStart
+__getDataStart:
+    movl    $.data,%eax
+    ret
 
+.text
+.globl	__getBssStart
+__getBssStart:
+    movl    $.bss,%eax
+    ret
+    
+.data 
+  __uninitializedDataSize:	.long
+    
+
+
+.text
+.globl  __getUninitializedDataSize
+__getUninitializedDataSize:
+    movl   __uninitializedDataSize, %eax
+    ret

+ 73 - 72
rtl/netware/nwsys.inc

@@ -20,13 +20,8 @@
   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';
+CONST Clib       = 'clib';
+
 
 TYPE
   dev_t         = LONGINT;
@@ -66,8 +61,8 @@ TYPE
    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';
+FUNCTION  _stat  (path : PCHAR; VAR buf : NWStatBufT) : LONGINT; CDECL; EXTERNAL Clib NAME 'stat_411';
+FUNCTION  _fstat (Fileno : LONGINT; VAR buf : NWStatBufT) : LONGINT; CDECL; EXTERNAL CLib NAME 'fstat_411';
 
 PROCEDURE NWFree   (P : POINTER); CDECL; EXTERNAL Clib NAME 'free';
 
@@ -75,9 +70,9 @@ 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';
+FUNCTION _BeginThread (func, stack : pointer; Stacksize : LONGINT; arg : pointer) : LONGINT; Cdecl; EXTERNAL CLib NAME 'BeginThread';
+FUNCTION _GetThreadDataAreaPtr : POINTER; CDecl; EXTERNAL CLib NAME 'GetThreadDataAreaPtr';
+PROCEDURE _SaveThreadDataAreaPtr (P : POINTER); CDecl; EXTERNAL CLib NAME 'SaveThreadDataAreaPtr';
 PROCEDURE _exit (ExitCode : LONGINT); CDecl; EXTERNAL CLib;
 
 PROCEDURE ConsolePrintf (FormatStr : PCHAR; Param : LONGINT); CDecl; EXTERNAL CLib Name 'ConsolePrintf';
@@ -103,14 +98,14 @@ 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';
+FUNCTION _open   (FileName : PCHAR; access, mode : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'open';
+FUNCTION _close  (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'close';
+FUNCTION _lseek  (FileNo,Pos,whence :LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'lseek';
+FUNCTION _chsize (FileNo,Pos : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'chsize';
+FUNCTION _tell   (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'tell';
+FUNCTION _write  (FileNo : LONGINT; BufP : POINTER; Len : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'write';
+FUNCTION _read   (FileNo : LONGINT; BufP : POINTER; Len : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'read';
+FUNCTION _filelength (filedes : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'filelength';
 
 TYPE
   NWModifyStructure =
@@ -151,15 +146,15 @@ CONST MModifyNameBit                 = $0001;
       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';
+FUNCTION _chdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL CLib NAME 'chdir';
+FUNCTION _getcwd (path : PCHAR; pathlen : LONGINT) : PCHAR; CDECL; EXTERNAL CLib NAME 'getcwd';
+FUNCTION _mkdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL CLib NAME 'mkdir';
+FUNCTION _rmdir  (path : PCHAR) : LONGINT; CDECL; EXTERNAL CLib NAME 'rmdir';
+FUNCTION _ChangeDirectoryEntry (PathName : PCHAR; VAR ModyStruct : NWModifyStructure; ModifyBits, AllowWildcard : LONGINT) : LONGINT; CDECL; EXTERNAL CLib 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';
+FUNCTION _isatty (FileNo : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'isatty';
 
 (* values for 'o_flag' in open()... *)
 CONST O_RDONLY     = $0000;   (* open for read only *)
@@ -178,7 +173,7 @@ CONST O_RDONLY     = $0000;   (* open for read only *)
 
 
 // File Utils
-FUNCTION _unlink (FileName : PCHAR) : LONGINT; CDECL; EXTERNAL NlmLib NAME 'unlink';
+FUNCTION _unlink (FileName : PCHAR) : LONGINT; CDECL; EXTERNAL CLib NAME 'unlink';
 FUNCTION _rename (oldpath, newpath : PCHAR) : LONGINT; CDECL; EXTERNAL Clib NAME 'rename';
 
 // Error
@@ -186,10 +181,10 @@ 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';
+FUNCTION _malloc (size : LONGINT) : POINTER; CDECL; EXTERNAL CLib NAME 'malloc';
+FUNCTION _realloc (p : POINTER; size : LONGINT) : POINTER; CDECL; EXTERNAL CLib NAME 'realloc';
+PROCEDURE _free (what : POINTER); CDECL; EXTERNAL CLib NAME 'free';
+FUNCTION _stackavail : LONGINT; CDECL; EXTERNAL CLib NAME 'stackavail';
 
 // Debug
 PROCEDURE _EnterDebugger; CDECL; EXTERNAL Clib NAME 'EnterDebugger';
@@ -221,9 +216,9 @@ TYPE NWCONN_HANDLE = LONGINT;
                        Hour,Minute,Second,DayOfWeek : BYTE;
                      END;
 
-PROCEDURE GetFileServerDateAndTime (VAR TimeBuf : NWDateAndTime); CDECL; EXTERNAL NitNlm NAME 'GetFileServerDateAndTime';
+PROCEDURE GetFileServerDateAndTime (VAR TimeBuf : NWDateAndTime); CDECL; EXTERNAL CLib NAME 'GetFileServerDateAndTime';
 FUNCTION  SetFileServerDateAndTime(year:WORD; month:WORD; day:WORD; hour:WORD; minute:WORD;
-               second:WORD):longint;cdecl; EXTERNAL NitNlm Name 'SetFileServerDateAndTime';
+               second:WORD):longint;cdecl; EXTERNAL CLib Name 'SetFileServerDateAndTime';
 
 TYPE   FILE_SERV_INFO = record
             serverName              : array[0..47] of char;
@@ -250,7 +245,7 @@ TYPE   FILE_SERV_INFO = record
          end;
    pFILE_SERV_INFO = ^FILE_SERV_INFO;
 
-FUNCTION GetServerInformation(returnSize:longint; serverInfo:pFILE_SERV_INFO):longint;cdecl; EXTERNAL NitNlm NAME 'GetServerInformation';
+FUNCTION GetServerInformation(returnSize:longint; serverInfo:pFILE_SERV_INFO):longint;cdecl; EXTERNAL CLib NAME 'GetServerInformation';
 
 // Directory
 TYPE NWDirEnt =
@@ -277,17 +272,17 @@ TYPE NWDirEnt =
   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';
+  FUNCTION _opendir (pathname : PCHAR) : PNWDirEnt; CDECL; EXTERNAL CLib NAME 'opendir_411';
+  FUNCTION _closedir (dirH : PNWDirEnt) : LONGINT; CDECL; EXTERNAL CLib NAME 'closedir';
+  FUNCTION _readdir  (dirH : PNWDirEnt) : PNWDirEnt; CDECL; EXTERNAL CLib NAME 'readdir';
+  FUNCTION _SetReaddirAttribute (dirH : PNWDirEnt; Attribute : LONGINT) : LONGINT; EXTERNAL CLib NAME 'SetReaddirAttribute';
 
 // Environment
-  FUNCTION _getenv (name : PCHAR) : PCHAR; CDECL; EXTERNAL NlmLib NAME 'getenv';
+  FUNCTION _getenv (name : PCHAR) : PCHAR; CDECL; EXTERNAL CLib 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 _GetVolumeName (volumeNumber : LONGINT; volumeName : PCHAR) : LONGINT; CDECL; EXTERNAL CLib NAME 'GetVolumeName';
+  FUNCTION _GetVolumeNumber (volumeName : PCHAR; VAR volumeNumber : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'GetVolumeNumber';
   FUNCTION _GetVolumeInfoWithNumber (VolumeNumber : BYTE;
                                      VolumeName   : PCHAR;
                                  VAR TotalBlocks  : WORD;
@@ -295,43 +290,43 @@ TYPE NWDirEnt =
                                  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';
+                                 VAR volumeisRemovable   : WORD) : LONGINT; CDECL; EXTERNAL CLib NAME 'GetVolumeInfoWithNumber';
+  FUNCTION _GetNumberOfVolumes : LONGINT; CDECL; EXTERNAL CLib 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';
+PROCEDURE _CopyToScreenMemory (Height, Width : WORD; Data : POINTER; x, y : WORD); CDECL; EXTERNAL Clib NAME 'CopyToScreenMemory';
+PROCEDURE _CopyFromScreenMemory (Height, Width : WORD; Data : POINTER; x, y : WORD); CDECL; EXTERNAL CLib NAME 'CopyFromScreenMemory';
+FUNCTION  _DisplayInputCursor : LONGINT; CDECL; EXTERNAL CLib NAME 'DisplayInputCursor';
+FUNCTION  _HideInputCursor : LONGINT; CDECL; EXTERNAL CLib NAME 'HideInputCursor';
+FUNCTION  _SetPositionOfInputCursor (row,col : WORD): LONGINT; CDECL; EXTERNAL Clib NAME 'SetPositionOfInputCursor';
+PROCEDURE _GotoXY (col, row : WORD); CDECL; EXTERNAL Clib NAME 'gotoxy';
+FUNCTION  _GetSizeOfScreen (VAR height,width : WORD): LONGINT; CDECL; EXTERNAL CLib NAME 'GetSizeOfScreen';
+FUNCTION  _IsColorMonitor : LONGINT; CDECL; EXTERNAL CLib NAME 'IsColorMonitor';
+PROCEDURE _RingTheBell; CDECL; EXTERNAL CLib NAME 'RingTheBell';
+FUNCTION  _SetCursorShape (startline,endline : BYTE) : WORD; CDECL; EXTERNAL CLib NAME 'SetCursorShape';
+FUNCTION  _GetCursorShape (VAR startline,endline : BYTE) : WORD; CDECL; EXTERNAL CLib NAME 'GetCursorShape';
+FUNCTION  _wherex : WORD; CDECL; EXTERNAL CLib NAME 'wherex';
+FUNCTION  _wherey : WORD; CDECL; EXTERNAL CLib NAME 'wherey';
+PROCEDURE _clrscr; CDECL; EXTERNAL CLib NAME 'clrscr';
+FUNCTION  _kbhit : LONGINT; CDECL; EXTERNAL Clib NAME 'kbhit';
+FUNCTION  _getch : CHAR; CDECL; EXTERNAL CLib NAME 'getch';
+PROCEDURE _delay (miliseconds : longint); CDECL; EXTERNAL Clib NAME 'delay';
+FUNCTION  _SetCtrlCharCheckMode (Enabled : BOOLEAN) : BOOLEAN; CDECL; EXTERNAL CLib NAME 'SetCtrlCharCheckMode';
+FUNCTION  _SetAutoScreenDestructionMode (Enabled : BOOLEAN) : BOOLEAN; CDECL; EXTERNAL CLib NAME 'SetAutoScreenDestructionMode';
 
 // Misc
-FUNCTION _memcpy (Dest, Src : POINTER; Len : LONGINT) : POINTER; CDECL; EXTERNAL ThreadsNlm NAME 'memcpy';
+FUNCTION _memcpy (Dest, Src : POINTER; Len : LONGINT) : POINTER; CDECL; EXTERNAL Clib 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 _OpenLocalSemaphore (InitialValue : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'OpenLocalSemaphore';
+FUNCTION _WaitOnLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL Clib NAME 'WaitOnLocalSemaphore';
+FUNCTION _SignalLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'SignalLocalSemaphore';
+FUNCTION _CloseLocalSemaphore (semaphoreHandle : LONGINT) : LONGINT; CDECL; EXTERNAL CLib NAME 'CloseLocalSemaphore';
+FUNCTION _EnterCritSec : LONGINT; CDecl; EXTERNAL CLib NAME 'EnterCritSec';
+FUNCTION _ExitCritSec : LONGINT; CDecl; EXTERNAL CLib NAME 'ExitCritSec';
 
 
-FUNCTION _SetThreadGroupID (id : longint) : longint; CDecl; EXTERNAL ThreadsNlm NAME 'SetThreadGroupID';
-FUNCTION _GetThreadGroupID : longint; CDecl; EXTERNAL ThreadsNlm NAME 'GetThreadGroupID';
+FUNCTION _SetThreadGroupID (id : longint) : longint; CDecl; EXTERNAL CLib NAME 'SetThreadGroupID';
+FUNCTION _GetThreadGroupID : longint; CDecl; EXTERNAL CLib NAME 'GetThreadGroupID';
 
 CONST _SIGTERM = 6;
 
@@ -340,7 +335,13 @@ PROCEDURE _Signal (Sig : longint; SigFunc : pointer);  CDECL; EXTERNAL Clib NAME
 
 {
   $Log$
-  Revision 1.8  2003-02-16 17:46:11  armin
+  Revision 1.9  2003-03-25 18:17:54  armin
+  * support for fcl, support for linking without debug info
+  * renamed winsock2 to winsock for win32 compatinility
+  * new sockets unit for netware
+  * changes for compiler warnings
+
+  Revision 1.8  2003/02/16 17:46:11  armin
   * typo fixed
 
   Revision 1.7  2002/09/07 16:01:20  peter

+ 34 - 0
rtl/netware/prelude.as

@@ -23,11 +23,15 @@
 # it sets up the argc and argv and calls _nlm_main (in system.pp)
 # This version uses the old _SetupArgv and not the newer _SetupArvV_411
 #
+    .globl	_pas_Start_
 _pasStart_:
     pushl	$_nlm_main
     call	_SetupArgv
     addl	$4,%esp
     ret
+# this is a hack to avoid that FPC_NW_CHECKFUNCTION will be
+# eleminated by the linker (with smartlinking)
+    call	FPC_NW_CHECKFUNCTION
 
 
 #
@@ -43,6 +47,7 @@ _Prelude:
    	pushl	%ebx
      	movl	0x14(%ebp),%edi
      	movl	0x18(%ebp),%esi
+       	movl	%esi, __uninitializedDataSize
      	movl	0x1c(%ebp),%ebx
      	movl	0x20(%ebp),%ecx
      	movl	0x28(%ebp),%eax
@@ -97,3 +102,32 @@ _Stop:
 _NLMID:
 	.long	0
 
+.text
+.globl	__getTextStart
+__getTextStart:
+    movl    $.text,%eax
+    ret	
+    
+.text
+.globl	__getDataStart
+__getDataStart:
+    movl    $.data,%eax
+    ret
+
+.text
+.globl	__getBssStart
+__getBssStart:
+    movl    $.bss,%eax
+    ret
+    
+.data 
+  __uninitializedDataSize:	.long
+    
+
+
+.text
+.globl  __getUninitializedDataSize
+__getUninitializedDataSize:
+    movl   __uninitializedDataSize, %eax
+    ret
+

+ 8 - 1
rtl/netware/sockets.pp

@@ -12,6 +12,7 @@
 
  **********************************************************************}
 {$mode objfpc}
+{$R-}
 unit Sockets;
 
 Interface
@@ -260,7 +261,13 @@ finalization
 end.
 {
   $Log$
-  Revision 1.3  2003-03-23 17:47:15  armin
+  Revision 1.4  2003-03-25 18:17:54  armin
+  * support for fcl, support for linking without debug info
+  * renamed winsock2 to winsock for win32 compatinility
+  * new sockets unit for netware
+  * changes for compiler warnings
+
+  Revision 1.3  2003/03/23 17:47:15  armin
   * CloseSocket added
 
   Revision 1.10  2003/01/01 14:34:22  peter

+ 19 - 3
rtl/netware/system.pp

@@ -76,6 +76,7 @@ VAR
    ArgV   : ppchar;
    NetwareCheckFunction    : TNWCheckFunction;
    NetwareMainThreadGroupID: longint;
+   NetwareCodeStartAddress : dword;
 
 CONST
    envp   : ppchar = nil;   {dummy to make heaptrc happy}
@@ -140,9 +141,17 @@ procedure fpc_do_exit;external name 'FPC_DO_EXIT';
                          Startup
 *****************************************************************************}
 
+    function __GetBssStart : pointer; external name '__getBssStart';
+    function __getUninitializedDataSize : longint; external name '__getUninitializedDataSize';
+    //function __getDataStart : longint; external name '__getDataStart';
+    function __GetTextStart : longint; external name '__getTextStart';
 
 PROCEDURE nlm_main (_ArgC : LONGINT; _ArgV : ppchar); CDECL; [public,alias: '_nlm_main'];
 BEGIN
+  // Initialize BSS
+  if __getUninitializedDataSize > 0 then
+    fillchar (__getBssStart^,__getUninitializedDataSize,0);
+  NetwareCodeStartAddress := __GetTextStart;
   ArgC := _ArgC;
   ArgV := _ArgV;
   fpc_threadvar_relocate_proc := nil;
@@ -168,7 +177,7 @@ begin
   if not SigTermHandlerActive then
   begin
     if ExitCode <> 0 Then   { otherwise we dont see runtime-errors }
-      PressAnyKeyToContinue;
+      _SetAutoScreenDestructionMode (false);
 
     _exit (ExitCode);
   end;
@@ -790,10 +799,11 @@ Begin
 { Setup heap }
   InitHeap;
   SysInitExceptions;
-  SysInitStdIO;
 
 { Reset IO Error }
   InOutRes:=0;
+  
+  SysInitStdIO;  
 
 {Delphi Compatible}
   IsLibrary := FALSE;
@@ -805,7 +815,13 @@ Begin
 End.
 {
   $Log$
-  Revision 1.16  2003-02-15 19:12:54  armin
+  Revision 1.17  2003-03-25 18:17:54  armin
+  * support for fcl, support for linking without debug info
+  * renamed winsock2 to winsock for win32 compatinility
+  * new sockets unit for netware
+  * changes for compiler warnings
+
+  Revision 1.16  2003/02/15 19:12:54  armin
   * changes for new threadvar support
 
   Revision 1.15  2002/10/13 09:28:45  florian

+ 110 - 42
rtl/netware/winsock2.pp → rtl/netware/winsock.pp

@@ -4,7 +4,7 @@
     This unit contains the declarations for the WinSock2
     Socket Library for Netware and Win32
 
-    Copyright (c) 1999-2002 by the Free Pascal development team
+    Copyright (c) 1999-2003 by the Free Pascal development team
 
     See the file COPYING.FPC, included in this distribution,
     for details about the copyright.
@@ -19,18 +19,22 @@
  **********************************************************************}
 
 {$PACKRECORDS 1}
-unit winsock2;
-{$ifndef VER0_99_14}
-{$ifndef NO_SMART_LINK}
-{$define support_smartlink}
-{$endif}
-{$endif}
+{$R-}
 
+unit winsock;
+{ ifndef VER0_99_14}
+{ ifndef NO_SMART_LINK}
+{ define support_smartlink}
+{ endif}
+{ endif}
 
-{$ifdef support_smartlink}
-{$smartlink on}
-{$endif}
 
+{ ifdef support_smartlink}
+{ smartlink on}
+{ endif}
+
+{$smartlink off}  {for now, there seems to be a problem with fpc or the linker !}
+{$mode objfpc}
 
   interface
 
@@ -259,17 +263,20 @@ unit winsock2;
        PInAddr = ^TInAddr;
 
        sockaddr_in = record
-          sin_family : SmallInt;                        (* 2 byte *)
           case integer of
              0 : ( (* equals to sockaddr_in, size is 16 byte *)
-                  sin_port : u_short;                   (* 2 byte *)
-                  sin_addr : TInAddr;                   (* 4 byte *)
-                  sin_zero : array[0..8-1] of char;     (* 8 byte *)
+	          sin_family : SmallInt;                      (* 2 byte *)
+                  sin_port : u_short;                         (* 2 byte *)
+                  sin_addr : TInAddr;                         (* 4 byte *)
+                  sin_zero : array[0..7] of char;             (* 8 byte *)
                  );
              1 : ( (* equals to sockaddr, size is 16 byte *)
-                  sin_data : array[0..14-1] of char;    (* 14 byte *)
+	          sa_family : SmallInt;                       (* 2 byte *)
+                  sa_data : array[0..13] of char;             (* 14 byte *)
                  );
+	
          end;
+         
        TSockAddrIn = sockaddr_in;
        PSockAddrIn = ^TSockAddrIn;
        TSockAddr = sockaddr_in;
@@ -332,7 +339,7 @@ unit winsock2;
        taken from the BSD file sys/socket.h.
     }
     const
-       INVALID_SOCKET = longint(not(1));
+       INVALID_SOCKET = u_long(not(1));
        SOCKET_ERROR = -1;
        SOCK_STREAM = 1;
        SOCK_DGRAM = 2;
@@ -1856,7 +1863,7 @@ unit winsock2;
     function accept(s:TSocket; addr: PSockAddr; var addrlen : tOS_INT) : TSocket;stdcall;external winsockdll name 'accept';
     {$endif}
     function bind(s:TSocket; addr: PSockaddr;namelen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name _fn_Bind;
-    function bind(s:TSocket; const addr: TSockaddr;namelen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name _fn_Bind;
+    function bind(s:TSocket; var addr: TSockaddr;namelen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name _fn_Bind;
     function closesocket(s:TSocket):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name _fn_closesocket;
     {$ifdef netware}
     function connect(s:TSocket; addr:PSockAddr; namelen:tOS_INT):tOS_INT;
@@ -1888,16 +1895,19 @@ unit winsock2;
     function recv(s:TSocket;buf:pchar; len:tOS_INT; flags:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name _fn_recv;
     function recv(s:TSocket;var buf; len:tOS_INT; flags:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name _fn_recv;
     function recvfrom(s:TSocket;buf:pchar; len:tOS_INT; flags:tOS_INT;from:PSockAddr; fromlen:ptOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif} external winsockdll name _fn_recvfrom;
-    function recvfrom(s:TSocket;var buf; len:tOS_INT; flags:tOS_INT;Const from:TSockAddr; var fromlen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif} external winsockdll name _fn_recvfrom;
+    function recvfrom(s:TSocket;var buf; len:tOS_INT; flags:tOS_INT;var from:TSockAddr; var fromlen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif} external winsockdll name _fn_recvfrom;
     function select(nfds:tOS_INT; readfds,writefds,exceptfds : PFDSet;timeout: PTimeVal):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
       external winsockdll name _fn_select;
-    function send(s:TSocket;Const buf; len:tOS_INT; flags:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
+    function send(s:TSocket;const buf; len:tOS_INT; flags:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
       external winsockdll name _fn_send;
-    function sendto(s:TSocket; buf:pchar; len:tOS_INT; flags:tOS_INT;Const toaddr:TSockAddr; tolen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
+    function sendto(s:TSocket; buf:pchar; len:tOS_INT; flags:tOS_INT;var toaddr:TSockAddr; tolen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
       external winsockdll name _fn_sendto;
+    function sendto(s:TSocket; const buf; len:tOS_INT; flags:tOS_INT;var toaddr:TSockAddr; tolen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
+      external winsockdll name _fn_sendto;  
+      
     function setsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; optval:pchar; optlen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
       external winsockdll name _fn_setsockopt;
-    function setsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; Const optval; optlen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
+    function setsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; var optval; optlen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
       external winsockdll name _fn_setsockopt;
     function setsockopt(s:TSocket; level:tOS_INT; optname:tOS_INT; optval:pointer; optlen:tOS_INT):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
       external winsockdll name _fn_setsockopt;
@@ -1916,9 +1926,8 @@ unit winsock2;
     function getprotobyname(name:pchar):PProtoEnt;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name _fn_getprotobyname;
 
     { Microsoft Windows Extension function prototypes  }
-    function WSAStartup(wVersionRequired:word;var WSAData:TWSADATA):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
-      external winsockdll name 'WSAStartup';
-    function WSACleanup:tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name 'WSACleanup';
+    function WSAStartup(wVersionRequired:word;var WSAData:TWSADATA):tOS_INT;
+    function WSACleanup:tOS_INT;
     procedure WSASetLastError(iError:tOS_INT);{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name 'WSASetLastError';
     function WSAGetLastError:tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name 'WSAGetLastError';
     {$ifndef netware}
@@ -1952,6 +1961,11 @@ unit winsock2;
       external winsockdll name '__WSAFDIsSet';
     function __WSAFDIsSet_(s:TSocket; var FDSet:TFDSet):tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
       external winsockdll name '__WSAFDIsSet';
+
+    function FD_ISSET(s:TSocket; var FDSet:TFDSet):Bool;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}
+      external winsockdll name '__WSAFDIsSet';
+
+
     {$ifndef netware}
     function TransmitFile(hSocket:TSocket; hFile:THandle; nNumberOfBytesToWrite:dword;
                           nNumberOfBytesPerSend:DWORD; lpOverlapped:POverlapped;
@@ -1978,7 +1992,7 @@ unit winsock2;
     function WSAGetSelectEvent(Param:dword):Word;
     function WSAGetSelectError(Param:dword):Word;
     procedure FD_CLR(Socket:TSocket; var FDSet:TFDSet);
-    function FD_ISSET(Socket:TSocket; var FDSet:TFDSet):Boolean;
+    {function FD_ISSET(Socket:TSocket; var FDSet:TFDSet):Boolean;}
     procedure FD_SET(Socket:TSocket; var FDSet:TFDSet);
     procedure FD_ZERO(var FDSet:TFDSet);
 
@@ -2321,31 +2335,36 @@ unit winsock2;
            end;
       end;
 
-    function FD_ISSET(Socket:TSocket; var FDSet:TFDSet):Boolean;
-
-      begin
-         FD_ISSET:=__WSAFDIsSet(Socket,FDSet);
-      end;
+    {function FD_ISSET(Socket:TSocket; var FDSet:TFDSet):Boolean;
+    begin
+       FD_ISSET:=__WSAFDIsSet(Socket,FDSet);
+    end;}
 
     procedure FD_SET(Socket:TSocket; var FDSet:TFDSet);
-
+    var i : integer;
+    begin
+      if FDSet.fd_count > FD_SETSIZE then
+        FDSet.fd_count := FD_SETSIZE;
+      for i := 1 to FDSet.fd_count do
+        if FDSet.fd_array[i-1] = Socket then exit;  {this is what the c macro FD_SET does}
+      if FDSet.fd_count<FD_SETSIZE then
       begin
-         if FDSet.fd_count<FD_SETSIZE then
-           begin
-              FDSet.fd_array[FDSet.fd_count]:=Socket;
-              Inc(FDSet.fd_count);
-           end;
+        FDSet.fd_array[FDSet.fd_count]:=Socket;
+        Inc(FDSet.fd_count);
       end;
+    end;
 
     procedure FD_ZERO(var FDSet:TFDSet);
-
-      begin
-         FDSet.fd_count:=0;
-      end;
+    var i : integer;
+    begin
+      for i := 0 to high (FDSet.fd_array) do
+        FDSet.fd_array[i] := INVALID_SOCKET;
+      FDSet.fd_count:=0;
+    end;
 
     {$ifdef netware}
       {windows has connect and accept in ws2_32.dll, netware has not, they
-       are defines as macros in ws2nlm.h}
+       are defined as macros in ws2nlm.h }
     function connect(s:TSocket; addr:PSockAddr; namelen:tOS_INT):tOS_INT;
     begin
       connect := WSAConnect (s,addr,namelen,nil,nil,nil,nil);
@@ -2369,8 +2388,57 @@ unit winsock2;
 
     {$endif}
 
+    {AD 2003/03/25: Special for netware
+     if WSAStartup is called more than once, bad thinks will happen
+     on netware. This is not a problem under windows.
+     This happens with fcl because the unit initialization of SSockets and
+     resolve both calls WSAStartup, for the second startup we simply
+     return success without calling the WS2_32 WSAStartup }
+
+    function __WSAStartup(wVersionRequired:word;var WSAData:TWSADATA):tOS_INT;
+    {$ifdef Netware}cdecl;{$else}stdcall;{$endif}
+      external winsockdll name 'WSAStartup';
+
+    function __WSACleanup:tOS_INT;{$ifdef Netware}cdecl;{$else}stdcall;{$endif}external winsockdll name 'WSACleanup';
+
+    var WSAstartupData : TWSADATA;
+
+    function WSACleanup:tOS_INT;
+    begin
+      if WSAstartupData.wVersion <> $ffff then
+      begin
+        Result := __WSACleanup;
+        if Result = 0 then WSAstartupData.wVersion := $ffff;
+      end else Result := WSANOTINITIALISED;
+    end;
+
+    function WSAStartup(wVersionRequired:word;var WSAData:TWSADATA):tOS_INT;
+    begin
+      if WSAstartupData.wVersion = $ffff then
+      begin
+        Result := __WSAStartup(wVersionRequired,WSAData);
+        if Result = 0 then WSAstartupData := WSAData;
+        Writeln (stderr,'WSAStartup called');
+      end else
+      begin
+        result := 0;
+        Writeln (stderr,'WSAStartup should be called only once !');
+      end;
+    end;
+
+
+initialization
+  WSAstartupData.wVersion := $ffff;
+finalization
+  WSACleanUp;
 end.
 {
-  $Log:
+  $Log$
+  Revision 1.1  2003-03-25 18:17:54  armin
+  * support for fcl, support for linking without debug info
+  * renamed winsock2 to winsock for win32 compatinility
+  * new sockets unit for netware
+  * changes for compiler warnings
+
 
 }