320 |
|
if (rt == NULL) /* need to free up buffer? */ |
321 |
|
rt = raywait(rt0); |
322 |
|
if (rt == NULL) |
323 |
< |
error(SYSTEM, "raywait() returned NULL"); |
323 |
> |
error(SYSTEM, "raywait() returned NULL in raysamp()"); |
324 |
|
fp = rt->buf + 6*rt->nrays; |
325 |
|
*fp++ = org[0]; *fp++ = org[1]; *fp++ = org[2]; |
326 |
|
*fp++ = dir[0]; *fp++ = dir[1]; *fp = dir[2]; |
358 |
|
{ |
359 |
|
fd_set readset, errset; |
360 |
|
int nr; |
361 |
< |
struct rtproc *rt, *rtfree; |
361 |
> |
struct rtproc *rtfree; |
362 |
> |
register struct rtproc *rt; |
363 |
|
register int n; |
364 |
|
/* prepare select call */ |
365 |
|
FD_ZERO(&readset); FD_ZERO(&errset); n = 0; |
375 |
|
} |
376 |
|
if (!nr) /* no rays pending */ |
377 |
|
return(NULL); |
378 |
< |
if (nr > 1) /* call select for multiple processes */ |
379 |
< |
n = select(n, &readset, (fd_set *)NULL, &errset, |
380 |
< |
(struct timeval *)NULL); |
381 |
< |
else |
378 |
> |
if (nr > 1) { /* call select for multiple processes */ |
379 |
> |
errno = 0; |
380 |
> |
if (select(n, &readset, NULL, &errset, NULL) < 0) |
381 |
> |
error(SYSTEM, "select call error in raywait()"); |
382 |
> |
} else |
383 |
|
FD_ZERO(&errset); |
382 |
– |
if (n <= 0) |
383 |
– |
return(NULL); |
384 |
|
rtfree = NULL; /* read from ready process(es) */ |
385 |
|
for (rt = rt0; rt != NULL; rt = rt->next) { |
386 |
|
if (!FD_ISSET(rt->pd.r, &readset) && |
388 |
|
continue; |
389 |
|
for (n = 0; n < rt->bsiz && rt->dest[n] != NULL; n++) |
390 |
|
; |
391 |
< |
errno = 0; |
392 |
< |
nr = read(rt->pd.r, (char *)rt->buf, 3*sizeof(float)*(n+1)); |
393 |
< |
if (nr < 0) |
394 |
< |
error(SYSTEM, "read error in raywait()"); |
395 |
< |
if (nr == 0) /* unexpected EOF */ |
391 |
> |
nr = 3*sizeof(float)*(n+1); |
392 |
> |
if (readbuf(rt->pd.r, (char *)rt->buf, nr) < nr) |
393 |
|
error(USER, "rtrace process died"); |
397 |
– |
if (nr < 3*sizeof(float)*(n+1)) { /* read the rest */ |
398 |
– |
nr = readbuf(rt->pd.r, (char *)rt->buf, |
399 |
– |
3*sizeof(float)*(n+1) - nr); |
400 |
– |
if (nr < 0) |
401 |
– |
error(USER, "readbuf error in raywait()"); |
402 |
– |
} |
394 |
|
while (n-- > 0) { |
395 |
|
rt->dest[n][0] += rt->buf[3*n]; |
396 |
|
rt->dest[n][1] += rt->buf[3*n+1]; |