4 extern volatile Sjmp_buf gNetTimeoutJmp
;
5 extern volatile Sjmp_buf gPipeJmp
;
11 SSendto(int sfd
, const char *const buf
, size_t size
, int fl
, const struct sockaddr_in
*const toAddr
, int tlen
)
14 vsio_sigproc_t sigalrm
, sigpipe
;
17 if (SSetjmp(gNetTimeoutJmp
) != 0) {
19 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
20 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
25 if (SSetjmp(gPipeJmp
) != 0) {
27 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
28 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
30 return (kBrokenPipeErr
);
33 sigalrm
= (vsio_sigproc_t
) SSignal(SIGALRM
, SIOHandler
);
34 sigpipe
= (vsio_sigproc_t
) SSignal(SIGPIPE
, SIOHandler
);
38 tleft
= (int) (done
- now
);
40 (void) alarm((unsigned int) tleft
);
41 nwrote
= sendto(sfd
, buf
, size
, fl
,
42 (struct sockaddr
*) toAddr
,
43 (int) sizeof(struct sockaddr_in
));
48 break; /* Fatal error. */
51 tleft
= (int) (done
- now
);
59 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
60 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
68 SSendto(int sfd
, const char *const buf
, size_t size
, int fl
, const struct sockaddr_in
*const toAddr
, int tlen
)
86 tleft
= (int) (done
- now
);
92 result
= select(sfd
+ 1, NULL
, SELECT_TYPE_ARG234
&ss
, NULL
, SELECT_TYPE_ARG5
&tv
);
96 } else if (result
== 0) {
100 return (kTimeoutErr
);
101 } else if (errno
!= EINTR
) {
107 nwrote
= sendto(sfd
, buf
, size
, fl
,
108 (struct sockaddr
*) toAddr
,
109 (int) sizeof(struct sockaddr_in
));
114 break; /* Fatal error. */
127 Sendto(int sfd
, const char *const buf
, size_t size
, const struct sockaddr_in
*const toAddr
)
132 result
= sendto(sfd
, buf
, size
, 0,
133 (struct sockaddr
*) toAddr
,
134 (int) sizeof(struct sockaddr_in
));
135 } while ((result
< 0) && (errno
== EINTR
));