X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fstring%2Fstring.c;h=f0d0fd4f3ff289ce8cb75f36ec3f7d7803a94649;hb=8d43fa7458b0102d440f242f1a3a1b45fbb41827;hp=7686813c9a392ab5cf94c8b624e3037e28fbd601;hpb=e52b97e4d99af6e2a564731c23c6c86e373aedaa;p=ccan diff --git a/ccan/string/string.c b/ccan/string/string.c index 7686813c..f0d0fd4f 100644 --- a/ccan/string/string.c +++ b/ccan/string/string.c @@ -10,6 +10,7 @@ #include #include #include +#include "noerr/noerr.h" char **strsplit(const void *ctx, const char *string, const char *delims, unsigned int *nump) @@ -47,23 +48,45 @@ 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, size_t *size) +{ + int fd; + char *buffer; + + if (!filename) + fd = dup(STDIN_FILENO); + else + fd = open(filename, O_RDONLY, 0); + + if (fd < 0) + return NULL; + buffer = grab_fd(ctx, fd, size); + close_noerr(fd); return buffer; }