3 static char UNUSED(gSioVersion
[]) = "@(#) sio 6.0.3 ** Copyright 1992-2001 Mike Gleason. All rights reserved.";
6 static char UNUSED(gNoSignalsMarker
[]) = "@(#) sio - NO_SIGNALS";
8 extern volatile Sjmp_buf gNetTimeoutJmp
;
9 extern volatile Sjmp_buf gPipeJmp
;
12 /* Read up to "size" bytes on sfd before "tlen" seconds.
14 * If "retry" is on, after a successful read of less than "size"
15 * bytes, it will attempt to read more, upto "size."
17 * If the timer elapses and one or more bytes were read, it returns
18 * that number, otherwise a timeout error is returned.
20 * Although "retry" would seem to indicate you may want to always
21 * read "size" bytes or else it is an error, even with that on you
22 * may get back a value < size. Set "retry" to 0 when you want to
23 * return as soon as there is a chunk of data whose size is <= "size".
29 SRead(int sfd
, char *const buf0
, size_t size
, int tlen
, int retry
)
33 char *volatile buf
= buf0
;
35 vsio_sigproc_t sigalrm
, sigpipe
;
38 if (SSetjmp(gNetTimeoutJmp
) != 0) {
40 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
41 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
43 if ((nread
> 0) && ((retry
& (kFullBufferRequired
|kFullBufferRequiredExceptLast
)) == 0))
49 if (SSetjmp(gPipeJmp
) != 0) {
51 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
52 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
54 if ((nread
> 0) && ((retry
& (kFullBufferRequired
|kFullBufferRequiredExceptLast
)) == 0))
57 return (kBrokenPipeErr
);
60 sigalrm
= (vsio_sigproc_t
) SSignal(SIGALRM
, SIOHandler
);
61 sigpipe
= (vsio_sigproc_t
) SSignal(SIGPIPE
, SIOHandler
);
68 tleft
= (int) (done
- now
);
71 if ((nread
== 0) || ((retry
& (kFullBufferRequired
)) != 0)) {
77 (void) alarm((unsigned int) tleft
);
78 nread
= read(sfd
, (char *) buf
, nleft
);
83 if (retry
== ((retry
& (kFullBufferRequiredExceptLast
)) != 0))
86 } else if (errno
!= EINTR
) {
96 /* Ignore this line... */
97 LIBSIO_USE_VAR(gSioVersion
);
101 if ((nleft
<= 0) || (((retry
& (kFullBufferRequired
|kFullBufferRequiredExceptLast
)) == 0) && (nleft
!= (int) size
)))
106 nread
= size
- nleft
;
109 (void) SSignal(SIGALRM
, (sio_sigproc_t
) sigalrm
);
110 (void) SSignal(SIGPIPE
, (sio_sigproc_t
) sigpipe
);
118 SRead(int sfd
, char *const buf0
, size_t size
, int tlen
, int retry
)
127 int result
, firstRead
;
137 tleft
= (int) (done
- now
);
139 nread
= size
- nleft
;
140 if ((nread
== 0) || ((retry
& (kFullBufferRequired
|kFullBufferRequiredExceptLast
)) != 0)) {
148 if (!firstRead
|| ((retry
& kNoFirstSelect
) == 0)) {
155 result
= select(sfd
+ 1, SELECT_TYPE_ARG234
&ss
, NULL
, NULL
, SELECT_TYPE_ARG5
&tv
);
159 } else if (result
== 0) {
161 nread
= size
- nleft
;
162 if ((nread
> 0) && ((retry
& (kFullBufferRequired
|kFullBufferRequiredExceptLast
)) == 0))
166 return (kTimeoutErr
);
167 } else if (errno
!= EINTR
) {
174 #if defined(WIN32) || defined(_WINDOWS)
175 nread
= recv(sfd
, (char *) buf
, nleft
, 0);
177 nread
= read(sfd
, (char *) buf
, nleft
);
183 if (retry
== ((retry
& (kFullBufferRequiredExceptLast
)) != 0))
184 nread
= size
- nleft
;
186 } else if (errno
!= EINTR
) {
187 nread
= size
- nleft
;
196 /* Ignore these two lines */
197 LIBSIO_USE_VAR(gSioVersion
);
198 LIBSIO_USE_VAR(gNoSignalsMarker
);
202 if ((nleft
<= 0) || (((retry
& (kFullBufferRequired
|kFullBufferRequiredExceptLast
)) == 0) && (nleft
!= (int) size
)))
207 nread
= size
- nleft
;