4 extern volatile Sjmp_buf gNetTimeoutJmp
;
5 extern volatile Sjmp_buf gPipeJmp
;
11 SSend(int sfd
, char *buf0
, size_t size
, int fl
, int tlen
)
14 char *volatile buf
= buf0
;
16 vsio_sigproc_t sigalrm
, sigpipe
;
19 if (SSetjmp(gNetTimeoutJmp
) != 0) {
21 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
22 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
23 nwrote
= size
- nleft
;
30 if (SSetjmp(gPipeJmp
) != 0) {
32 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
33 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
34 nwrote
= size
- nleft
;
38 return (kBrokenPipeErr
);
41 sigalrm
= (vsio_sigproc_t
) SSignal(SIGALRM
, SIOHandler
);
42 sigpipe
= (vsio_sigproc_t
) SSignal(SIGPIPE
, SIOHandler
);
48 tleft
= (int) (done
- now
);
50 nwrote
= size
- nleft
;
57 (void) alarm((unsigned int) tleft
);
58 nwrote
= send(sfd
, buf
, size
, fl
);
62 nwrote
= size
- nleft
;
78 nwrote
= size
- nleft
;
81 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
82 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
90 SSend(int sfd
, char *buf0
, size_t size
, int fl
, int tlen
)
104 tleft
= (int) (done
- now
);
106 nwrote
= size
- nleft
;
108 nwrote
= kTimeoutErr
;
116 /* Unfortunately this doesn't help when the
117 * send buffer fills during the time we're
118 * writing to it, so you could still be
119 * blocked after breaking this loop and starting
129 result
= select(sfd
+ 1, NULL
, SELECT_TYPE_ARG234
&ss
, NULL
, SELECT_TYPE_ARG5
&tv
);
133 } else if (result
== 0) {
135 nwrote
= size
- nleft
;
140 return (kTimeoutErr
);
141 } else if (errno
!= EINTR
) {
146 nwrote
= send(sfd
, buf
, size
, fl
);
149 if (errno
!= EINTR
) {
150 nwrote
= size
- nleft
;
166 nwrote
= size
- nleft
;