cmogstored 1.8.1 - use default system stack size
[cmogstored.git] / compat_memstream.h
blobaffd4cd1a6d4eb0ffacd1f1cd07b7186483232bb
1 /*
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>
4 */
5 #ifdef HAVE_OPEN_MEMSTREAM
6 # define my_memstream_close(fp,dst,bytes) fclose((fp))
7 # define my_memstream_errclose(fp) ((void)fclose((fp)))
8 #else
9 static FILE * my_open_memstream(char **ptr, size_t *sizeloc)
11 FILE *fp;
13 do {
14 errno = 0;
15 fp = tmpfile();
16 if (fp != NULL)
17 return fp;
18 } while (errno == EINTR);
20 return NULL;
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)
28 errno = 0;
29 if (fclose(fp) != 0)
30 assert(errno != EBADF
31 && "EBADF in stdio/fclose(memstream) replacement");
34 static int my_memstream_close(FILE *fp, char **dst, size_t *bytes)
36 long pos;
38 errno = 0;
39 pos = ftell(fp);
41 if (pos >= 0) {
42 rewind(fp);
43 *bytes = (size_t)pos;
44 *dst = xmalloc(*bytes);
45 if (fread(*dst, 1, *bytes, fp) == *bytes)
46 goto out;
47 } else {
48 assert(errno != EBADF
49 && "EBADF in stdio/open_memstream replacement");
52 *bytes = 0;
53 syslog(LOG_ERR, "stdio/open_memstream replacement failed: %m");
55 out:
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);
62 return 0;
64 #endif /* !HAVE_OPEN_MEMSTREAM */