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