X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Flib%2Flttng-ctl%2Ffilter%2Fmemstream.h;h=af2a5a77382e96b9e8e7f52764988a84bcab534f;hp=6990b6fd709189e99b55416b93e11cd5f7604389;hb=75acbe19887436248352558828220eb88731d916;hpb=890d8fe47755c3bad936389cf48ffa141cff41c9 diff --git a/src/lib/lttng-ctl/filter/memstream.h b/src/lib/lttng-ctl/filter/memstream.h index 6990b6fd7..af2a5a773 100644 --- a/src/lib/lttng-ctl/filter/memstream.h +++ b/src/lib/lttng-ctl/filter/memstream.h @@ -95,131 +95,4 @@ error_unlink: #endif /* LTTNG_HAVE_FMEMOPEN */ -#ifdef LTTNG_HAVE_OPEN_MEMSTREAM - -#include - -static inline -FILE *lttng_open_memstream(char **ptr, size_t *sizeloc) -{ - return open_memstream(ptr, sizeloc); -} - -static inline -int lttng_close_memstream(char **buf, size_t *size, FILE *fp) -{ - return fclose(fp); -} - -#else /* LTTNG_HAVE_OPEN_MEMSTREAM */ - -#include -#include - -/* - * Fallback for systems which don't have open_memstream. Create FILE * - * with lttng_open_memstream, but require call to - * lttng_close_memstream to flush all data written to the FILE * - * into the buffer (which we allocate). - */ -static inline -FILE *lttng_open_memstream(char **ptr, size_t *sizeloc) -{ - char tmpname[PATH_MAX]; - int ret; - FILE *fp; - - strncpy(tmpname, "/tmp/lttng-tmp-XXXXXX", PATH_MAX); - ret = mkstemp(tmpname); - if (ret < 0) { - return NULL; - } - fp = fdopen(ret, "w+"); - if (!fp) { - goto error_unlink; - } - /* - * lttng_flush_memstream will update the buffer content - * with read from fp. No need to keep the file around, just the - * handle. - */ - ret = unlink(tmpname); - if (ret < 0) { - PERROR("unlink"); - } - return fp; - -error_unlink: - ret = unlink(tmpname); - if (ret < 0) { - PERROR("unlink"); - } - return NULL; -} - -/* Get file size, allocate buffer, copy. */ -static inline -int lttng_close_memstream(char **buf, size_t *size, FILE *fp) -{ - size_t len, n; - long pos; - int ret; - - ret = fflush(fp); - if (ret < 0) { - PERROR("fflush"); - return ret; - } - ret = fseek(fp, 0L, SEEK_END); - if (ret < 0) { - PERROR("fseek"); - return ret; - } - pos = ftell(fp); - if (ret < 0) { - PERROR("ftell"); - return ret; - } - *size = pos; - /* add final \0 */ - *buf = calloc(pos + 1, sizeof(char)); - if (!*buf) { - return -ENOMEM; - } - ret = fseek(fp, 0L, SEEK_SET); - if (ret < 0) { - PERROR("fseek"); - goto error_free; - } - /* Copy the entire file into the buffer */ - n = 0; - clearerr(fp); - while (!feof(fp) && !ferror(fp) && (*size - n > 0)) { - len = fread(*buf, sizeof(char), *size - n, fp); - n += len; - } - if (n != *size) { - ret = -1; - goto error_close; - } - ret = fclose(fp); - if (ret < 0) { - PERROR("fclose"); - return ret; - } - return 0; - -error_close: - ret = fclose(fp); - if (ret < 0) { - PERROR("fclose"); - } -error_free: - free(*buf); - *buf = NULL; - return ret; -} - -#endif /* LTTNG_HAVE_OPEN_MEMSTREAM */ - #endif /* _LTTNG_CTL_MEMSTREAM_H */