Browse Source

AmigaOS4: Added socket/networking support

git-svn-id: trunk@33599 -
marcus 9 years ago
parent
commit
6df2120266

+ 0 - 4
packages/fcl-net/fpmake.pp

@@ -43,8 +43,6 @@ begin
     // IP and Sockets
     T:=P.Targets.AddUnit('netdb.pp',AllUnixOSes);
     T:=P.Targets.AddUnit('resolve.pp',AllUnixOSes+AllWindowsOSes+AllAmigaLikeOSes+[OS2,EMX]);
-      if Defaults.CPU=powerpc then
-        T.OSes:=T.OSes-[amiga];
       with T.Dependencies do
         begin
           AddInclude('resolve.inc');
@@ -52,8 +50,6 @@ begin
         end;
     T.ResourceStrings := True;
     T:=P.Targets.AddUnit('ssockets.pp',AllUnixOSes+AllWindowsOSes+AllAmigaLikeOSes+[OS2,EMX]);
-      if Defaults.CPU=powerpc then
-        T.OSes:=T.OSes-[amiga];
       with T.Dependencies do
         begin
           AddUnit('resolve');

+ 18 - 2
packages/fcl-net/src/amiga/resolve.inc

@@ -47,7 +47,7 @@ Type
   PServEntry = ^TServEnt;
 
 { C style calls, linked in from Libc }
-
+{$ifdef AMIGA68k}
 function gethostbyname(Name: PChar location 'a0'): PHostEntry; syscall SocketBase 210;
 function getnetbyname(Name: PChar location 'a0'): PNetEntry; syscall SocketBase 222;
 function getnetbyaddr(Net: Longint location 'd0'; NetType: Longint location 'd1'): PNetEntry; syscall SocketBase 228;
@@ -60,6 +60,22 @@ function getnetent: PNetEntry; syscall SocketBase 528;
 procedure setservent(StayOpen: longint location 'd0'); syscall SocketBase 552;
 procedure endservent; syscall SocketBase 558;
 function getservent: PServEntry; syscall SocketBase 564;
+{$endif}
+
+{$ifdef AMIGAOS4}
+function gethostbyname(const Name: PChar): PHostEntry; syscall ISocket 196;
+function getnetbyname(Name: PChar): PNetEntry; syscall ISocket 204;
+function getnetbyaddr(Net: Longint; NetType: Longint): PNetEntry; syscall ISocket 208;
+function getservbyname(Name: PChar; Protocol: PChar): PServEntry; syscall ISocket 212;
+function getservbyport(Port: LongInt; Protocol: PChar): PServEntry; syscall ISocket 216;
+
+procedure setnetent(Stayopen: Longint);  syscall ISocket 456;
+procedure endnetent; syscall ISocket 460;
+function getnetent: PNetEntry; syscall ISocket 464;
+procedure setservent(StayOpen: longint); syscall ISocket 480;
+procedure endservent; syscall ISocket 484;
+function getservent: PServEntry; syscall ISocket 488;
+{$endif}
 
 function gethostbyaddr(Addr: PChar; Len: Longint; HType: Longint): PHostentry;
 var
@@ -78,7 +94,7 @@ begin
       repeat
         ip^^ := ntohl(ip^^);
         Inc(IP);
-      until ip^ = nil; 
+      until ip^ = nil;
     end;
   end;
 end;

+ 11 - 10
packages/rtl-extra/fpmake.pp

@@ -7,11 +7,11 @@ uses fpmkunit;
 
 procedure add_rtl_extra(const ADirectory: string);
 
-Const 
+Const
   // All Unices have full set of KVM+Crt in unix/ except QNX which is not
   // in workable state atm.
   UnixLikes = AllUnixOSes -[QNX]; // qnx never was active in 2.x afaik
- 
+
   // Android has a dummy clocale unit, while it also includes unix dir.
   ClocaleOSes   = UnixLikes -[beos];
   CLocaleIncOSes= [Aix,freebsd,netbsd,openbsd,solaris,darwin,iphonesim,dragonfly];
@@ -23,14 +23,14 @@ Const
   PrinterOSes   = [go32v2,msdos,os2,win32,win64]+unixlikes-[beos,haiku,morphos];
   SerialOSes    = [android,linux,netbsd,openbsd,win32,win64];
   UComplexOSes  = [amiga,aros,emx,gba,go32v2,morphos,msdos,nativent,nds,netware,netwlibc,os2,watcom,wii,wince,win32,win64]+UnixLikes;
