Rev 4874 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4874 | Rev 4921 | ||
---|---|---|---|
Line 19... | Line 19... | ||
19 | #include <_ansi.h> |
19 | #include <_ansi.h> |
20 | #include |
20 | #include |
21 | #include |
21 | #include |
22 | #include |
22 | #include |
23 | #include |
23 | #include |
- | 24 | #include |
|
24 | #include "local.h" |
25 | #include "local.h" |
25 | #include "fvwrite.h" |
26 | #include "fvwrite.h" |
Line 26... | Line 27... | ||
26 | 27 | ||
27 | #define MIN(a, b) ((a) < (b) ? (a) : (b)) |
28 | #define MIN(a, b) ((a) < (b) ? (a) : (b)) |
Line 50... | Line 51... | ||
50 | register struct __suio *uio) |
51 | register struct __suio *uio) |
51 | { |
52 | { |
52 | register size_t len; |
53 | register size_t len; |
53 | register _CONST char *p = NULL; |
54 | register _CONST char *p = NULL; |
54 | register struct __siov *iov; |
55 | register struct __siov *iov; |
55 | register int w, s; |
56 | register _READ_WRITE_RETURN_TYPE w, s; |
56 | char *nl; |
57 | char *nl; |
57 | int nlknown, nldist; |
58 | int nlknown, nldist; |
Line 58... | Line 59... | ||
58 | 59 | ||
59 | if ((len = uio->uio_resid) == 0) |
60 | if ((len = uio->uio_resid) == 0) |
Line 87... | Line 88... | ||
87 | #endif |
88 | #endif |
Line 88... | Line 89... | ||
88 | 89 | ||
89 | if (fp->_flags & __SNBF) |
90 | if (fp->_flags & __SNBF) |
90 | { |
91 | { |
91 | /* |
92 | /* |
- | 93 | * Unbuffered: Split buffer in the largest multiple of BUFSIZ < INT_MAX |
|
92 | * Unbuffered: write up to BUFSIZ bytes at a time. |
94 | * as some legacy code may expect int instead of size_t. |
93 | */ |
95 | */ |
94 | do |
96 | do |
95 | { |
97 | { |
96 | GETIOV (;); |
98 | GETIOV (;); |
- | 99 | w = fp->_write (ptr, fp->_cookie, p, |
|
97 | w = fp->_write (ptr, fp->_cookie, p, MIN (len, BUFSIZ)); |
100 | MIN (len, INT_MAX - INT_MAX % BUFSIZ)); |
98 | if (w <= 0) |
101 | if (w <= 0) |
99 | goto err; |
102 | goto err; |
100 | p += w; |
103 | p += w; |
101 | len -= w; |
104 | len -= w; |
Line 153... | Line 156... | ||
153 | { |
156 | { |
154 | str = (unsigned char *)_realloc_r (ptr, fp->_bf._base, |
157 | str = (unsigned char *)_realloc_r (ptr, fp->_bf._base, |
155 | newsize); |
158 | newsize); |
156 | if (!str) |
159 | if (!str) |
157 | { |
160 | { |
158 | /* Free buffer which is no longer used. */ |
161 | /* Free buffer which is no longer used and clear |
- | 162 | __SMBF flag to avoid double free in fclose. */ |
|
159 | _free_r (ptr, fp->_bf._base); |
163 | _free_r (ptr, fp->_bf._base); |
- | 164 | fp->_flags &= ~__SMBF; |
|
160 | /* Ensure correct errno, even if free changed it. */ |
165 | /* Ensure correct errno, even if free changed it. */ |
161 | ptr->_errno = ENOMEM; |
166 | ptr->_errno = ENOMEM; |
162 | goto err; |
167 | goto err; |
163 | } |
168 | } |
164 | } |
169 | } |
Line 173... | Line 178... | ||
173 | COPY (w); /* copy MIN(fp->_w,len), */ |
178 | COPY (w); /* copy MIN(fp->_w,len), */ |
174 | fp->_w -= w; |
179 | fp->_w -= w; |
175 | fp->_p += w; |
180 | fp->_p += w; |
176 | w = len; /* but pretend copied all */ |
181 | w = len; /* but pretend copied all */ |
177 | } |
182 | } |
178 | else if (fp->_p > fp->_bf._base && len > w) |
183 | else if (fp->_p > fp->_bf._base || len < fp->_bf._size) |
179 | { |
184 | { |
- | 185 | /* pass through the buffer */ |
|
180 | /* fill and flush */ |
186 | w = MIN (len, w); |
181 | COPY (w); |
187 | COPY (w); |
182 | /* fp->_w -= w; *//* unneeded */ |
188 | fp->_w -= w; |
183 | fp->_p += w; |
189 | fp->_p += w; |
184 | if (_fflush_r (ptr, fp)) |
190 | if (fp->_w == 0 && _fflush_r (ptr, fp)) |
185 | goto err; |
191 | goto err; |
186 | } |
192 | } |
187 | else if (len >= (w = fp->_bf._size)) |
193 | else |
188 | { |
194 | { |
189 | /* write directly */ |
195 | /* write directly */ |
- | 196 | w = ((int)MIN (len, INT_MAX)) / fp->_bf._size * fp->_bf._size; |
|
190 | w = fp->_write (ptr, fp->_cookie, p, w); |
197 | w = fp->_write (ptr, fp->_cookie, p, w); |
191 | if (w <= 0) |
198 | if (w <= 0) |
192 | goto err; |
199 | goto err; |
193 | } |
200 | } |
194 | else |
- | |
195 | { |
- | |
196 | /* fill and done */ |
- | |
197 | w = len; |
- | |
198 | COPY (w); |
- | |
199 | fp->_w -= w; |
- | |
200 | fp->_p += w; |
- | |
201 | } |
- | |
202 | p += w; |
201 | p += w; |
203 | len -= w; |
202 | len -= w; |
204 | } |
203 | } |
205 | while ((uio->uio_resid -= w) != 0); |
204 | while ((uio->uio_resid -= w) != 0); |
206 | } |
205 | } |