X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fstring%2Fstring.c;h=f0d0fd4f3ff289ce8cb75f36ec3f7d7803a94649;hp=6e473af36cf3862580e6c1f706d46861e99dc874;hb=8aeb80ab049612adefeafea65aaa038591200944;hpb=f6387bc4a0f5aa75160095a876b103758ea807c7 diff --git a/ccan/string/string.c b/ccan/string/string.c index 6e473af3..f0d0fd4f 100644 --- a/ccan/string/string.c +++ b/ccan/string/string.c @@ -48,33 +48,37 @@ char *strjoin(const void *ctx, char *strings[], const char *delim) return ret; } -void *grab_fd(const void *ctx, int fd) +void *grab_fd(const void *ctx, int fd, size_t *size) { int ret; - unsigned int max = 16384, size = 0; + size_t max = 16384, s; char *buffer; + if (!size) + size = &s; + *size = 0; + buffer = talloc_array(ctx, char, max+1); - while ((ret = read(fd, buffer + size, max - size)) > 0) { - size += ret; - if (size == max) + while ((ret = read(fd, buffer + *size, max - *size)) > 0) { + *size += ret; + if (*size == max) buffer = talloc_realloc(ctx, buffer, char, max*=2 + 1); } if (ret < 0) { talloc_free(buffer); buffer = NULL; } else - buffer[size] = '\0'; + buffer[*size] = '\0'; return buffer; } -void *grab_file(const void *ctx, const char *filename) +void *grab_file(const void *ctx, const char *filename, size_t *size) { int fd; char *buffer; - if (streq(filename, "-")) + if (!filename) fd = dup(STDIN_FILENO); else fd = open(filename, O_RDONLY, 0); @@ -82,7 +86,7 @@ void *grab_file(const void *ctx, const char *filename) if (fd < 0) return NULL; - buffer = grab_fd(ctx, fd); + buffer = grab_fd(ctx, fd, size); close_noerr(fd); return buffer; }