X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=tools%2Fgrab_file.c;fp=tools%2Fgrab_file.c;h=283a82b8c4cfff26a8038144f761195cd68b85df;hb=437fa285d12183a0f1e7450b3a01cbe5620a3507;hp=0000000000000000000000000000000000000000;hpb=b2def1c863e7e936eca2ee5d0fb1ccd7c83e4be7;p=ccan diff --git a/tools/grab_file.c b/tools/grab_file.c new file mode 100644 index 00000000..283a82b8 --- /dev/null +++ b/tools/grab_file.c @@ -0,0 +1,58 @@ +#include "tools.h" +#include "talloc/talloc.h" +#include +#include +#include +#include +#include +#include + +static int close_no_errno(int fd) +{ + int ret = 0, serrno = errno; + if (close(fd) < 0) + ret = errno; + errno = serrno; + return ret; +} + +void *grab_fd(const void *ctx, int fd) +{ + int ret; + unsigned int max = 16384, size = 0; + char *buffer; + + 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 (ret < 0) { + talloc_free(buffer); + buffer = NULL; + } else + buffer[size] = '\0'; + + return buffer; +} + +/* This version adds one byte (for nul term) */ +void *grab_file(const void *ctx, const char *filename) +{ + int fd; + char *buffer; + + if (streq(filename, "-")) + fd = dup(STDIN_FILENO); + else + fd = open(filename, O_RDONLY, 0); + + if (fd < 0) + return NULL; + + buffer = grab_fd(ctx, fd); + close_no_errno(fd); + return buffer; +} +