Mercurial > molko
annotate libmlk-util/mlk/util/fmemopen.c @ 571:cba66f7d8a53
misc: various windows fixes
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 09 Mar 2023 22:33:46 +0100 |
parents | ecb158cbdd67 |
children | 64150963f567 |
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 * |
445
773a082f0b91
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
432
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
348
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 |
558
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
19 #include "sysconfig.h" |
560
ecb158cbdd67
util: fix fmemopen leftover
David Demelier <markand@malikania.fr>
parents:
558
diff
changeset
|
20 |
ecb158cbdd67
util: fix fmemopen leftover
David Demelier <markand@malikania.fr>
parents:
558
diff
changeset
|
21 #include <stdio.h> |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
22 |
558
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
23 #if !defined(MLK_HAVE_FMEMOPEN) |
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
24 |
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
25 #if defined(_WIN32) |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
349
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
27 #include <sys/stat.h> |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
28 #include <sys/types.h> |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
29 #include <fcntl.h> |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
30 #include <io.h> |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
31 #include <share.h> |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 #include <stdio.h> |
349
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
33 #include <string.h> |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 #include <windows.h> |
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 FILE * |
446
4607eea0eabc
util: prefix with mlk_
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
37 mlk_util_fmemopen(void *buf, size_t size, const char *mode) |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 { |
349
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
39 char temppath[MAX_PATH + 1], filename[MAX_PATH + 1]; |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 FILE *fp; |
349
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
41 int fd, flags; |
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 flags = _O_CREAT | |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
44 _O_SHORT_LIVED | |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
45 _O_TEMPORARY | |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
46 _O_RDWR | |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
47 _O_NOINHERIT; |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
48 |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
49 if (strchr(mode, 'b')) |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
50 flags |= _O_BINARY; |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 |
571
cba66f7d8a53
misc: various windows fixes
David Demelier <markand@malikania.fr>
parents:
560
diff
changeset
|
52 if (!GetTempPathA(sizeof (temppath), temppath)) |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 return NULL; |
571
cba66f7d8a53
misc: various windows fixes
David Demelier <markand@malikania.fr>
parents:
560
diff
changeset
|
54 if (!GetTempFileNameA(temppath, "MLK", 0, filename)) |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 return NULL; |
571
cba66f7d8a53
misc: various windows fixes
David Demelier <markand@malikania.fr>
parents:
560
diff
changeset
|
56 if (_sopen_s(&fd, filename, flags, _SH_DENYRW, _S_IREAD | _S_IWRITE) < 0) |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 return NULL; |
362
12367bfc2df6
misc: even more warnings cleaned
David Demelier <markand@malikania.fr>
parents:
350
diff
changeset
|
58 if (!(fp = _fdopen(fd, mode))) { |
349
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
59 _close(fd); |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
60 return NULL; |
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
61 } |
348
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 fwrite(buf, size, 1, fp); |
349
99d9b6a7e3db
port: implement a mort temporary friendly fmemopen function
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
64 rewind(fp); |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 |
350
66ad82bc592a
port: fix wrong returned value in fmemopen
David Demelier <markand@malikania.fr>
parents:
349
diff
changeset
|
66 return fp; |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 } |
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 |
558
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
69 #else |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 |
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 FILE * |
446
4607eea0eabc
util: prefix with mlk_
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
72 mlk_util_fmemopen(void *buf, size_t len, const char *type) |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 { |
558
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
74 (void)buf; |
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
75 (void)len; |
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
76 (void)type; |
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
77 |
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
78 /* Unsupported platform. */ |
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
79 return NULL; |
348
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 } |
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 |
7d7991f97acf
misc: be more barebone portable
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 #endif |
558
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
83 |
560
ecb158cbdd67
util: fix fmemopen leftover
David Demelier <markand@malikania.fr>
parents:
558
diff
changeset
|
84 #else |
ecb158cbdd67
util: fix fmemopen leftover
David Demelier <markand@malikania.fr>
parents:
558
diff
changeset
|
85 |
ecb158cbdd67
util: fix fmemopen leftover
David Demelier <markand@malikania.fr>
parents:
558
diff
changeset
|
86 FILE * |
ecb158cbdd67
util: fix fmemopen leftover
David Demelier <markand@malikania.fr>
parents:
558
diff
changeset
|
87 mlk_util_fmemopen(void *buf, size_t len, const char *type) |
ecb158cbdd67
util: fix fmemopen leftover
David Demelier <markand@malikania.fr>
parents:
558
diff
changeset
|
88 { |
ecb158cbdd67
util: fix fmemopen leftover
David Demelier <markand@malikania.fr>
parents:
558
diff
changeset
|
89 return fmemopen(buf, len, type); |
ecb158cbdd67
util: fix fmemopen leftover
David Demelier <markand@malikania.fr>
parents:
558
diff
changeset
|
90 } |
ecb158cbdd67
util: fix fmemopen leftover
David Demelier <markand@malikania.fr>
parents:
558
diff
changeset
|
91 |
558
a2443afe8a1f
cmake: check for non-portable stuff
David Demelier <markand@malikania.fr>
parents:
446
diff
changeset
|
92 #endif |