annotate src/libmlk-port/port/fmemopen.c @ 349:99d9b6a7e3db

port: implement a mort temporary friendly fmemopen function
author David Demelier <markand@malikania.fr>
date Wed, 20 Oct 2021 13:55:41 +0200
parents 7d7991f97acf
children 66ad82bc592a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
348
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * fmemopen.h -- fmemopen polyfill
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr>
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #if defined(_WIN32)
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
349
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
21 #include <sys/stat.h>
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
22 #include <sys/types.h>
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
23 #include <fcntl.h>
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
24 #include <io.h>
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
25 #include <share.h>
348
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <stdio.h>
349
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
27 #include <string.h>
348
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <windows.h>
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 FILE *
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 port_fmemopen(void *buf, size_t size, const char *mode)
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 {
349
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
33 char temppath[MAX_PATH + 1], filename[MAX_PATH + 1];
348
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 FILE *fp;
349
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
35 int fd, flags;
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
36
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
37 flags = _O_CREAT |
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
38 _O_SHORT_LIVED |
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
39 _O_TEMPORARY |
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
40 _O_RDWR |
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
41 _O_NOINHERIT;
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
42
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
43 if (strchr(mode, 'b'))
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
44 flags |= _O_BINARY;
348
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 if (!GetTempPath(sizeof (temppath), temppath))
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 return NULL;
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 if (!GetTempFileName(temppath, "MLK", 0, filename))
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 return NULL;
349
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
50 if ((fd = _sopen(temppath, flags, _SH_DENYRW, _S_IREAD | _S_IWRITE)) < 0)
348
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 return NULL;
349
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
52 if (!(fp = fdopen(fd, mode))) {
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
53 _close(fd);
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
54 return NULL;
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
55 }
348
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 fwrite(buf, size, 1, fp);
349
99d9b6a7e3db port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents: 348
diff changeset
58 rewind(fp);
348
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 return fopen(filename, mode);
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 }
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 #else /* !_WIN32 */
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 #include <stdio.h>
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 FILE *
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 port_fmemopen(void *buf, size_t len, const char *type)
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 {
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 return fmemopen(buf, len, type);
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 }
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
7d7991f97acf misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 #endif