2 * Copyright (C) 2012-2020 all contributors <cmogstored-public@yhbt.net>
3 * License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
5 #ifdef HAVE_OPEN_MEMSTREAM
6 # define my_memstream_close(fp,dst,bytes) fclose((fp))
7 # define my_memstream_errclose(fp) ((void)fclose((fp)))
9 static FILE * my_open_memstream(char **ptr
, size_t *sizeloc
)
18 } while (errno
== EINTR
);
23 #define open_memstream(ptr,sizeloc) my_open_memstream((ptr),(sizeloc))
25 /* EBADF is fatal in MT applications like ours */
26 static void my_memstream_errclose(FILE *fp
)
31 && "EBADF in stdio/fclose(memstream) replacement");
34 static int my_memstream_close(FILE *fp
, char **dst
, size_t *bytes
)
44 *dst
= xmalloc(*bytes
);
45 if (fread(*dst
, 1, *bytes
, fp
) == *bytes
)
49 && "EBADF in stdio/open_memstream replacement");
53 syslog(LOG_ERR
, "stdio/open_memstream replacement failed: %m");
57 * if ftell() fails, fclose() may fail due to an I/O error,
58 * too, but at least hope we release memory..
60 my_memstream_errclose(fp
);
64 #endif /* !HAVE_OPEN_MEMSTREAM */