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 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