annotate gcc/ada/libgnat/g-socthi__vxworks.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- G N A T . S O C K E T S . T H I N --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 2002-2018, AdaCore --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 -- This package provides a target dependent thin interface to the sockets
kono
parents:
diff changeset
33 -- layer for use by the GNAT.Sockets package (g-socket.ads). This package
kono
parents:
diff changeset
34 -- should not be directly with'ed by an applications program.
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 -- This version is for VxWorks
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 with GNAT.OS_Lib; use GNAT.OS_Lib;
kono
parents:
diff changeset
39 with GNAT.Task_Lock;
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 with Interfaces.C; use Interfaces.C;
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 package body GNAT.Sockets.Thin is
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 Non_Blocking_Sockets : aliased Fd_Set;
kono
parents:
diff changeset
46 -- When this package is initialized with Process_Blocking_IO set
kono
parents:
diff changeset
47 -- to True, sockets are set in non-blocking mode to avoid blocking
kono
parents:
diff changeset
48 -- the whole process when a thread wants to perform a blocking IO
kono
parents:
diff changeset
49 -- operation. But the user can also set a socket in non-blocking
kono
parents:
diff changeset
50 -- mode by purpose. In order to make a difference between these
kono
parents:
diff changeset
51 -- two situations, we track the origin of non-blocking mode in
kono
parents:
diff changeset
52 -- Non_Blocking_Sockets. If S is in Non_Blocking_Sockets, it has
kono
parents:
diff changeset
53 -- been set in non-blocking mode by the user.
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 Quantum : constant Duration := 0.2;
kono
parents:
diff changeset
56 -- When SOSC.Thread_Blocking_IO is False, we set sockets in
kono
parents:
diff changeset
57 -- non-blocking mode and we spend a period of time Quantum between
kono
parents:
diff changeset
58 -- two attempts on a blocking operation.
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 -----------------------
kono
parents:
diff changeset
61 -- Local Subprograms --
kono
parents:
diff changeset
62 -----------------------
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 -- All these require comments ???
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 function Syscall_Accept
kono
parents:
diff changeset
67 (S : C.int;
kono
parents:
diff changeset
68 Addr : System.Address;
kono
parents:
diff changeset
69 Addrlen : not null access C.int) return C.int;
kono
parents:
diff changeset
70 pragma Import (C, Syscall_Accept, "accept");
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 function Syscall_Connect
kono
parents:
diff changeset
73 (S : C.int;
kono
parents:
diff changeset
74 Name : System.Address;
kono
parents:
diff changeset
75 Namelen : C.int) return C.int;
kono
parents:
diff changeset
76 pragma Import (C, Syscall_Connect, "connect");
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 function Syscall_Recv
kono
parents:
diff changeset
79 (S : C.int;
kono
parents:
diff changeset
80 Msg : System.Address;
kono
parents:
diff changeset
81 Len : C.int;
kono
parents:
diff changeset
82 Flags : C.int) return C.int;
kono
parents:
diff changeset
83 pragma Import (C, Syscall_Recv, "recv");
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 function Syscall_Recvfrom
kono
parents:
diff changeset
86 (S : C.int;
kono
parents:
diff changeset
87 Msg : System.Address;
kono
parents:
diff changeset
88 Len : C.int;
kono
parents:
diff changeset
89 Flags : C.int;
kono
parents:
diff changeset
90 From : System.Address;
kono
parents:
diff changeset
91 Fromlen : not null access C.int) return C.int;
kono
parents:
diff changeset
92 pragma Import (C, Syscall_Recvfrom, "recvfrom");
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 function Syscall_Recvmsg
kono
parents:
diff changeset
95 (S : C.int;
kono
parents:
diff changeset
96 Msg : System.Address;
kono
parents:
diff changeset
97 Flags : C.int) return C.int;
kono
parents:
diff changeset
98 pragma Import (C, Syscall_Recvmsg, "recvmsg");
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 function Syscall_Sendmsg
kono
parents:
diff changeset
101 (S : C.int;
kono
parents:
diff changeset
102 Msg : System.Address;
kono
parents:
diff changeset
103 Flags : C.int) return C.int;
kono
parents:
diff changeset
104 pragma Import (C, Syscall_Sendmsg, "sendmsg");
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 function Syscall_Send
kono
parents:
diff changeset
107 (S : C.int;
kono
parents:
diff changeset
108 Msg : System.Address;
kono
parents:
diff changeset
109 Len : C.int;
kono
parents:
diff changeset
110 Flags : C.int) return C.int;
kono
parents:
diff changeset
111 pragma Import (C, Syscall_Send, "send");
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 function Syscall_Sendto
kono
parents:
diff changeset
114 (S : C.int;
kono
parents:
diff changeset
115 Msg : System.Address;
kono
parents:
diff changeset
116 Len : C.int;
kono
parents:
diff changeset
117 Flags : C.int;
kono
parents:
diff changeset
118 To : System.Address;
kono
parents:
diff changeset
119 Tolen : C.int) return C.int;
kono
parents:
diff changeset
120 pragma Import (C, Syscall_Sendto, "sendto");
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 function Syscall_Socket
kono
parents:
diff changeset
123 (Domain : C.int;
kono
parents:
diff changeset
124 Typ : C.int;
kono
parents:
diff changeset
125 Protocol : C.int) return C.int;
kono
parents:
diff changeset
126 pragma Import (C, Syscall_Socket, "socket");
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 function Non_Blocking_Socket (S : C.int) return Boolean;
kono
parents:
diff changeset
129 procedure Set_Non_Blocking_Socket (S : C.int; V : Boolean);
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 --------------
kono
parents:
diff changeset
132 -- C_Accept --
kono
parents:
diff changeset
133 --------------
kono
parents:
diff changeset
134
kono
parents:
diff changeset
135 function C_Accept
kono
parents:
diff changeset
136 (S : C.int;
kono
parents:
diff changeset
137 Addr : System.Address;
kono
parents:
diff changeset
138 Addrlen : not null access C.int) return C.int
kono
parents:
diff changeset
139 is
kono
parents:
diff changeset
140 R : C.int;
kono
parents:
diff changeset
141 Val : aliased C.int := 1;
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 Res : C.int;
kono
parents:
diff changeset
144 pragma Unreferenced (Res);
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 begin
kono
parents:
diff changeset
147 loop
kono
parents:
diff changeset
148 R := Syscall_Accept (S, Addr, Addrlen);
kono
parents:
diff changeset
149 exit when SOSC.Thread_Blocking_IO
kono
parents:
diff changeset
150 or else R /= Failure
kono
parents:
diff changeset
151 or else Non_Blocking_Socket (S)
kono
parents:
diff changeset
152 or else Errno /= SOSC.EWOULDBLOCK;
kono
parents:
diff changeset
153 delay Quantum;
kono
parents:
diff changeset
154 end loop;
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 if not SOSC.Thread_Blocking_IO
kono
parents:
diff changeset
157 and then R /= Failure
kono
parents:
diff changeset
158 then
kono
parents:
diff changeset
159 -- A socket inherits the properties of its server especially
kono
parents:
diff changeset
160 -- the FIONBIO flag. Do not use Socket_Ioctl as this subprogram
kono
parents:
diff changeset
161 -- tracks sockets set in non-blocking mode by user.
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 Set_Non_Blocking_Socket (R, Non_Blocking_Socket (S));
kono
parents:
diff changeset
164 Res := C_Ioctl (R, SOSC.FIONBIO, Val'Access);
kono
parents:
diff changeset
165 -- Is it OK to ignore result ???
kono
parents:
diff changeset
166 end if;
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 return R;
kono
parents:
diff changeset
169 end C_Accept;
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 ---------------
kono
parents:
diff changeset
172 -- C_Connect --
kono
parents:
diff changeset
173 ---------------
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 function C_Connect
kono
parents:
diff changeset
176 (S : C.int;
kono
parents:
diff changeset
177 Name : System.Address;
kono
parents:
diff changeset
178 Namelen : C.int) return C.int
kono
parents:
diff changeset
179 is
kono
parents:
diff changeset
180 Res : C.int;
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 begin
kono
parents:
diff changeset
183 Res := Syscall_Connect (S, Name, Namelen);
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 if SOSC.Thread_Blocking_IO
kono
parents:
diff changeset
186 or else Res /= Failure
kono
parents:
diff changeset
187 or else Non_Blocking_Socket (S)
kono
parents:
diff changeset
188 or else Errno /= SOSC.EINPROGRESS
kono
parents:
diff changeset
189 then
kono
parents:
diff changeset
190 return Res;
kono
parents:
diff changeset
191 end if;
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 declare
kono
parents:
diff changeset
194 WSet : aliased Fd_Set;
kono
parents:
diff changeset
195 Now : aliased Timeval;
kono
parents:
diff changeset
196 begin
kono
parents:
diff changeset
197 Reset_Socket_Set (WSet'Access);
kono
parents:
diff changeset
198 loop
kono
parents:
diff changeset
199 Insert_Socket_In_Set (WSet'Access, S);
kono
parents:
diff changeset
200 Now := Immediat;
kono
parents:
diff changeset
201 Res := C_Select
kono
parents:
diff changeset
202 (S + 1,
kono
parents:
diff changeset
203 No_Fd_Set_Access,
kono
parents:
diff changeset
204 WSet'Access,
kono
parents:
diff changeset
205 No_Fd_Set_Access,
kono
parents:
diff changeset
206 Now'Unchecked_Access);
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 exit when Res > 0;
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 if Res = Failure then
kono
parents:
diff changeset
211 return Res;
kono
parents:
diff changeset
212 end if;
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 delay Quantum;
kono
parents:
diff changeset
215 end loop;
kono
parents:
diff changeset
216 end;
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 Res := Syscall_Connect (S, Name, Namelen);
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 if Res = Failure
kono
parents:
diff changeset
221 and then Errno = SOSC.EISCONN
kono
parents:
diff changeset
222 then
kono
parents:
diff changeset
223 return Thin_Common.Success;
kono
parents:
diff changeset
224 else
kono
parents:
diff changeset
225 return Res;
kono
parents:
diff changeset
226 end if;
kono
parents:
diff changeset
227 end C_Connect;
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 ------------------
kono
parents:
diff changeset
230 -- Socket_Ioctl --
kono
parents:
diff changeset
231 ------------------
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 function Socket_Ioctl
kono
parents:
diff changeset
234 (S : C.int;
kono
parents:
diff changeset
235 Req : SOSC.IOCTL_Req_T;
kono
parents:
diff changeset
236 Arg : access C.int) return C.int
kono
parents:
diff changeset
237 is
kono
parents:
diff changeset
238 begin
kono
parents:
diff changeset
239 if not SOSC.Thread_Blocking_IO and then Req = SOSC.FIONBIO then
kono
parents:
diff changeset
240 if Arg.all /= 0 then
kono
parents:
diff changeset
241 Set_Non_Blocking_Socket (S, True);
kono
parents:
diff changeset
242 end if;
kono
parents:
diff changeset
243 end if;
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 return C_Ioctl (S, Req, Arg);
kono
parents:
diff changeset
246 end Socket_Ioctl;
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 ------------
kono
parents:
diff changeset
249 -- C_Recv --
kono
parents:
diff changeset
250 ------------
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 function C_Recv
kono
parents:
diff changeset
253 (S : C.int;
kono
parents:
diff changeset
254 Msg : System.Address;
kono
parents:
diff changeset
255 Len : C.int;
kono
parents:
diff changeset
256 Flags : C.int) return C.int
kono
parents:
diff changeset
257 is
kono
parents:
diff changeset
258 Res : C.int;
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 begin
kono
parents:
diff changeset
261 loop
kono
parents:
diff changeset
262 Res := Syscall_Recv (S, Msg, Len, Flags);
kono
parents:
diff changeset
263 exit when SOSC.Thread_Blocking_IO
kono
parents:
diff changeset
264 or else Res /= Failure
kono
parents:
diff changeset
265 or else Non_Blocking_Socket (S)
kono
parents:
diff changeset
266 or else Errno /= SOSC.EWOULDBLOCK;
kono
parents:
diff changeset
267 delay Quantum;
kono
parents:
diff changeset
268 end loop;
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 return Res;
kono
parents:
diff changeset
271 end C_Recv;
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 ----------------
kono
parents:
diff changeset
274 -- C_Recvfrom --
kono
parents:
diff changeset
275 ----------------
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 function C_Recvfrom
kono
parents:
diff changeset
278 (S : C.int;
kono
parents:
diff changeset
279 Msg : System.Address;
kono
parents:
diff changeset
280 Len : C.int;
kono
parents:
diff changeset
281 Flags : C.int;
kono
parents:
diff changeset
282 From : System.Address;
kono
parents:
diff changeset
283 Fromlen : not null access C.int) return C.int
kono
parents:
diff changeset
284 is
kono
parents:
diff changeset
285 Res : C.int;
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 begin
kono
parents:
diff changeset
288 loop
kono
parents:
diff changeset
289 Res := Syscall_Recvfrom (S, Msg, Len, Flags, From, Fromlen);
kono
parents:
diff changeset
290 exit when SOSC.Thread_Blocking_IO
kono
parents:
diff changeset
291 or else Res /= Failure
kono
parents:
diff changeset
292 or else Non_Blocking_Socket (S)
kono
parents:
diff changeset
293 or else Errno /= SOSC.EWOULDBLOCK;
kono
parents:
diff changeset
294 delay Quantum;
kono
parents:
diff changeset
295 end loop;
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 return Res;
kono
parents:
diff changeset
298 end C_Recvfrom;
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 ---------------
kono
parents:
diff changeset
301 -- C_Recvmsg --
kono
parents:
diff changeset
302 ---------------
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 function C_Recvmsg
kono
parents:
diff changeset
305 (S : C.int;
kono
parents:
diff changeset
306 Msg : System.Address;
kono
parents:
diff changeset
307 Flags : C.int) return System.CRTL.ssize_t
kono
parents:
diff changeset
308 is
kono
parents:
diff changeset
309 Res : C.int;
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 begin
kono
parents:
diff changeset
312 loop
kono
parents:
diff changeset
313 Res := Syscall_Recvmsg (S, Msg, Flags);
kono
parents:
diff changeset
314 exit when SOSC.Thread_Blocking_IO
kono
parents:
diff changeset
315 or else Res /= Failure
kono
parents:
diff changeset
316 or else Non_Blocking_Socket (S)
kono
parents:
diff changeset
317 or else Errno /= SOSC.EWOULDBLOCK;
kono
parents:
diff changeset
318 delay Quantum;
kono
parents:
diff changeset
319 end loop;
kono
parents:
diff changeset
320
kono
parents:
diff changeset
321 return System.CRTL.ssize_t (Res);
kono
parents:
diff changeset
322 end C_Recvmsg;
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 ---------------
kono
parents:
diff changeset
325 -- C_Sendmsg --
kono
parents:
diff changeset
326 ---------------
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 function C_Sendmsg
kono
parents:
diff changeset
329 (S : C.int;
kono
parents:
diff changeset
330 Msg : System.Address;
kono
parents:
diff changeset
331 Flags : C.int) return System.CRTL.ssize_t
kono
parents:
diff changeset
332 is
kono
parents:
diff changeset
333 Res : C.int;
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 begin
kono
parents:
diff changeset
336 loop
kono
parents:
diff changeset
337 Res := Syscall_Sendmsg (S, Msg, Flags);
kono
parents:
diff changeset
338 exit when SOSC.Thread_Blocking_IO
kono
parents:
diff changeset
339 or else Res /= Failure
kono
parents:
diff changeset
340 or else Non_Blocking_Socket (S)
kono
parents:
diff changeset
341 or else Errno /= SOSC.EWOULDBLOCK;
kono
parents:
diff changeset
342 delay Quantum;
kono
parents:
diff changeset
343 end loop;
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 return System.CRTL.ssize_t (Res);
kono
parents:
diff changeset
346 end C_Sendmsg;
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 --------------
kono
parents:
diff changeset
349 -- C_Sendto --
kono
parents:
diff changeset
350 --------------
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 function C_Sendto
kono
parents:
diff changeset
353 (S : C.int;
kono
parents:
diff changeset
354 Msg : System.Address;
kono
parents:
diff changeset
355 Len : C.int;
kono
parents:
diff changeset
356 Flags : C.int;
kono
parents:
diff changeset
357 To : System.Address;
kono
parents:
diff changeset
358 Tolen : C.int) return C.int
kono
parents:
diff changeset
359 is
kono
parents:
diff changeset
360 use System;
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 Res : C.int;
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 begin
kono
parents:
diff changeset
365 loop
kono
parents:
diff changeset
366 if To = Null_Address then
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 -- In violation of the standard sockets API, VxWorks does not
kono
parents:
diff changeset
369 -- support sendto(2) calls on connected sockets with a null
kono
parents:
diff changeset
370 -- destination address, so use send(2) instead in that case.
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 Res := Syscall_Send (S, Msg, Len, Flags);
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 -- Normal case where destination address is non-null
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 else
kono
parents:
diff changeset
377 Res := Syscall_Sendto (S, Msg, Len, Flags, To, Tolen);
kono
parents:
diff changeset
378 end if;
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 exit when SOSC.Thread_Blocking_IO
kono
parents:
diff changeset
381 or else Res /= Failure
kono
parents:
diff changeset
382 or else Non_Blocking_Socket (S)
kono
parents:
diff changeset
383 or else Errno /= SOSC.EWOULDBLOCK;
kono
parents:
diff changeset
384 delay Quantum;
kono
parents:
diff changeset
385 end loop;
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 return Res;
kono
parents:
diff changeset
388 end C_Sendto;
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 --------------
kono
parents:
diff changeset
391 -- C_Socket --
kono
parents:
diff changeset
392 --------------
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 function C_Socket
kono
parents:
diff changeset
395 (Domain : C.int;
kono
parents:
diff changeset
396 Typ : C.int;
kono
parents:
diff changeset
397 Protocol : C.int) return C.int
kono
parents:
diff changeset
398 is
kono
parents:
diff changeset
399 R : C.int;
kono
parents:
diff changeset
400 Val : aliased C.int := 1;
kono
parents:
diff changeset
401
kono
parents:
diff changeset
402 Res : C.int;
kono
parents:
diff changeset
403 pragma Unreferenced (Res);
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 begin
kono
parents:
diff changeset
406 R := Syscall_Socket (Domain, Typ, Protocol);
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 if not SOSC.Thread_Blocking_IO
kono
parents:
diff changeset
409 and then R /= Failure
kono
parents:
diff changeset
410 then
kono
parents:
diff changeset
411 -- Do not use Socket_Ioctl as this subprogram tracks sockets set
kono
parents:
diff changeset
412 -- in non-blocking mode by user.
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 Res := C_Ioctl (R, SOSC.FIONBIO, Val'Access);
kono
parents:
diff changeset
415 -- Is it OK to ignore result ???
kono
parents:
diff changeset
416 Set_Non_Blocking_Socket (R, False);
kono
parents:
diff changeset
417 end if;
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 return R;
kono
parents:
diff changeset
420 end C_Socket;
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 --------------
kono
parents:
diff changeset
423 -- Finalize --
kono
parents:
diff changeset
424 --------------
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 procedure Finalize is
kono
parents:
diff changeset
427 begin
kono
parents:
diff changeset
428 null;
kono
parents:
diff changeset
429 end Finalize;
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 -------------------------
kono
parents:
diff changeset
432 -- Host_Error_Messages --
kono
parents:
diff changeset
433 -------------------------
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 package body Host_Error_Messages is separate;
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 ----------------
kono
parents:
diff changeset
438 -- Initialize --
kono
parents:
diff changeset
439 ----------------
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 procedure Initialize is
kono
parents:
diff changeset
442 begin
kono
parents:
diff changeset
443 Reset_Socket_Set (Non_Blocking_Sockets'Access);
kono
parents:
diff changeset
444 end Initialize;
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 -------------------------
kono
parents:
diff changeset
447 -- Non_Blocking_Socket --
kono
parents:
diff changeset
448 -------------------------
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 function Non_Blocking_Socket (S : C.int) return Boolean is
kono
parents:
diff changeset
451 R : Boolean;
kono
parents:
diff changeset
452 begin
kono
parents:
diff changeset
453 Task_Lock.Lock;
kono
parents:
diff changeset
454 R := (Is_Socket_In_Set (Non_Blocking_Sockets'Access, S) /= 0);
kono
parents:
diff changeset
455 Task_Lock.Unlock;
kono
parents:
diff changeset
456 return R;
kono
parents:
diff changeset
457 end Non_Blocking_Socket;
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 -----------------------------
kono
parents:
diff changeset
460 -- Set_Non_Blocking_Socket --
kono
parents:
diff changeset
461 -----------------------------
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 procedure Set_Non_Blocking_Socket (S : C.int; V : Boolean) is
kono
parents:
diff changeset
464 begin
kono
parents:
diff changeset
465 Task_Lock.Lock;
kono
parents:
diff changeset
466 if V then
kono
parents:
diff changeset
467 Insert_Socket_In_Set (Non_Blocking_Sockets'Access, S);
kono
parents:
diff changeset
468 else
kono
parents:
diff changeset
469 Remove_Socket_From_Set (Non_Blocking_Sockets'Access, S);
kono
parents:
diff changeset
470 end if;
kono
parents:
diff changeset
471
kono
parents:
diff changeset
472 Task_Lock.Unlock;
kono
parents:
diff changeset
473 end Set_Non_Blocking_Socket;
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 --------------------
kono
parents:
diff changeset
476 -- Signalling_Fds --
kono
parents:
diff changeset
477 --------------------
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 package body Signalling_Fds is separate;
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 --------------------------
kono
parents:
diff changeset
482 -- Socket_Error_Message --
kono
parents:
diff changeset
483 --------------------------
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 function Socket_Error_Message (Errno : Integer) return String is separate;
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 end GNAT.Sockets.Thin;