annotate gcc/ada/expect.c @ 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 RUN-TIME COMPONENTS *
kono
parents:
diff changeset
4 * *
kono
parents:
diff changeset
5 * E X P E C T *
kono
parents:
diff changeset
6 * *
kono
parents:
diff changeset
7 * C Implementation File *
kono
parents:
diff changeset
8 * *
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 * Copyright (C) 2001-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 #ifdef __alpha_vxworks
kono
parents:
diff changeset
33 #include "vxWorks.h"
kono
parents:
diff changeset
34 #endif
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 #ifdef IN_RTS
kono
parents:
diff changeset
37 #define POSIX
kono
parents:
diff changeset
38 #include "tconfig.h"
kono
parents:
diff changeset
39 #include "tsystem.h"
kono
parents:
diff changeset
40 #else
kono
parents:
diff changeset
41 #include "config.h"
kono
parents:
diff changeset
42 #include "system.h"
kono
parents:
diff changeset
43 #endif
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 #include <sys/types.h>
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 #ifdef __MINGW32__
kono
parents:
diff changeset
48 # if OLD_MINGW
kono
parents:
diff changeset
49 # include <sys/wait.h>
kono
parents:
diff changeset
50 # endif
kono
parents:
diff changeset
51 #elif defined (__vxworks) && defined (__RTP__)
kono
parents:
diff changeset
52 # include <wait.h>
kono
parents:
diff changeset
53 #elif defined (__Lynx__)
kono
parents:
diff changeset
54 /* ??? See comment in adaint.c. */
kono
parents:
diff changeset
55 # define GCC_RESOURCE_H
kono
parents:
diff changeset
56 # include <sys/wait.h>
kono
parents:
diff changeset
57 #elif defined (__PikeOS__)
kono
parents:
diff changeset
58 /* No wait.h available */
kono
parents:
diff changeset
59 #else
kono
parents:
diff changeset
60 #include <sys/wait.h>
kono
parents:
diff changeset
61 #endif
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 /* This file provides the low level functionalities needed to implement Expect
kono
parents:
diff changeset
64 capabilities in GNAT.Expect.
kono
parents:
diff changeset
65 Implementations for unix and windows systems is provided.
kono
parents:
diff changeset
66 Dummy stubs are also provided for other systems. */
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 #ifdef _AIX
kono
parents:
diff changeset
69 /* Work around the fact that gcc/cpp does not define "__unix__" under AiX. */
kono
parents:
diff changeset
70 #define __unix__
kono
parents:
diff changeset
71 #endif
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 #ifdef __APPLE__
kono
parents:
diff changeset
74 /* Work around the fact that gcc/cpp does not define "__unix__" on Darwin. */
kono
parents:
diff changeset
75 #define __unix__
kono
parents:
diff changeset
76 #endif
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 #ifdef _WIN32
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 #include <windows.h>
kono
parents:
diff changeset
81 #include <process.h>
kono
parents:
diff changeset
82 #include <signal.h>
kono
parents:
diff changeset
83 #include <io.h>
kono
parents:
diff changeset
84 #include "mingw32.h"
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 int
kono
parents:
diff changeset
87 __gnat_waitpid (int pid)
kono
parents:
diff changeset
88 {
kono
parents:
diff changeset
89 HANDLE h = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);
kono
parents:
diff changeset
90 DWORD exitcode = 1;
kono
parents:
diff changeset
91 DWORD res;
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 if (h != NULL)
kono
parents:
diff changeset
94 {
kono
parents:
diff changeset
95 res = WaitForSingleObject (h, INFINITE);
kono
parents:
diff changeset
96 GetExitCodeProcess (h, &exitcode);
kono
parents:
diff changeset
97 CloseHandle (h);
kono
parents:
diff changeset
98 }
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100 __gnat_win32_remove_handle (NULL, pid);
kono
parents:
diff changeset
101 return (int) exitcode;
kono
parents:
diff changeset
102 }
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 int
kono
parents:
diff changeset
105 __gnat_expect_fork (void)
kono
parents:
diff changeset
106 {
kono
parents:
diff changeset
107 return 0;
kono
parents:
diff changeset
108 }
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 void
kono
parents:
diff changeset
111 __gnat_expect_portable_execvp (int *pid, char *cmd, char *argv[])
kono
parents:
diff changeset
112 {
kono
parents:
diff changeset
113 *pid = __gnat_portable_no_block_spawn (argv);
kono
parents:
diff changeset
114 }
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 int
kono
parents:
diff changeset
117 __gnat_pipe (int *fd)
kono
parents:
diff changeset
118 {
kono
parents:
diff changeset
119 HANDLE read, write;
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 CreatePipe (&read, &write, NULL, 0);
kono
parents:
diff changeset
122 fd[0]=_open_osfhandle ((intptr_t)read, 0);
kono
parents:
diff changeset
123 fd[1]=_open_osfhandle ((intptr_t)write, 0);
kono
parents:
diff changeset
124 return 0; /* always success */
kono
parents:
diff changeset
125 }
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 int
kono
parents:
diff changeset
128 __gnat_expect_poll (int *fd,
kono
parents:
diff changeset
129 int num_fd,
kono
parents:
diff changeset
130 int timeout,
kono
parents:
diff changeset
131 int *dead_process,
kono
parents:
diff changeset
132 int *is_set)
kono
parents:
diff changeset
133 {
kono
parents:
diff changeset
134 #define MAX_DELAY 100
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 int i, delay, infinite = 0;
kono
parents:
diff changeset
137 DWORD avail;
kono
parents:
diff changeset
138 HANDLE handles[num_fd];
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 *dead_process = 0;
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 for (i = 0; i < num_fd; i++)
kono
parents:
diff changeset
143 is_set[i] = 0;
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 for (i = 0; i < num_fd; i++)
kono
parents:
diff changeset
146 handles[i] = (HANDLE) _get_osfhandle (fd [i]);
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 /* Start with small delays, and then increase them, to avoid polling too
kono
parents:
diff changeset
149 much when waiting a long time */
kono
parents:
diff changeset
150 delay = 5;
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 if (timeout < 0)
kono
parents:
diff changeset
153 infinite = 1;
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 while (1)
kono
parents:
diff changeset
156 {
kono
parents:
diff changeset
157 for (i = 0; i < num_fd; i++)
kono
parents:
diff changeset
158 {
kono
parents:
diff changeset
159 if (!PeekNamedPipe (handles [i], NULL, 0, NULL, &avail, NULL))
kono
parents:
diff changeset
160 {
kono
parents:
diff changeset
161 *dead_process = i + 1;
kono
parents:
diff changeset
162 return -1;
kono
parents:
diff changeset
163 }
kono
parents:
diff changeset
164 if (avail > 0)
kono
parents:
diff changeset
165 {
kono
parents:
diff changeset
166 is_set[i] = 1;
kono
parents:
diff changeset
167 return 1;
kono
parents:
diff changeset
168 }
kono
parents:
diff changeset
169 }
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 if (!infinite && timeout <= 0)
kono
parents:
diff changeset
172 return 0;
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 Sleep (delay);
kono
parents:
diff changeset
175 timeout -= delay;
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 if (delay < MAX_DELAY)
kono
parents:
diff changeset
178 delay += 10;
kono
parents:
diff changeset
179 }
kono
parents:
diff changeset
180 }
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 #elif defined (VMS)
kono
parents:
diff changeset
183 #include <unistd.h>
kono
parents:
diff changeset
184 #include <stdio.h>
kono
parents:
diff changeset
185 #include <unixio.h>
kono
parents:
diff changeset
186 #include <stdlib.h>
kono
parents:
diff changeset
187 #include <string.h>
kono
parents:
diff changeset
188 #include <vms/descrip.h>
kono
parents:
diff changeset
189 #include <stdio.h>
kono
parents:
diff changeset
190 #include <vms/stsdef.h>
kono
parents:
diff changeset
191 #include <vms/iodef.h>
kono
parents:
diff changeset
192 #include <signal.h>
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 int
kono
parents:
diff changeset
195 __gnat_waitpid (int pid)
kono
parents:
diff changeset
196 {
kono
parents:
diff changeset
197 int status = 0;
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 waitpid (pid, &status, 0);
kono
parents:
diff changeset
200 status = WEXITSTATUS (status);
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 return status;
kono
parents:
diff changeset
203 }
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 int
kono
parents:
diff changeset
206 __gnat_pipe (int *fd)
kono
parents:
diff changeset
207 {
kono
parents:
diff changeset
208 return pipe (fd);
kono
parents:
diff changeset
209 }
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 int
kono
parents:
diff changeset
212 __gnat_expect_fork (void)
kono
parents:
diff changeset
213 {
kono
parents:
diff changeset
214 return -1;
kono
parents:
diff changeset
215 }
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 void
kono
parents:
diff changeset
218 __gnat_expect_portable_execvp (int *pid, char *cmd, char *argv[])
kono
parents:
diff changeset
219 {
kono
parents:
diff changeset
220 *pid = (int) getpid ();
kono
parents:
diff changeset
221 /* Since cmd is fully qualified, it is incorrect to call execvp */
kono
parents:
diff changeset
222 execv (cmd, argv);
kono
parents:
diff changeset
223 _exit (1);
kono
parents:
diff changeset
224 }
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 int
kono
parents:
diff changeset
227 __gnat_expect_poll (int *fd,
kono
parents:
diff changeset
228 int num_fd,
kono
parents:
diff changeset
229 int timeout,
kono
parents:
diff changeset
230 int *dead_process,
kono
parents:
diff changeset
231 int *is_set)
kono
parents:
diff changeset
232 {
kono
parents:
diff changeset
233 int i, num, ready = 0;
kono
parents:
diff changeset
234 unsigned int status;
kono
parents:
diff changeset
235 int mbxchans [num_fd];
kono
parents:
diff changeset
236 struct dsc$descriptor_s mbxname;
kono
parents:
diff changeset
237 struct io_status_block {
kono
parents:
diff changeset
238 short int condition;
kono
parents:
diff changeset
239 short int count;
kono
parents:
diff changeset
240 int dev;
kono
parents:
diff changeset
241 } iosb;
kono
parents:
diff changeset
242 char buf [256];
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 *dead_process = 0;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 for (i = 0; i < num_fd; i++)
kono
parents:
diff changeset
247 is_set[i] = 0;
kono
parents:
diff changeset
248
kono
parents:
diff changeset
249 for (i = 0; i < num_fd; i++)
kono
parents:
diff changeset
250 {
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 /* Get name of the mailbox used in the pipe */
kono
parents:
diff changeset
253 getname (fd [i], buf);
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 /* Assign a channel to the mailbox */
kono
parents:
diff changeset
256 if (strlen (buf) > 0)
kono
parents:
diff changeset
257 {
kono
parents:
diff changeset
258 mbxname.dsc$w_length = strlen (buf);
kono
parents:
diff changeset
259 mbxname.dsc$b_dtype = DSC$K_DTYPE_T;
kono
parents:
diff changeset
260 mbxname.dsc$b_class = DSC$K_CLASS_S;
kono
parents:
diff changeset
261 mbxname.dsc$a_pointer = buf;
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 status = SYS$ASSIGN (&mbxname, &mbxchans[i], 0, 0, 0);
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 if ((status & 1) != 1)
kono
parents:
diff changeset
266 {
kono
parents:
diff changeset
267 ready = -1;
kono
parents:
diff changeset
268 dead_process = i + 1;
kono
parents:
diff changeset
269 return ready;
kono
parents:
diff changeset
270 }
kono
parents:
diff changeset
271 }
kono
parents:
diff changeset
272 }
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 num = timeout / 100;
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 while (1)
kono
parents:
diff changeset
277 {
kono
parents:
diff changeset
278 for (i = 0; i < num_fd; i++)
kono
parents:
diff changeset
279 {
kono
parents:
diff changeset
280 if (mbxchans[i] > 0)
kono
parents:
diff changeset
281 {
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 /* Peek in the mailbox to see if there's data */
kono
parents:
diff changeset
284 status = SYS$QIOW
kono
parents:
diff changeset
285 (0, mbxchans[i], IO$_SENSEMODE|IO$M_READERCHECK,
kono
parents:
diff changeset
286 &iosb, 0, 0, 0, 0, 0, 0, 0, 0);
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 if ((status & 1) != 1)
kono
parents:
diff changeset
289 {
kono
parents:
diff changeset
290 ready = -1;
kono
parents:
diff changeset
291 goto deassign;
kono
parents:
diff changeset
292 }
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 if (iosb.count > 0)
kono
parents:
diff changeset
295 {
kono
parents:
diff changeset
296 is_set[i] = 1;
kono
parents:
diff changeset
297 ready = 1;
kono
parents:
diff changeset
298 goto deassign;
kono
parents:
diff changeset
299 }
kono
parents:
diff changeset
300 }
kono
parents:
diff changeset
301 }
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 if (timeout > 0 && num == 0)
kono
parents:
diff changeset
304 {
kono
parents:
diff changeset
305 ready = 0;
kono
parents:
diff changeset
306 goto deassign;
kono
parents:
diff changeset
307 }
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 usleep (100000);
kono
parents:
diff changeset
310 num--;
kono
parents:
diff changeset
311 }
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 deassign:
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 /* Deassign channels assigned above */
kono
parents:
diff changeset
316 for (i = 0; i < num_fd; i++)
kono
parents:
diff changeset
317 {
kono
parents:
diff changeset
318 if (mbxchans[i] > 0)
kono
parents:
diff changeset
319 status = SYS$DASSGN (mbxchans[i]);
kono
parents:
diff changeset
320 }
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 return ready;
kono
parents:
diff changeset
323 }
kono
parents:
diff changeset
324 #elif defined (__unix__)
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 #ifdef __hpux__
kono
parents:
diff changeset
327 #include <sys/ptyio.h>
kono
parents:
diff changeset
328 #endif
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 #include <sys/time.h>
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 #ifndef NO_FD_SET
kono
parents:
diff changeset
333 #define SELECT_MASK fd_set
kono
parents:
diff changeset
334 #else /* !NO_FD_SET */
kono
parents:
diff changeset
335 #ifndef _AIX
kono
parents:
diff changeset
336 typedef long fd_mask;
kono
parents:
diff changeset
337 #endif /* _AIX */
kono
parents:
diff changeset
338 #ifdef _IBMR2
kono
parents:
diff changeset
339 #define SELECT_MASK void
kono
parents:
diff changeset
340 #else /* !_IBMR2 */
kono
parents:
diff changeset
341 #define SELECT_MASK int
kono
parents:
diff changeset
342 #endif /* !_IBMR2 */
kono
parents:
diff changeset
343 #endif /* !NO_FD_SET */
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 int
kono
parents:
diff changeset
346 __gnat_waitpid (int pid)
kono
parents:
diff changeset
347 {
kono
parents:
diff changeset
348 int status = 0;
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 waitpid (pid, &status, 0);
kono
parents:
diff changeset
351 status = WEXITSTATUS (status);
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 return status;
kono
parents:
diff changeset
354 }
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 int
kono
parents:
diff changeset
357 __gnat_pipe (int *fd)
kono
parents:
diff changeset
358 {
kono
parents:
diff changeset
359 return pipe (fd);
kono
parents:
diff changeset
360 }
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 int
kono
parents:
diff changeset
363 __gnat_expect_fork (void)
kono
parents:
diff changeset
364 {
kono
parents:
diff changeset
365 return fork ();
kono
parents:
diff changeset
366 }
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 void
kono
parents:
diff changeset
369 __gnat_expect_portable_execvp (int *pid, char *cmd, char *argv[])
kono
parents:
diff changeset
370 {
kono
parents:
diff changeset
371 *pid = (int) getpid ();
kono
parents:
diff changeset
372 /* Since cmd is fully qualified, it is incorrect to call execvp */
kono
parents:
diff changeset
373 execv (cmd, argv);
kono
parents:
diff changeset
374 _exit (1);
kono
parents:
diff changeset
375 }
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 int
kono
parents:
diff changeset
378 __gnat_expect_poll (int *fd,
kono
parents:
diff changeset
379 int num_fd,
kono
parents:
diff changeset
380 int timeout,
kono
parents:
diff changeset
381 int *dead_process,
kono
parents:
diff changeset
382 int *is_set)
kono
parents:
diff changeset
383 {
kono
parents:
diff changeset
384 struct timeval tv;
kono
parents:
diff changeset
385 SELECT_MASK rset;
kono
parents:
diff changeset
386 SELECT_MASK eset;
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 int max_fd = 0;
kono
parents:
diff changeset
389 int ready;
kono
parents:
diff changeset
390 int i;
kono
parents:
diff changeset
391 #ifdef __hpux__
kono
parents:
diff changeset
392 int received;
kono
parents:
diff changeset
393 #endif
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 *dead_process = 0;
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 tv.tv_sec = timeout / 1000;
kono
parents:
diff changeset
398 tv.tv_usec = (timeout % 1000) * 1000;
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 do {
kono
parents:
diff changeset
401 FD_ZERO (&rset);
kono
parents:
diff changeset
402 FD_ZERO (&eset);
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 for (i = 0; i < num_fd; i++)
kono
parents:
diff changeset
405 {
kono
parents:
diff changeset
406 FD_SET (fd[i], &rset);
kono
parents:
diff changeset
407 FD_SET (fd[i], &eset);
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 if (fd[i] > max_fd)
kono
parents:
diff changeset
410 max_fd = fd[i];
kono
parents:
diff changeset
411 }
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 ready =
kono
parents:
diff changeset
414 select (max_fd + 1, &rset, NULL, &eset, timeout == -1 ? NULL : &tv);
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 if (ready > 0)
kono
parents:
diff changeset
417 {
kono
parents:
diff changeset
418 #ifdef __hpux__
kono
parents:
diff changeset
419 received = 0;
kono
parents:
diff changeset
420 #endif
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 for (i = 0; i < num_fd; i++)
kono
parents:
diff changeset
423 {
kono
parents:
diff changeset
424 if (FD_ISSET (fd[i], &rset))
kono
parents:
diff changeset
425 {
kono
parents:
diff changeset
426 is_set[i] = 1;
kono
parents:
diff changeset
427 #ifdef __hpux__
kono
parents:
diff changeset
428 received = 1;
kono
parents:
diff changeset
429 #endif
kono
parents:
diff changeset
430 }
kono
parents:
diff changeset
431 else
kono
parents:
diff changeset
432 is_set[i] = 0;
kono
parents:
diff changeset
433 }
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 #ifdef __hpux__
kono
parents:
diff changeset
436 for (i = 0; i < num_fd; i++)
kono
parents:
diff changeset
437 {
kono
parents:
diff changeset
438 if (FD_ISSET (fd[i], &eset))
kono
parents:
diff changeset
439 {
kono
parents:
diff changeset
440 struct request_info ei;
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 /* Only query and reset error state if no file descriptor
kono
parents:
diff changeset
443 is ready to be read, otherwise we will be signalling a
kono
parents:
diff changeset
444 died process too early */
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 if (!received)
kono
parents:
diff changeset
447 {
kono
parents:
diff changeset
448 ioctl (fd[i], TIOCREQCHECK, &ei);
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 if (ei.request == TIOCCLOSE)
kono
parents:
diff changeset
451 {
kono
parents:
diff changeset
452 ioctl (fd[i], TIOCREQSET, &ei);
kono
parents:
diff changeset
453 dead_process = i + 1;
kono
parents:
diff changeset
454 return -1;
kono
parents:
diff changeset
455 }
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 ioctl (fd[i], TIOCREQSET, &ei);
kono
parents:
diff changeset
458 }
kono
parents:
diff changeset
459 ready--;
kono
parents:
diff changeset
460 }
kono
parents:
diff changeset
461 }
kono
parents:
diff changeset
462 #endif
kono
parents:
diff changeset
463 }
kono
parents:
diff changeset
464 } while (timeout == -1 && ready == 0);
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 return ready;
kono
parents:
diff changeset
467 }
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 #else
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 int
kono
parents:
diff changeset
472 __gnat_waitpid (int pid ATTRIBUTE_UNUSED, int sig ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
473 {
kono
parents:
diff changeset
474 return 0;
kono
parents:
diff changeset
475 }
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 int
kono
parents:
diff changeset
478 __gnat_pipe (int *fd ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
479 {
kono
parents:
diff changeset
480 return -1;
kono
parents:
diff changeset
481 }
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 int
kono
parents:
diff changeset
484 __gnat_expect_fork (void)
kono
parents:
diff changeset
485 {
kono
parents:
diff changeset
486 return -1;
kono
parents:
diff changeset
487 }
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 void
kono
parents:
diff changeset
490 __gnat_expect_portable_execvp (int *pid ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
491 char *cmd ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
492 char *argv[] ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
493 {
kono
parents:
diff changeset
494 *pid = 0;
kono
parents:
diff changeset
495 }
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 int
kono
parents:
diff changeset
498 __gnat_expect_poll (int *fd ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
499 int num_fd ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
500 int timeout ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
501 int *dead_process ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
502 int *is_set ATTRIBUTE_UNUSED)
kono
parents:
diff changeset
503 {
kono
parents:
diff changeset
504 *dead_process = 0;
kono
parents:
diff changeset
505 return -1;
kono
parents:
diff changeset
506 }
kono
parents:
diff changeset
507 #endif