diff options
Diffstat (limited to 'gcc/ada/g-socthi-vxworks.adb')
-rw-r--r-- | gcc/ada/g-socthi-vxworks.adb | 70 |
1 files changed, 65 insertions, 5 deletions
diff --git a/gcc/ada/g-socthi-vxworks.adb b/gcc/ada/g-socthi-vxworks.adb index d035b61f807..a35e429fbb2 100644 --- a/gcc/ada/g-socthi-vxworks.adb +++ b/gcc/ada/g-socthi-vxworks.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2002-2008, AdaCore -- +-- Copyright (C) 2002-2009, AdaCore -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -98,16 +98,28 @@ package body GNAT.Sockets.Thin is Msg : System.Address; Len : C.int; Flags : C.int; - From : Sockaddr_In_Access; + From : System.Address; Fromlen : not null access C.int) return C.int; pragma Import (C, Syscall_Recvfrom, "recvfrom"); + function Syscall_Recvmsg + (S : C.int; + Msg : System.Address; + Flags : C.int) return C.int; + pragma Import (C, Syscall_Recvmsg, "recvmsg"); + + function Syscall_Sendmsg + (S : C.int; + Msg : System.Address; + Flags : C.int) return C.int; + pragma Import (C, Syscall_Sendmsg, "sendmsg"); + function Syscall_Sendto (S : C.int; Msg : System.Address; Len : C.int; Flags : C.int; - To : Sockaddr_In_Access; + To : System.Address; Tolen : C.int) return C.int; pragma Import (C, Syscall_Sendto, "sendto"); @@ -273,7 +285,7 @@ package body GNAT.Sockets.Thin is Msg : System.Address; Len : C.int; Flags : C.int; - From : Sockaddr_In_Access; + From : System.Address; Fromlen : not null access C.int) return C.int is Res : C.int; @@ -291,6 +303,54 @@ package body GNAT.Sockets.Thin is return Res; end C_Recvfrom; + --------------- + -- C_Recvmsg -- + --------------- + + function C_Recvmsg + (S : C.int; + Msg : System.Address; + Flags : C.int) return ssize_t + is + Res : C.int; + + begin + loop + Res := Syscall_Recvmsg (S, Msg, Flags); + exit when SOSC.Thread_Blocking_IO + or else Res /= Failure + or else Non_Blocking_Socket (S) + or else Errno /= SOSC.EWOULDBLOCK; + delay Quantum; + end loop; + + return ssize_t (Res); + end C_Recvmsg; + + --------------- + -- C_Sendmsg -- + --------------- + + function C_Sendmsg + (S : C.int; + Msg : System.Address; + Flags : C.int) return ssize_t + is + Res : C.int; + + begin + loop + Res := Syscall_Sendmsg (S, Msg, Flags); + exit when SOSC.Thread_Blocking_IO + or else Res /= Failure + or else Non_Blocking_Socket (S) + or else Errno /= SOSC.EWOULDBLOCK; + delay Quantum; + end loop; + + return ssize_t (Res); + end C_Sendmsg; + -------------- -- C_Sendto -- -------------- @@ -300,7 +360,7 @@ package body GNAT.Sockets.Thin is Msg : System.Address; Len : C.int; Flags : C.int; - To : Sockaddr_In_Access; + To : System.Address; Tolen : C.int) return C.int is Res : C.int; |