4 extern volatile Sjmp_buf gNetTimeoutJmp
;
5 extern volatile Sjmp_buf gPipeJmp
;
11 SSendtoByName(int sfd
, const char *const buf
, size_t size
, int fl
, const char *const toAddrStr
, int tlen
)
13 int nwrote
, tleft
, result
;
14 vsio_sigproc_t sigalrm
, sigpipe
;
16 struct sockaddr_in toAddr
;
18 if ((result
= AddrStrToAddr(toAddrStr
, &toAddr
, -1)) < 0) {
22 if (SSetjmp(gNetTimeoutJmp
) != 0) {
24 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
25 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
30 if (SSetjmp(gPipeJmp
) != 0) {
32 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
33 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
35 return (kBrokenPipeErr
);
38 sigalrm
= (vsio_sigproc_t
) SSignal(SIGALRM
, SIOHandler
);
39 sigpipe
= (vsio_sigproc_t
) SSignal(SIGPIPE
, SIOHandler
);
43 tleft
= (int) (done
- now
);
45 (void) alarm((unsigned int) tleft
);
46 nwrote
= sendto(sfd
, buf
, size
, fl
,
47 (struct sockaddr
*) &toAddr
,
48 (int) sizeof(struct sockaddr_in
));
53 break; /* Fatal error. */
56 tleft
= (int) (done
- now
);
64 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
65 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
73 SSendtoByName(int sfd
, const char *const buf
, size_t size
, int fl
, const char *const toAddrStr
, int tlen
)
80 struct sockaddr_in toAddr
;
82 if ((result
= AddrStrToAddr(toAddrStr
, &toAddr
, -1)) < 0) {
95 tleft
= (int) (done
- now
);
101 result
= select(sfd
+ 1, NULL
, SELECT_TYPE_ARG234
&ss
, NULL
, SELECT_TYPE_ARG5
&tv
);
105 } else if (result
== 0) {
108 return (kTimeoutErr
);
109 } else if (errno
!= EINTR
) {
115 nwrote
= sendto(sfd
, buf
, size
, fl
,
116 (struct sockaddr
*) &toAddr
,
117 (int) sizeof(struct sockaddr_in
));
122 break; /* Fatal error. */
133 SendtoByName(int sfd
, const char *const buf
, size_t size
, const char *const toAddrStr
)
136 struct sockaddr_in toAddr
;
138 if ((result
= AddrStrToAddr(toAddrStr
, &toAddr
, -1)) < 0) {
143 result
= sendto(sfd
, buf
, size
, 0,
144 (struct sockaddr
*) &toAddr
,
145 (int) sizeof(struct sockaddr_in
));
146 } while ((result
< 0) && (errno
== EINTR
));