Build fix: implicit declaration of function 'PERROR' on Solaris
[lttng-tools.git] / src / common / filter / memstream.h
CommitLineData
53a80697 1/*
ab5be9fa 2 * Copyright 2012 (C) Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
53a80697 3 *
ab5be9fa 4 * SPDX-License-Identifier: MIT
53a80697 5 *
53a80697
MD
6 */
7
ab5be9fa
MJ
8#ifndef _LTTNG_CTL_MEMSTREAM_H
9#define _LTTNG_CTL_MEMSTREAM_H
10
53a80697
MD
11#ifdef LTTNG_HAVE_FMEMOPEN
12#include <stdio.h>
13
14static inline
15FILE *lttng_fmemopen(void *buf, size_t size, const char *mode)
16{
17 return fmemopen(buf, size, mode);
18}
19
20#else /* LTTNG_HAVE_FMEMOPEN */
21
22#include <stdlib.h>
23#include <stdio.h>
dc11d4e3 24#include <common/error.h>
53a80697
MD
25
26/*
27 * Fallback for systems which don't have fmemopen. Copy buffer to a
28 * temporary file, and use that file as FILE * input.
29 */
30static inline
31FILE *lttng_fmemopen(void *buf, size_t size, const char *mode)
32{
33 char tmpname[PATH_MAX];
34 size_t len;
35 FILE *fp;
36 int ret;
37
38 /*
39 * Support reading only.
40 */
41 if (strcmp(mode, "rb") != 0) {
42 return NULL;
43 }
44 strncpy(tmpname, "/tmp/lttng-tmp-XXXXXX", PATH_MAX);
45 ret = mkstemp(tmpname);
46 if (ret < 0) {
47 return NULL;
48 }
49 /*
50 * We need to write to the file.
51 */
52 fp = fdopen(ret, "w+");
53 if (!fp) {
54 goto error_unlink;
55 }
56 /* Copy the entire buffer to the file */
57 len = fwrite(buf, sizeof(char), size, fp);
58 if (len != size) {
59 goto error_close;
60 }
61 ret = fseek(fp, 0L, SEEK_SET);
62 if (ret < 0) {
6f04ed72 63 PERROR("fseek");
53a80697
MD
64 goto error_close;
65 }
66 /* We keep the handle open, but can unlink the file on the VFS. */
67 ret = unlink(tmpname);
68 if (ret < 0) {
6f04ed72 69 PERROR("unlink");
53a80697
MD
70 }
71 return fp;
72
73error_close:
74 ret = fclose(fp);
75 if (ret < 0) {
6f04ed72 76 PERROR("close");
53a80697
MD
77 }
78error_unlink:
79 ret = unlink(tmpname);
80 if (ret < 0) {
6f04ed72 81 PERROR("unlink");
53a80697
MD
82 }
83 return NULL;
84}
85
86#endif /* LTTNG_HAVE_FMEMOPEN */
87
53a80697 88#endif /* _LTTNG_CTL_MEMSTREAM_H */
This page took 0.046485 seconds and 4 git commands to generate.