-  MatrixOSes	= [amiga,aros,emx,gba,go32v2,morphos,msdos,nativent,nds,netware,netwlibc,os2,wii,win32,win64,wince]+UnixLikes;
+  MatrixOSes  = [amiga,aros,emx,gba,go32v2,morphos,msdos,nativent,nds,netware,netwlibc,os2,wii,win32,win64,wince]+UnixLikes;
   ObjectsOSes   = [amiga,aros,emx,gba,go32v2,morphos,msdos,nds,netware,netwlibc,os2,win32,win64,wince]+UnixLikes;
   WinsockOSes   = [win32,win64,wince,os2,emx,netware,netwlibc];
   WinSock2OSes  = [win32,win64,wince];
   SocketsOSes   = UnixLikes+AllAmigaLikeOSes+[netware,netwlibc,os2,wince,win32,win64];
   Socksyscall   = [beos,freebsd,haiku,linux,netbsd,openbsd,dragonfly];
-  Socklibc	= unixlikes-socksyscall;
-  gpmOSes	= [Linux,Android];
+  Socklibc  = unixlikes-socksyscall;
+  gpmOSes = [Linux,Android];
   AllTargetsextra = ObjectsOSes + UComplexOSes + MatrixOSes+
                       SerialOSes +PrinterOSes+SocketsOSes+gpmOSes;
 
@@ -54,7 +54,10 @@ begin
     P.NeedLibC:= false;
     P.Dependencies.Add('morphunits',[morphos]);
     P.Dependencies.Add('arosunits',[aros]);
-    P.Dependencies.Add('amunits',[amiga]);
+    if Defaults.CPU=m68k then
+      P.Dependencies.Add('amunits',[amiga]);
+    if Defaults.CPU=powerpc then
+      P.Dependencies.Add('os4units',[amiga]);
 
     P.SourcePath.Add('src/inc');
     P.SourcePath.Add('src/$(OS)');
@@ -106,8 +109,6 @@ begin
 
     T:=P.Targets.AddUnit('serial.pp',SerialOSes);
     T:=P.Targets.AddUnit('sockets.pp',SocketsOSes);
-    if Defaults.CPU=powerpc then
-      T.OSes:=T.OSes-[amiga];
     with T.Dependencies do
      begin
        addinclude('osdefs.inc',AllUnixOSes);
@@ -118,7 +119,7 @@ begin
        addinclude('unxsockh.inc',UnixLikes);
        addinclude('stdsock.inc',socklibc);
        addinclude('unixsock.inc',socksyscall);
-     end; 
+     end;
 
     T:=P.Targets.AddUnit('ipc.pp',IPCOSes);
     with T.Dependencies do
@@ -136,7 +137,7 @@ begin
      end;
   end
 end;
- 
+
 {$ifndef ALLPACKAGES}
 begin
   add_rtl_extra('');

+ 51 - 7
packages/rtl-extra/src/amiga/sockets.pp

@@ -86,7 +86,7 @@ const
   SOL_SOCKET    = $FFFF;
 
 const
-  EsockEINTR            = 4; // EsysEINTR;   
+  EsockEINTR            = 4; // EsysEINTR;
   EsockEBADF            = 9; // EsysEBADF;
   EsockEFAULT           = 14; // EsysEFAULT;
   EsockEINVAL           = 22; //EsysEINVAL;
@@ -109,7 +109,7 @@ Function Accept(Sock:longint;var addr:string;var SockIn,SockOut:File):Boolean;
 //function  fpaccept      (s:cint; addrx : psockaddr; addrlen : psocklen):cint; maybelibc
 //function  fpbind      (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;  maybelibc
 //function  fpconnect     (s:cint; name  : psockaddr; namelen : tsocklen):cint;  maybelibc
-
+{$ifdef AMIGA68k}
 threadvar
   SocketBase: PLibrary;
 
@@ -134,14 +134,48 @@ function bsd_inet_addr(const cp: PChar location 'a0'): LongWord; syscall SocketB
 function bsd_gethostbyname(const Name: PChar location 'a0'): PHostEnt; syscall SocketBase 210;
 function bsd_gethostbyaddr(const Addr: PByte location 'a0'; Len: LongInt location 'd0'; Type_: LongInt location 'd1'): PHostEnt; syscall SocketBase 216;
 
-{ Definition for Release(CopyOf)Socket unique id }
-const
-  UNIQUE_ID = -1;
-
 { Amiga-specific functions for passing socket descriptors between threads (processes) }
 function ObtainSocket(id: LongInt location 'd0'; domain: LongInt location 'd1'; _type: LongInt location 'd2'; protocol: LongInt location 'd3'): LongInt; syscall SocketBase 144;
 function ReleaseSocket(s: LongInt location 'd0'; id: LongInt location 'd1'): LongInt; syscall SocketBase 150;
 function ReleaseCopyOfSocket(s: LongInt location 'd0'; id: LongInt location 'd1'): LongInt; syscall SocketBase 156;
