X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Flib%2Flttng-ctl%2Ffilter%2Fmemstream.h;h=cd246eed27e9a8a4e032b3be40ccb1ecc3aaf50c;hp=7b7797cfaa1ad394ba5aaa4b8d4770fe3c119c27;hb=ab5be9fa2eb5ba9600a82cd18fd3cfcbac69169a;hpb=6f04ed72990f6c72d16fd08d39feac0967da732e diff --git a/src/lib/lttng-ctl/filter/memstream.h b/src/lib/lttng-ctl/filter/memstream.h index 7b7797cfa..cd246eed2 100644 --- a/src/lib/lttng-ctl/filter/memstream.h +++ b/src/lib/lttng-ctl/filter/memstream.h @@ -1,26 +1,12 @@ -#ifndef _LTTNG_CTL_MEMSTREAM_H -#define _LTTNG_CTL_MEMSTREAM_H - /* - * src/lib/lttng-ctl/memstream.h + * Copyright 2012 (C) Mathieu Desnoyers * - * Copyright 2012 (c) - Mathieu Desnoyers + * SPDX-License-Identifier: MIT * - * memstream compatibility layer. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. */ -#define _GNU_SOURCE -#include +#ifndef _LTTNG_CTL_MEMSTREAM_H +#define _LTTNG_CTL_MEMSTREAM_H #ifdef LTTNG_HAVE_FMEMOPEN #include @@ -98,131 +84,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 */