diff options
Diffstat (limited to 'libbb/read.c')
-rw-r--r-- | libbb/read.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/libbb/read.c b/libbb/read.c index 7b804125a..405e216dc 100644 --- a/libbb/read.c +++ b/libbb/read.c | |||
@@ -291,3 +291,52 @@ void* FAST_FUNC xmalloc_xopen_read_close(const char *filename, size_t *sizep) | |||
291 | bb_perror_msg_and_die("can't read '%s'", filename); | 291 | bb_perror_msg_and_die("can't read '%s'", filename); |
292 | return buf; | 292 | return buf; |
293 | } | 293 | } |
294 | |||
295 | /* libbb candidate */ | ||
296 | #if 0 | ||
297 | static void *xmalloc_read(int fd, size_t *sizep) | ||
298 | { | ||
299 | char *buf; | ||
300 | size_t size, rd_size, total; | ||
301 | off_t to_read; | ||
302 | struct stat st; | ||
303 | |||
304 | to_read = sizep ? *sizep : INT_MAX; /* max to read */ | ||
305 | |||
306 | /* Estimate file size */ | ||
307 | st.st_size = 0; /* in case fstat fails, assume 0 */ | ||
308 | fstat(fd, &st); | ||
309 | /* /proc/N/stat files report st_size 0 */ | ||
310 | /* In order to make such files readable, we add small const */ | ||
311 | size = (st.st_size | 0x3ff) + 1; | ||
312 | |||
313 | total = 0; | ||
314 | buf = NULL; | ||
315 | while (1) { | ||
316 | if (to_read < size) | ||
317 | size = to_read; | ||
318 | buf = xrealloc(buf, total + size + 1); | ||
319 | rd_size = full_read(fd, buf + total, size); | ||
320 | if ((ssize_t)rd_size < 0) { /* error */ | ||
321 | free(buf); | ||
322 | return NULL; | ||
323 | } | ||
324 | total += rd_size; | ||
325 | if (rd_size < size) /* EOF */ | ||
326 | break; | ||
327 | to_read -= rd_size; | ||
328 | if (to_read <= 0) | ||
329 | break; | ||
330 | /* grow by 1/8, but in [1k..64k] bounds */ | ||
331 | size = ((total / 8) | 0x3ff) + 1; | ||
332 | if (size > 64*1024) | ||
333 | size = 64*1024; | ||
334 | } | ||
335 | xrealloc(buf, total + 1); | ||
336 | buf[total] = '\0'; | ||
337 | |||
338 | if (sizep) | ||
339 | *sizep = total; | ||
340 | return buf; | ||
341 | } | ||
342 | #endif | ||