1 #include "syshdrs.h"
2 
3 #if !defined(NO_UNIX_DOMAIN_SOCKETS) && !defined(NO_SIGNALS)
4 
5 extern volatile Sjmp_buf gNetTimeoutJmp;
6 extern volatile Sjmp_buf gPipeJmp;
7 
8 int
9 USendto(int sfd, const char *const buf, size_t size, int fl, const struct sockaddr_un *const toAddr, int ualen, int tlen)
10 {
11 	int nwrote, tleft;
12 	vsio_sigproc_t sigalrm, sigpipe;
13 	time_t done, now;
14 
15 	if (SSetjmp(gNetTimeoutJmp) != 0) {
16 		alarm(0);
17 		(void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
18 		(void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
19 		errno = ETIMEDOUT;
20 		return (kTimeoutErr);
21 	}
22 
23 	if (SSetjmp(gPipeJmp) != 0) {
24 		alarm(0);
25 		(void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
26 		(void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
27 		errno = EPIPE;
28 		return (kBrokenPipeErr);
29 	}
30 
31 	sigalrm = (vsio_sigproc_t) SSignal(SIGALRM, SIOHandler);
32 	sigpipe = (vsio_sigproc_t) SSignal(SIGPIPE, SIOHandler);
33 
34 	time(&now);
35 	done = now + tlen;
36 	tleft = (int) (done - now);
37 	forever {
38 		(void) alarm((unsigned int) tleft);
39 		nwrote = sendto(sfd, buf, size, fl,
40 			(struct sockaddr *) toAddr, ualen);
41 		(void) alarm(0);
42 		if (nwrote >= 0)
43 			break;
44 		if (errno != EINTR)
45 			break;		/* Fatal error. */
46 		errno = 0;
47 		time(&now);
48 		tleft = (int) (done - now);
49 		if (tleft < 1) {
50 			nwrote = kTimeoutErr;
51 			errno = ETIMEDOUT;
52 			break;
53 		}
54 	}
55 
56 	(void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
57 	(void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
58 
59 	return (nwrote);
60 }	/* USendto */
61 
62 #endif
63 
64