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
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 *
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