X-Git-Url: https://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Fstring%2Fstring.c;h=9182ac0650fb7b9c94ba72aa12872ca7f44310d0;hp=d3d17bbd3156eb065ece87e94f28810fddf7a465;hb=909bf610f3dfdd5386c7cac24997fd2a72390ace;hpb=458c48e8b27a2eff90b51610e86a870e103a28ad diff --git a/ccan/string/string.c b/ccan/string/string.c index d3d17bbd..9182ac06 100644 --- a/ccan/string/string.c +++ b/ccan/string/string.c @@ -6,6 +6,10 @@ #include #include "string.h" #include "talloc/talloc.h" +#include +#include +#include +#include char **strsplit(const void *ctx, const char *string, const char *delims, unsigned int *nump) @@ -30,4 +34,63 @@ char **strsplit(const void *ctx, const char *string, const char *delims, *nump = num; return lines; } - + +char *strjoin(const void *ctx, char *strings[], const char *delim) +{ + unsigned int i; + char *ret = talloc_strdup(ctx, ""); + + for (i = 0; strings[i]; i++) { + ret = talloc_append_string(ret, strings[i]); + ret = talloc_append_string(ret, delim); + } + return ret; +} + +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; +} + +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; +}