Index: socket.c =================================================================== --- socket.c (revision 148690) +++ socket.c (working copy) @@ -73,6 +73,7 @@ extern fd_set *__gnat_new_socket_set (fd extern void __gnat_remove_socket_from_set (fd_set *, int); extern void __gnat_reset_socket_set (fd_set *); extern int __gnat_get_h_errno (void); +extern int __gnat_socket_ioctl (int, int, int *); #if defined (__vxworks) || defined (_WIN32) extern int __gnat_inet_pton (int, const char *, void *); #endif @@ -409,6 +410,17 @@ __gnat_get_h_errno (void) { #endif } +/* Wrapper for ioctl(2), which is a variadic function */ + +int +__gnat_socket_ioctl (int fd, int req, int *arg) { +#if defined (_WIN32) + return ioctlsocket (fd, req, arg); +#else + return ioctl (fd, req, arg); +#endif +} + #ifndef HAVE_INET_PTON #ifdef VMS Index: g-socthi-vms.adb =================================================================== --- g-socthi-vms.adb (revision 148690) +++ g-socthi-vms.adb (working copy) @@ -74,12 +74,6 @@ package body GNAT.Sockets.Thin is Namelen : C.int) return C.int; pragma Import (C, Syscall_Connect, "connect"); - function Syscall_Ioctl - (S : C.int; - Req : C.int; - Arg : access C.int) return C.int; - pragma Import (C, Syscall_Ioctl, "ioctl"); - function Syscall_Recv (S : C.int; Msg : System.Address; @@ -153,11 +147,11 @@ package body GNAT.Sockets.Thin is and then R /= Failure then -- A socket inherits the properties of its server, especially - -- the FIONBIO flag. Do not use C_Ioctl as this subprogram + -- the FIONBIO flag. Do not use Socket_Ioctl as this subprogram -- tracks sockets set in non-blocking mode by user. Set_Non_Blocking_Socket (R, Non_Blocking_Socket (S)); - Discard := Syscall_Ioctl (R, SOSC.FIONBIO, Val'Access); + Discard := C_Ioctl (R, SOSC.FIONBIO, Val'Access); end if; return R; @@ -220,26 +214,24 @@ package body GNAT.Sockets.Thin is end if; end C_Connect; - ------------- - -- C_Ioctl -- - ------------- + ------------------ + -- Socket_Ioctl -- + ------------------ - function C_Ioctl + function Socket_Ioctl (S : C.int; Req : C.int; Arg : access C.int) return C.int is begin - if not SOSC.Thread_Blocking_IO - and then Req = SOSC.FIONBIO - then + if not SOSC.Thread_Blocking_IO and then Req = SOSC.FIONBIO then if Arg.all /= 0 then Set_Non_Blocking_Socket (S, True); end if; end if; - return Syscall_Ioctl (S, Req, Arg); - end C_Ioctl; + return C_Ioctl (S, Req, Arg); + end Socket_Ioctl; ------------ -- C_Recv -- @@ -405,10 +397,10 @@ package body GNAT.Sockets.Thin is if not SOSC.Thread_Blocking_IO and then R /= Failure then - -- Do not use C_Ioctl as this subprogram tracks sockets set + -- Do not use Socket_Ioctl as this subprogram tracks sockets set -- in non-blocking mode by user. - Discard := Syscall_Ioctl (R, SOSC.FIONBIO, Val'Access); + Discard := C_Ioctl (R, SOSC.FIONBIO, Val'Access); Set_Non_Blocking_Socket (R, False); end if; Index: g-socthi-vms.ads =================================================================== --- g-socthi-vms.ads (revision 148690) +++ g-socthi-vms.ads (working copy) @@ -123,10 +123,10 @@ package GNAT.Sockets.Thin is Optval : System.Address; Optlen : not null access C.int) return C.int; - function C_Ioctl - (S : C.int; - Req : C.int; - Arg : access C.int) return C.int; + function Socket_Ioctl + (S : C.int; + Req : C.int; + Arg : access C.int) return C.int; function C_Listen (S : C.int; Index: g-socthi-vxworks.adb =================================================================== --- g-socthi-vxworks.adb (revision 148690) +++ g-socthi-vxworks.adb (working copy) @@ -80,12 +80,6 @@ package body GNAT.Sockets.Thin is Namelen : C.int) return C.int; pragma Import (C, Syscall_Connect, "connect"); - function Syscall_Ioctl - (S : C.int; - Req : C.int; - Arg : access C.int) return C.int; - pragma Import (C, Syscall_Ioctl, "ioctl"); - function Syscall_Recv (S : C.int; Msg : System.Address; @@ -161,11 +155,11 @@ package body GNAT.Sockets.Thin is and then R /= Failure then -- A socket inherits the properties of its server especially - -- the FIONBIO flag. Do not use C_Ioctl as this subprogram + -- the FIONBIO flag. Do not use Socket_Ioctl as this subprogram -- tracks sockets set in non-blocking mode by user. Set_Non_Blocking_Socket (R, Non_Blocking_Socket (S)); - Res := Syscall_Ioctl (R, SOSC.FIONBIO, Val'Access); + Res := C_Ioctl (R, SOSC.FIONBIO, Val'Access); -- Is it OK to ignore result ??? end if; @@ -230,26 +224,24 @@ package body GNAT.Sockets.Thin is end if; end C_Connect; - ------------- - -- C_Ioctl -- - ------------- - - function C_Ioctl - (S : C.int; - Req : C.int; - Arg : access C.int) return C.int + ------------------ + -- Socket_Ioctl -- + ------------------ + + function Socket_Ioctl + (S : C.int; + Req : C.int; + Arg : access C.int) return C.int is begin - if not SOSC.Thread_Blocking_IO - and then Req = SOSC.FIONBIO - then + if not SOSC.Thread_Blocking_IO and then Req = SOSC.FIONBIO then if Arg.all /= 0 then Set_Non_Blocking_Socket (S, True); end if; end if; - return Syscall_Ioctl (S, Req, Arg); - end C_Ioctl; + return C_Ioctl (S, Req, Arg); + end Socket_Ioctl; ------------ -- C_Recv -- @@ -399,10 +391,10 @@ package body GNAT.Sockets.Thin is if not SOSC.Thread_Blocking_IO and then R /= Failure then - -- Do not use C_Ioctl as this subprogram tracks sockets set + -- Do not use Socket_Ioctl as this subprogram tracks sockets set -- in non-blocking mode by user. - Res := Syscall_Ioctl (R, SOSC.FIONBIO, Val'Access); + Res := C_Ioctl (R, SOSC.FIONBIO, Val'Access); -- Is it OK to ignore result ??? Set_Non_Blocking_Socket (R, False); end if; Index: g-socthi-vxworks.ads =================================================================== --- g-socthi-vxworks.ads (revision 148690) +++ g-socthi-vxworks.ads (working copy) @@ -121,10 +121,10 @@ package GNAT.Sockets.Thin is Optval : System.Address; Optlen : not null access C.int) return C.int; - function C_Ioctl - (S : C.int; - Req : C.int; - Arg : access C.int) return C.int; + function Socket_Ioctl + (S : C.int; + Req : C.int; + Arg : access C.int) return C.int; function C_Listen (S : C.int; Index: g-socthi-mingw.adb =================================================================== --- g-socthi-mingw.adb (revision 148690) +++ g-socthi-mingw.adb (working copy) @@ -247,6 +247,19 @@ package body GNAT.Sockets.Thin is return Res; end C_Connect; + ------------------ + -- Socket_Ioctl -- + ------------------ + + function Socket_Ioctl + (S : C.int; + Req : C.int; + Arg : access C.int) return C.int + is + begin + return C_Ioctl (S, Req, Arg); + end Socket_Ioctl; + --------------- -- C_Recvmsg -- --------------- Index: g-socthi-mingw.ads =================================================================== --- g-socthi-mingw.ads (revision 148690) +++ g-socthi-mingw.ads (working copy) @@ -120,10 +120,10 @@ package GNAT.Sockets.Thin is Optval : System.Address; Optlen : not null access C.int) return C.int; - function C_Ioctl - (S : C.int; - Req : C.int; - Arg : access C.int) return C.int; + function Socket_Ioctl + (S : C.int; + Req : C.int; + Arg : access C.int) return C.int; function C_Listen (S : C.int; @@ -234,7 +234,6 @@ private pragma Import (Stdcall, C_Getpeername, "getpeername"); pragma Import (Stdcall, C_Getsockname, "getsockname"); pragma Import (Stdcall, C_Getsockopt, "getsockopt"); - pragma Import (Stdcall, C_Ioctl, "ioctlsocket"); pragma Import (Stdcall, C_Listen, "listen"); pragma Import (Stdcall, C_Recv, "recv"); pragma Import (Stdcall, C_Recvfrom, "recvfrom"); Index: g-socthi.adb =================================================================== --- g-socthi.adb (revision 148690) +++ g-socthi.adb (working copy) @@ -76,12 +76,6 @@ package body GNAT.Sockets.Thin is Namelen : C.int) return C.int; pragma Import (C, Syscall_Connect, "connect"); - function Syscall_Ioctl - (S : C.int; - Req : C.int; - Arg : access C.int) return C.int; - pragma Import (C, Syscall_Ioctl, "ioctl"); - function Syscall_Recv (S : C.int; Msg : System.Address; @@ -165,11 +159,11 @@ package body GNAT.Sockets.Thin is and then R /= Failure then -- A socket inherits the properties ot its server especially - -- the FIONBIO flag. Do not use C_Ioctl as this subprogram + -- the FIONBIO flag. Do not use Socket_Ioctl as this subprogram -- tracks sockets set in non-blocking mode by user. Set_Non_Blocking_Socket (R, Non_Blocking_Socket (S)); - Discard := Syscall_Ioctl (R, SOSC.FIONBIO, Val'Access); + Discard := C_Ioctl (R, SOSC.FIONBIO, Val'Access); end if; Disable_SIGPIPE (R); @@ -235,26 +229,24 @@ package body GNAT.Sockets.Thin is end if; end C_Connect; - ------------- - -- C_Ioctl -- - ------------- + ------------------ + -- Socket_Ioctl -- + ------------------ - function C_Ioctl + function Socket_Ioctl (S : C.int; Req : C.int; Arg : access C.int) return C.int is begin - if not SOSC.Thread_Blocking_IO - and then Req = SOSC.FIONBIO - then + if not SOSC.Thread_Blocking_IO and then Req = SOSC.FIONBIO then if Arg.all /= 0 then Set_Non_Blocking_Socket (S, True); end if; end if; - return Syscall_Ioctl (S, Req, Arg); - end C_Ioctl; + return C_Ioctl (S, Req, Arg); + end Socket_Ioctl; ------------ -- C_Recv -- @@ -404,10 +396,10 @@ package body GNAT.Sockets.Thin is if not SOSC.Thread_Blocking_IO and then R /= Failure then - -- Do not use C_Ioctl as this subprogram tracks sockets set + -- Do not use Socket_Ioctl as this subprogram tracks sockets set -- in non-blocking mode by user. - Discard := Syscall_Ioctl (R, SOSC.FIONBIO, Val'Access); + Discard := C_Ioctl (R, SOSC.FIONBIO, Val'Access); Set_Non_Blocking_Socket (R, False); end if; Disable_SIGPIPE (R); Index: g-socthi.ads =================================================================== --- g-socthi.ads (revision 148690) +++ g-socthi.ads (working copy) @@ -122,10 +122,10 @@ package GNAT.Sockets.Thin is Optval : System.Address; Optlen : not null access C.int) return C.int; - function C_Ioctl - (S : C.int; - Req : C.int; - Arg : access C.int) return C.int; + function Socket_Ioctl + (S : C.int; + Req : C.int; + Arg : access C.int) return C.int; function C_Listen (S : C.int; Index: g-socket.adb =================================================================== --- g-socket.adb (revision 148690) +++ g-socket.adb (working copy) @@ -707,10 +707,8 @@ package body GNAT.Sockets is null; end case; - Res := C_Ioctl - (C.int (Socket), - Requests (Request.Name), - Arg'Unchecked_Access); + Res := Socket_Ioctl + (C.int (Socket), Requests (Request.Name), Arg'Unchecked_Access); if Res = Failure then Raise_Socket_Error (Socket_Errno); Index: g-sothco.ads =================================================================== --- g-sothco.ads (revision 148690) +++ g-sothco.ads (working copy) @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 2008, AdaCore -- +-- Copyright (C) 2008-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- -- @@ -321,6 +321,11 @@ package GNAT.Sockets.Thin_Common is Cp : C.Strings.chars_ptr; Inp : System.Address) return C.int; + function C_Ioctl + (Fd : C.int; + Req : C.int; + Arg : access C.int) return C.int; + private pragma Import (C, Get_Socket_From_Set, "__gnat_get_socket_from_set"); pragma Import (C, Is_Socket_In_Set, "__gnat_is_socket_in_set"); @@ -328,5 +333,6 @@ private pragma Import (C, Insert_Socket_In_Set, "__gnat_insert_socket_in_set"); pragma Import (C, Remove_Socket_From_Set, "__gnat_remove_socket_from_set"); pragma Import (C, Reset_Socket_Set, "__gnat_reset_socket_set"); + pragma Import (C, C_Ioctl, "__gnat_socket_ioctl"); pragma Import (C, Inet_Pton, SOSC.Inet_Pton_Linkname); end GNAT.Sockets.Thin_Common;