4 extern volatile Sjmp_buf gNetTimeoutJmp
;
5 extern volatile Sjmp_buf gPipeJmp
;
11 SRecvfrom(int sfd
, char *const buf
, size_t size
, int fl
, struct sockaddr_in
*const fromAddr
, int tlen
)
14 vsio_sigproc_t sigalrm
, sigpipe
;
18 if (SSetjmp(gNetTimeoutJmp
) != 0) {
20 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
21 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
26 if (SSetjmp(gPipeJmp
) != 0) {
28 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
29 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
31 return (kBrokenPipeErr
);
34 sigalrm
= (vsio_sigproc_t
) SSignal(SIGALRM
, SIOHandler
);
35 sigpipe
= (vsio_sigproc_t
) SSignal(SIGPIPE
, SIOHandler
);
39 tleft
= (int) (done
- now
);
41 alen
= sizeof(struct sockaddr_in
);
42 (void) alarm((unsigned int) tleft
);
43 nread
= recvfrom(sfd
, buf
, size
, fl
,
44 (struct sockaddr
*) fromAddr
, &alen
);
49 break; /* Fatal error. */
52 tleft
= (int) (done
- now
);
60 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
61 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
69 SRecvfrom(int sfd
, char *const buf
, size_t size
, int fl
, struct sockaddr_in
*const fromAddr
, int tlen
)
80 tleft
= (int) (done
- now
);
83 alen
= sizeof(struct sockaddr_in
);
91 result
= select(sfd
+ 1, SELECT_TYPE_ARG234
&ss
, NULL
, NULL
, SELECT_TYPE_ARG5
&tv
);
95 } else if (result
== 0) {
100 } else if (errno
!= EINTR
) {
105 nread
= recvfrom(sfd
, buf
, size
, fl
,
106 (struct sockaddr
*) fromAddr
, &alen
);
111 break; /* Fatal error. */
114 tleft
= (int) (done
- now
);