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