+{$endif}
+
+{$ifdef AMIGAOS4}
+var
+  SocketBase: PLibrary;
+  ISocket: PInterface;
+
+function bsd_socket(Domain: LongInt; Type_: LongInt; Protocol: LongInt): LongInt; syscall ISocket 76;
+function bsd_bind(s: LongInt; const name: PSockAddr; NameLen: LongInt): LongInt; syscall ISocket 80;
+function bsd_listen(s: LongInt; BackLog: LongInt): LongInt; syscall ISocket 84;
+function bsd_accept(s: LongInt; Addr: PSockaddr; AddrLen: PSockLen): LongInt; syscall ISocket 88;
+function bsd_connect(s : LongInt; const Name: PSockaddr; NameLen: LongInt): LongInt; syscall ISocket 92;
+function bsd_sendto(s: LongInt; const Msg: PChar; Len: LongInt; Flags: LongInt; const To_: PSockaddr; ToLen: LongInt): LongInt; syscall ISocket 96;
+function bsd_send(s: LongInt; const msg: PChar; Len: LongInt; Flags: LongInt): LongInt; syscall ISocket 100;
+function bsd_recvfrom(s: LongInt; Buf: PChar; Len: LongInt; Flags: LongInt; From: PSockaddr; FromLen: PSockLen): LongInt; syscall ISocket 104;
+function bsd_recv(s: LongInt; buf: PChar; Len: LongInt; Flags: LongInt): LongInt; syscall ISocket 108;
+function bsd_shutdown(s: LongInt; How: LongInt): LongInt; syscall ISocket 112;
+function bsd_setsockopt(s: LongInt; level: LongInt; optname: LongInt; const optval: Pointer; optlen: LongInt) : LongInt; syscall ISocket 116;
+function bsd_getsockopt(s: LongInt; Level: LongInt; OptName: LongInt; OptVal: Pointer; OptLen: PSockLen): LongInt; syscall ISocket 120;
+function bsd_getsockname(s: LongInt; HostName: PSockaddr; NameLen: PSockLen): LongInt; syscall ISocket 124;
+function bsd_getpeername(s: LongInt; HostName: PSockaddr; NameLen: PSockLen): LongInt; syscall ISocket 128;
+function bsd_closesocket(s: LongInt): LongInt; syscall ISocket 136;
+function bsd_Errno: LongInt; syscall ISocket 164;
+function bsd_inet_ntoa(in_: LongWord): PChar; syscall ISocket 172;
+function bsd_inet_addr(const cp: PChar): LongWord; syscall ISocket 176;
+function bsd_gethostbyname(const Name: PChar): PHostEnt; syscall ISocket 196;
+function bsd_gethostbyaddr(const Addr: PByte; Len: LongInt; Type_: LongInt): PHostEnt; syscall ISocket 200;
+
+{ Amiga-specific functions for passing socket descriptors between threads (processes) }
+function ObtainSocket(id: LongInt; domain: LongInt; _type: LongInt; protocol: LongInt): LongInt; syscall ISocket 152;
+function ReleaseSocket(s: LongInt; id: LongInt): LongInt; syscall ISocket 156;
+function ReleaseCopyOfSocket(s: LongInt; id: LongInt): LongInt; syscall ISocket 160;
+{$endif}
+
+
+{ Definition for Release(CopyOf)Socket unique id }
+const
+  UNIQUE_ID = -1;
 
 Implementation
 
@@ -173,7 +207,7 @@ end;
 function fpaccept(s: cint; addrx: PSockaddr; Addrlen: PSocklen): cint;
 begin
   fpaccept := bsd_accept(s,addrx,addrlen);
-  internal_socketerror := fpgeterrno; 
+  internal_socketerror := fpgeterrno;
 end;
 
 function fpbind(s:cint; addrx: psockaddr; addrlen: tsocklen): cint;
@@ -277,6 +311,10 @@ begin
   SysDebugLn('FPC Sockets: Opening bsdsocket.library...');
 {$ENDIF}
   SocketBase:=OpenLibrary('bsdsocket.library', BSDSOCKET_LIBRARY_VER);
+  {$ifdef AMIGAOS4}
+  if Assigned(SocketBase) then
+    ISocket := GetInterface(SocketBase, 'main', 1, nil);
+  {$endif}
 {$IFDEF SOCKETS_DEBUG}
   if SocketBase = nil then
     SysDebugLn('FPC Sockets: FAILED to open bsdsocket.library.')
@@ -287,6 +325,10 @@ end;
 
 procedure BSDSocketClose;
 begin
+  {$ifdef AMIGAOS4}
+  if Assigned(ISocket) then
+    DropInterface(ISocket);
+  {$endif}
   if (SocketBase<>NIL) then CloseLibrary(SocketBase);
   SocketBase:=NIL;
 {$IFDEF SOCKETS_DEBUG}
@@ -295,8 +337,10 @@ begin
 end;
 
 initialization
+  {$ifdef AMIGA68K}
   AddThreadInitProc(@BSDSocketOpen);
   AddThreadExitProc(@BSDSocketClose);
+  {$endif}
   BSDSocketOpen;
 
 finalization