X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fgrab_file%2Fgrab_file.c;h=b3a2f54d512ea07f5c10b9e95c5cafbb59bd0771;hb=450a9a4c70af36f3be1eb572d513ffebf25c3797;hp=6f2c9fe17e9473f5c3a84d423e30fb35e01283bd;hpb=9965fc25fcc92dc76d1cd4cf9595dc3dc9ebc586;p=ccan diff --git a/ccan/grab_file/grab_file.c b/ccan/grab_file/grab_file.c index 6f2c9fe1..b3a2f54d 100644 --- a/ccan/grab_file/grab_file.c +++ b/ccan/grab_file/grab_file.c @@ -1,6 +1,6 @@ #include "grab_file.h" -#include "talloc/talloc.h" -#include "noerr/noerr.h" +#include +#include #include #include #include @@ -9,18 +9,33 @@ void *grab_fd(const void *ctx, int fd, size_t *size) { int ret; - size_t max = 16384, s; + size_t max, s; char *buffer; + struct stat st; if (!size) size = &s; *size = 0; + if (fstat(fd, &st) == 0) + max = st.st_size; + else + max = 16384; + buffer = talloc_array(ctx, char, max+1); while ((ret = read(fd, buffer + *size, max - *size)) > 0) { *size += ret; - if (*size == max) - buffer = talloc_realloc(ctx, buffer, char, max*=2 + 1); + if (*size == max) { + buffer = talloc_realloc(ctx, buffer, char, max*2+1); + if (!buffer) { + buffer = talloc_realloc(ctx, buffer, char, + max + 1024*1024 + 1); + if (!buffer) + return NULL; + max += 1024*1024; + } else + max *= 2; + } } if (ret < 0) { talloc_free(buffer);