3 #if !defined(NO_UNIX_DOMAIN_SOCKETS) && !defined(NO_SIGNALS)
5 extern volatile Sjmp_buf gNetTimeoutJmp
;
6 extern volatile Sjmp_buf gPipeJmp
;
9 URecvfrom(int sfd
, char *const buf
, size_t size
, int fl
, struct sockaddr_un
*const fromAddr
, int *ualen
, int tlen
)
12 vsio_sigproc_t sigalrm
, sigpipe
;
15 if (SSetjmp(gNetTimeoutJmp
) != 0) {
17 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
18 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
23 if (SSetjmp(gPipeJmp
) != 0) {
25 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
26 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
28 return (kBrokenPipeErr
);
31 sigalrm
= (vsio_sigproc_t
) SSignal(SIGALRM
, SIOHandler
);
32 sigpipe
= (vsio_sigproc_t
) SSignal(SIGPIPE
, SIOHandler
);
36 tleft
= (int) (done
- now
);
38 *ualen
= sizeof(struct sockaddr_un
);
39 (void) alarm((unsigned int) tleft
);
40 nread
= recvfrom(sfd
, buf
, size
, fl
,
41 (struct sockaddr
*) fromAddr
, ualen
);
46 break; /* Fatal error. */
49 tleft
= (int) (done
- now
);
57 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
58 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);