E-MailRelay
gdef.h
1/*
2 Copyright (C) 2001-2023 Graeme Walker <graeme_walker@users.sourceforge.net>
3
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18/*
19 * gdef.h
20 */
21
22/* This header is always the first header included in source
23 * files. It takes care of a lot of portability concerns
24 * and it works best when autoconf is used to set GCONFIG
25 * preprocessor switches.
26 */
27
28#ifndef G_DEF_H
29#define G_DEF_H
30
31 /* Pull in GCONFIG definitions. Uses an odd file name to avoid
32 * picking up a header from some third-party library. If this
33 * file does not exist then there might be a suitable template
34 * file to copy, or just create an empty file and maybe tweak
35 * the values that are defaulted below.
36 */
37 #ifndef GCONFIG_NO_GCONFIG_DEFS
38 #include <gconfig_defs.h>
39 #endif
40
41 /* Check target operating-system switches
42 */
43 #if !defined(G_WINDOWS) && !defined(G_UNIX)
44 #if defined(_WIN32)
45 #define G_WINDOWS 1
46 #else
47 #define G_UNIX 1
48 #endif
49 #endif
50 #if defined(G_WINDOWS) && defined(G_UNIX)
51 #error invalid compilation switches - define G_WINDOWS or G_UNIX but not both
52 #endif
53
54 /* Define supplementary o/s switches
55 */
56 #if defined(__MINGW32__) && !defined(G_MINGW)
57 /* mingw-w64 */
58 #define G_MINGW 1
59 #endif
60 #if defined(G_MINGW) && !defined(G_WINDOWS)
61 #error invalid compilation switches - G_MINGW requires G_WINDOWS
62 #endif
63 #if defined(__NetBSD__)
64 #define G_UNIX_BSD 1
65 #define G_UNIX_NETBSD 1
66 #endif
67 #if defined(__OpenBSD__)
68 #define G_UNIX_BSD 1
69 #define G_UNIX_OPENBSD 1
70 #endif
71 #if defined(__FreeBSD__)
72 #define G_UNIX_BSD 1
73 #define G_UNIX_FREEBSD 1
74 #endif
75 #if defined(__APPLE__)
76 #define G_UNIX_BSD 1
77 #define G_UNIX_MAC 1
78 #endif
79 #if defined(linux) || defined(__linux__)
80 #define G_UNIX_LINUX 1
81 #endif
82
83 /* Apply GCONFIG defaults in case of no autoconf
84 */
85 #if !defined(GCONFIG_HAVE_CXX_ALIGNMENT)
86 #define GCONFIG_HAVE_CXX_ALIGNMENT 1
87 #endif
88 #if !defined(GCONFIG_HAVE_CXX_STD_MAKE_UNIQUE)
89 #if defined(_MSC_VER)
90 #define GCONFIG_HAVE_CXX_STD_MAKE_UNIQUE 1
91 #else
92 #if __cplusplus >= 201400L
93 #define GCONFIG_HAVE_CXX_STD_MAKE_UNIQUE 1
94 #else
95 #define GCONFIG_HAVE_CXX_STD_MAKE_UNIQUE 0
96 #endif
97 #endif
98 #endif
99 #if !defined(GCONFIG_HAVE_CXX_STRING_VIEW)
100 #define GCONFIG_HAVE_CXX_STRING_VIEW 0
101 #endif
102 #if !defined(GCONFIG_HAVE_SYS_UTSNAME_H)
103 #ifdef G_UNIX
104 #define GCONFIG_HAVE_SYS_UTSNAME_H 1
105 #else
106 #define GCONFIG_HAVE_SYS_UTSNAME_H 0
107 #endif
108 #endif
109 #if !defined(GCONFIG_HAVE_SYS_SELECT_H)
110 #ifdef G_UNIX
111 #define GCONFIG_HAVE_SYS_SELECT_H 1
112 #else
113 #define GCONFIG_HAVE_SYS_SELECT_H 0
114 #endif
115 #endif
116 #if !defined(GCONFIG_HAVE_SYS_SOCKET_H)
117 #ifdef G_UNIX
118 #define GCONFIG_HAVE_SYS_SOCKET_H 1
119 #else
120 #define GCONFIG_HAVE_SYS_SOCKET_H 0
121 #endif
122 #endif
123 #if !defined(GCONFIG_HAVE_SYS_MMAN_H)
124 #ifdef G_UNIX
125 #define GCONFIG_HAVE_SYS_MMAN_H 1
126 #else
127 #define GCONFIG_HAVE_SYS_MMAN_H 0
128 #endif
129 #endif
130 #if !defined(GCONFIG_HAVE_NETINET_IN_H)
131 #ifdef G_UNIX
132 #define GCONFIG_HAVE_NETINET_IN_H 1
133 #else
134 #define GCONFIG_HAVE_NETINET_IN_H 0
135 #endif
136 #endif
137 #if !defined(GCONFIG_HAVE_NETDB_H)
138 #ifdef G_UNIX
139 #define GCONFIG_HAVE_NETDB_H 1
140 #else
141 #define GCONFIG_HAVE_NETDB_H 0
142 #endif
143 #endif
144 #if !defined(GCONFIG_HAVE_ARPA_INET_H)
145 #ifdef G_UNIX
146 #define GCONFIG_HAVE_ARPA_INET_H 1
147 #else
148 #define GCONFIG_HAVE_ARPA_INET_H 0
149 #endif
150 #endif
151 #if !defined(GCONFIG_HAVE_LONG_LONG)
152 #define GCONFIG_HAVE_LONG_LONG 1
153 #endif
154 #if !defined(GCONFIG_HAVE_LONG_LONG_LONG)
155 /* "long long" is longer than "long" */
156 #define GCONFIG_HAVE_LONG_LONG_LONG 0
157 #endif
158 #if !defined(GCONFIG_HAVE_STDINT_H)
159 #define GCONFIG_HAVE_STDINT_H 1
160 #endif
161 #if !defined(GCONFIG_HAVE_INTTYPES_H)
162 #define GCONFIG_HAVE_INTTYPES_H 1
163 #endif
164 #if !defined(GCONFIG_HAVE_INT64)
165 #define GCONFIG_HAVE_INT64 1
166 #endif
167 #if !defined(GCONFIG_HAVE_INT32)
168 #define GCONFIG_HAVE_INT32 1
169 #endif
170 #if !defined(GCONFIG_HAVE_INT16)
171 #define GCONFIG_HAVE_INT16 1
172 #endif
173 #if !defined(GCONFIG_HAVE_DIRENT_H)
174 #define GCONFIG_HAVE_DIRENT_H 1
175 #endif
176 #if !defined(GCONFIG_HAVE_READLINK)
177 #ifdef G_UNIX
178 #define GCONFIG_HAVE_READLINK 1
179 #else
180 #define GCONFIG_HAVE_READLINK 0
181 #endif
182 #endif
183 #if !defined(GCONFIG_HAVE_ERRNO_T)
184 #ifdef G_WINDOWS
185 #define GCONFIG_HAVE_ERRNO_T 1
186 #else
187 #define GCONFIG_HAVE_ERRNO_T 0
188 #endif
189 #endif
190 #if !defined(GCONFIG_HAVE_GETENV_S)
191 #if ( defined(G_WINDOWS) && !defined(G_MINGW) ) || defined(getenv_s)
192 #define GCONFIG_HAVE_GETENV_S 1
193 #else
194 #define GCONFIG_HAVE_GETENV_S 0
195 #endif
196 #endif
197 #if !defined(GCONFIG_HAVE_PUTENV_S)
198 #if ( defined(G_WINDOWS) && !defined(G_MINGW) ) || defined(putenv_s)
199 #define GCONFIG_HAVE_PUTENV_S 1
200 #else
201 #define GCONFIG_HAVE_PUTENV_S 0
202 #endif
203 #endif
204 #if !defined(GCONFIG_HAVE_PUTENV)
205 #define GCONFIG_HAVE_PUTENV 1
206 #endif
207 #if !defined(GCONFIG_HAVE_GETPWNAM)
208 #define GCONFIG_HAVE_GETPWNAM 1
209 #endif
210 #if !defined(GCONFIG_HAVE_GETPWNAM_R)
211 #define GCONFIG_HAVE_GETPWNAM_R 1
212 #endif
213 #if !defined(GCONFIG_HAVE_GETGRNAM)
214 #define GCONFIG_HAVE_GETGRNAM 1
215 #endif
216 #if !defined(GCONFIG_HAVE_GETGRNAM_R)
217 #define GCONFIG_HAVE_GETGRNAM_R 1
218 #endif
219 #if !defined(GCONFIG_HAVE_GMTIME_R)
220 #if defined(G_WINDOWS) && !defined(gmtime_r)
221 #define GCONFIG_HAVE_GMTIME_R 0
222 #else
223 #define GCONFIG_HAVE_GMTIME_R 1
224 #endif
225 #endif
226 #if !defined(GCONFIG_HAVE_GMTIME_S)
227 #if defined(G_WINDOWS) || defined(gmtime_s)
228 #define GCONFIG_HAVE_GMTIME_S 1
229 #else
230 #define GCONFIG_HAVE_GMTIME_S 0
231 #endif
232 #endif
233 #if !defined(GCONFIG_HAVE_IPV6)
234 #define GCONFIG_HAVE_IPV6 1
235 #endif
236 #if !defined(GCONFIG_HAVE_EXECVPE)
237 #ifdef G_UNIX_LINUX
238 #define GCONFIG_HAVE_EXECVPE 1
239 #else
240 #define GCONFIG_HAVE_EXECVPE 0
241 #endif
242 #endif
243 #if !defined(GCONFIG_HAVE_RTNETLINK)
244 #ifdef G_UNIX_LINUX
245 #define GCONFIG_HAVE_RTNETLINK 1
246 #else
247 #define GCONFIG_HAVE_RTNETLINK 0
248 #endif
249 #endif
250 #if !defined(GCONFIG_HAVE_NETROUTE)
251 #ifdef G_UNIX_BSD
252 #define GCONFIG_HAVE_NETROUTE 1
253 #else
254 #define GCONFIG_HAVE_NETROUTE 0
255 #endif
256 #endif
257 #if !defined(GCONFIG_HAVE_LOCALTIME_R)
258 #if defined(G_WINDOWS) && !defined(localtime_r)
259 #define GCONFIG_HAVE_LOCALTIME_R 0
260 #else
261 #define GCONFIG_HAVE_LOCALTIME_R 1
262 #endif
263 #endif
264 #if !defined(GCONFIG_HAVE_LOCALTIME_S)
265 #if defined(G_WINDOWS) || defined(localtime_s)
266 #define GCONFIG_HAVE_LOCALTIME_S 1
267 #else
268 #define GCONFIG_HAVE_LOCALTIME_S 0
269 #endif
270 #endif
271 #if !defined(GCONFIG_HAVE_MEMORY_H)
272 #define GCONFIG_HAVE_MEMORY_H 1
273 #endif
274 #if !defined(GCONFIG_HAVE_SETPGRP_BSD)
275 #if defined(G_UNIX_LINUX) || defined(G_UNIX_MAC)
276 #define GCONFIG_HAVE_SETPGRP_BSD 0
277 #else
278 #define GCONFIG_HAVE_SETPGRP_BSD 1
279 #endif
280 #endif
281 #if !defined(GCONFIG_HAVE_SETGROUPS)
282 #ifdef G_UNIX
283 #define GCONFIG_HAVE_SETGROUPS 1
284 #else
285 #define GCONFIG_HAVE_SETGROUPS 0
286 #endif
287 #endif
288 #if !defined(GCONFIG_HAVE_STATBUF_TIMESPEC)
289 #if defined(G_UNIX_MAC)
290 #define GCONFIG_HAVE_STATBUF_TIMESPEC 1
291 #else
292 #define GCONFIG_HAVE_STATBUF_TIMESPEC 0
293 #endif
294 #endif
295 #if !defined(GCONFIG_HAVE_STATBUF_NSEC)
296 #define GCONFIG_HAVE_STATBUF_NSEC 0
297 #endif
298 #if !defined(GCONFIG_HAVE_SIN6_LEN)
299 #define GCONFIG_HAVE_SIN6_LEN 0
300 #endif
301 #if !defined(GCONFIG_HAVE_SOCKLEN_T)
302 #define GCONFIG_HAVE_SOCKLEN_T 1
303 #endif
304 #if !defined(GCONFIG_HAVE_STDLIB_H)
305 #define GCONFIG_HAVE_STDLIB_H 1
306 #endif
307 #if !defined(GCONFIG_HAVE_STRNCPY_S)
308 #if ( defined(G_WINDOWS) && !defined(G_MINGW) ) || defined(strncpy_s)
309 #define GCONFIG_HAVE_STRNCPY_S 1
310 #else
311 #define GCONFIG_HAVE_STRNCPY_S 0
312 #endif
313 #endif
314 #if !defined(GCONFIG_HAVE_STRINGS_H)
315 #define GCONFIG_HAVE_STRINGS_H 1
316 #endif
317 #if !defined(GCONFIG_HAVE_STRING_H)
318 #define GCONFIG_HAVE_STRING_H 1
319 #endif
320 #if !defined(GCONFIG_HAVE_NDIR_H)
321 #define GCONFIG_HAVE_NDIR_H 0
322 #endif
323 #if !defined(GCONFIG_HAVE_SYS_DIR_H)
324 #define GCONFIG_HAVE_SYS_DIR_H 0
325 #endif
326 #if !defined(GCONFIG_HAVE_SYS_NDIR_H)
327 #define GCONFIG_HAVE_SYS_NDIR_H 0
328 #endif
329 #if !defined(GCONFIG_HAVE_SYS_STAT_H)
330 #define GCONFIG_HAVE_SYS_STAT_H 1
331 #endif
332 #if !defined(GCONFIG_HAVE_SYS_WAIT_H)
333 #ifdef G_UNIX
334 #define GCONFIG_HAVE_SYS_WAIT_H 1
335 #else
336 #define GCONFIG_HAVE_SYS_WAIT_H 0
337 #endif
338 #endif
339 #if !defined(GCONFIG_HAVE_SYS_TIME_H)
340 #define GCONFIG_HAVE_SYS_TIME_H 1
341 #endif
342 #if !defined(GCONFIG_HAVE_SYS_TYPES_H)
343 #define GCONFIG_HAVE_SYS_TYPES_H 1
344 #endif
345 #if !defined(GCONFIG_HAVE_UNISTD_H)
346 #ifdef G_UNIX
347 #define GCONFIG_HAVE_UNISTD_H 1
348 #else
349 #define GCONFIG_HAVE_UNISTD_H 0
350 #endif
351 #endif
352 #if !defined(GCONFIG_HAVE_ERRNO_H)
353 #define GCONFIG_HAVE_ERRNO_H 1
354 #endif
355 #if !defined(GCONFIG_HAVE_NET_IF_H)
356 #ifdef G_UNIX
357 #define GCONFIG_HAVE_NET_IF_H 1
358 #else
359 #define GCONFIG_HAVE_NET_IF_H 0
360 #endif
361 #endif
362 #if !defined(GCONFIG_HAVE_WINDOWS_IPHLPAPI_H)
363 #ifdef G_UNIX
364 #define GCONFIG_HAVE_WINDOWS_IPHLPAPI_H 0
365 #else
366 #define GCONFIG_HAVE_WINDOWS_IPHLPAPI_H 1
367 #endif
368 #endif
369 #if !defined(GCONFIG_HAVE_GAISTRERROR)
370 #define GCONFIG_HAVE_GAISTRERROR 1
371 #endif
372 #if !defined(GCONFIG_HAVE_INET_NTOP)
373 #define GCONFIG_HAVE_INET_NTOP 1
374 #endif
375 #if !defined(GCONFIG_HAVE_IFNAMETOINDEX)
376 #ifdef G_UNIX
377 #define GCONFIG_HAVE_IFNAMETOINDEX 1
378 #else
379 #define GCONFIG_HAVE_IFNAMETOINDEX 0
380 #endif
381 #endif
382 #if !defined(GCONFIG_HAVE_IFNAMETOLUID)
383 #if defined(G_WINDOWS) && !defined(G_MINGW)
384 #define GCONFIG_HAVE_IFNAMETOLUID 1
385 #else
386 #define GCONFIG_HAVE_IFNAMETOLUID 0
387 #endif
388 #endif
389 #if !defined(GCONFIG_HAVE_IFINDEX)
390 #ifdef G_UNIX_LINUX
391 #define GCONFIG_HAVE_IFINDEX 1
392 #else
393 #define GCONFIG_HAVE_IFINDEX 0
394 #endif
395 #endif
396 #if !defined(GCONFIG_HAVE_INET_PTON)
397 #define GCONFIG_HAVE_INET_PTON 1
398 #endif
399 #if !defined(GCONFIG_HAVE_UID_T)
400 #ifdef G_UNIX
401 #define GCONFIG_HAVE_UID_T 1
402 #else
403 #define GCONFIG_HAVE_UID_T 0
404 #endif
405 #endif
406 #if !defined(GCONFIG_HAVE_GID_T)
407 #define GCONFIG_HAVE_GID_T GCONFIG_HAVE_UID_T
408 #endif
409 #if !defined(GCONFIG_HAVE_UINTPTR_T)
410 #define GCONFIG_HAVE_UINTPTR_T 0
411 #endif
412 #if !defined(GCONFIG_HAVE_SSIZE_T)
413 #if defined(G_UNIX) || defined(G_MINGW)
414 #define GCONFIG_HAVE_SSIZE_T 1
415 #else
416 #define GCONFIG_HAVE_SSIZE_T 0
417 #endif
418 #endif
419 #if !defined(GCONFIG_HAVE_PID_T)
420 #if defined(G_UNIX) || defined(G_MINGW)
421 #define GCONFIG_HAVE_PID_T 1
422 #else
423 #define GCONFIG_HAVE_PID_T 0
424 #endif
425 #endif
426 #if !defined(GCONFIG_HAVE_GET_WINDOW_LONG_PTR)
427 #ifdef G_WINDOWS
428 #define GCONFIG_HAVE_GET_WINDOW_LONG_PTR 1
429 #else
430 #define GCONFIG_HAVE_GET_WINDOW_LONG_PTR 0
431 #endif
432 #endif
433 #if !defined(GCONFIG_HAVE_MREMAP)
434 #ifdef G_UNIX_LINUX
435 #define GCONFIG_HAVE_MREMAP 1
436 #else
437 #define GCONFIG_HAVE_MREMAP 0
438 #endif
439 #endif
440 #if !defined(GCONFIG_HAVE_TIMERFD)
441 #ifdef G_UNIX_LINUX
442 #define GCONFIG_HAVE_TIMERFD 1
443 #else
444 #define GCONFIG_HAVE_TIMERFD 0
445 #endif
446 #endif
447 #if !defined(GCONFIG_HAVE_PAM)
448 #ifdef G_UNIX
449 #define GCONFIG_HAVE_PAM 1
450 #else
451 #define GCONFIG_HAVE_PAM 0
452 #endif
453 #endif
454 #if !defined(GCONFIG_HAVE_PAM_IN_SECURITY)
455 #ifdef G_UNIX
456 #define GCONFIG_HAVE_PAM_IN_SECURITY 1
457 #else
458 #define GCONFIG_HAVE_PAM_IN_SECURITY 0
459 #endif
460 #endif
461 #if !defined(GCONFIG_HAVE_PAM_IN_INCLUDE)
462 #define GCONFIG_HAVE_PAM_IN_INCLUDE 0
463 #endif
464 #if !defined(GCONFIG_HAVE_PAM_IN_PAM)
465 #define GCONFIG_HAVE_PAM_IN_PAM 0
466 #endif
467 #if !defined(GCONFIG_PAM_CONST)
468 #if defined(G_UNIX_LINUX) || defined(G_UNIX_BSD)
469 #define GCONFIG_PAM_CONST 1
470 #else
471 #define GCONFIG_PAM_CONST 0
472 #endif
473 #endif
474 #if !defined(GCONFIG_HAVE_GET_NATIVE_SYSTEM_INFO)
475 #ifdef G_WINDOWS
476 #define GCONFIG_HAVE_GET_NATIVE_SYSTEM_INFO 1
477 #else
478 #define GCONFIG_HAVE_GET_NATIVE_SYSTEM_INFO 0
479 #endif
480 #endif
481 #if !defined(GCONFIG_HAVE_LIBJPEG)
482 #define GCONFIG_HAVE_LIBJPEG 0
483 #endif
484 #if !defined(GCONFIG_HAVE_LIBPNG)
485 #define GCONFIG_HAVE_LIBPNG 0
486 #endif
487 #if !defined(GCONFIG_HAVE_LIBAV)
488 #define GCONFIG_HAVE_LIBAV 0
489 #endif
490 #if !defined(GCONFIG_HAVE_CURSES)
491 #define GCONFIG_HAVE_CURSES 0
492 #endif
493 #if !defined(GCONFIG_HAVE_LIBEXIV)
494 #define GCONFIG_HAVE_LIBEXIV 0
495 #endif
496 #if !defined(GCONFIG_HAVE_V4L)
497 #ifdef G_UNIX_LINUX
498 #define GCONFIG_HAVE_V4L 1
499 #else
500 #define GCONFIG_HAVE_V4L 0
501 #endif
502 #endif
503 #if !defined(GCONFIG_HAVE_LIBV4L)
504 #define GCONFIG_HAVE_LIBV4L 0
505 #endif
506 #if !defined(GCONFIG_HAVE_GETTEXT)
507 /* see AM_GNU_GETTEXT */
508 #if defined(ENABLE_NLS) && ENABLE_NLS == 1
509 #define GCONFIG_HAVE_GETTEXT 1
510 #else
511 #define GCONFIG_HAVE_GETTEXT 0
512 #endif
513 #endif
514 #if !defined(GCONFIG_ENABLE_IPV6)
515 #define GCONFIG_ENABLE_IPV6 GCONFIG_HAVE_IPV6
516 #endif
517 #if !defined(GCONFIG_ENABLE_STD_THREAD)
518 #define GCONFIG_ENABLE_STD_THREAD 1
519 #endif
520 #if !defined(GCONFIG_HAVE_SEM_INIT)
521 #if defined(G_UNIX_LINUX) || defined(G_UNIX_FREEBSD)
522 #define GCONFIG_HAVE_SEM_INIT 1
523 #else
524 #define GCONFIG_HAVE_SEM_INIT 0
525 #endif
526 #endif
527 #if !defined(GCONFIG_HAVE_X11)
528 #ifdef G_UNIX
529 #define GCONFIG_HAVE_X11 1
530 #else
531 #define GCONFIG_HAVE_X11 0
532 #endif
533 #endif
534 #if !defined(GCONFIG_HAVE_WAYLAND)
535 #ifdef G_UNIX
536 #define GCONFIG_HAVE_WAYLAND 0
537 #else
538 #define GCONFIG_HAVE_WAYLAND 0
539 #endif
540 #endif
541 #if !defined(GCONFIG_HAVE_MBEDTLS)
542 #define GCONFIG_HAVE_MBEDTLS 1
543 #endif
544 #if !defined(GCONFIG_HAVE_MBEDTLS_NET_H)
545 #define GCONFIG_HAVE_MBEDTLS_NET_H 0
546 #endif
547 #if !defined(GCONFIG_MBEDTLS_DISABLE_PSA_HEADER)
548 #ifdef G_UNIX
549 #define GCONFIG_MBEDTLS_DISABLE_PSA_HEADER 0
550 #else
551 #define GCONFIG_MBEDTLS_DISABLE_PSA_HEADER 1
552 #endif
553 #endif
554 #if !defined(GCONFIG_HAVE_OPENSSL)
555 #ifdef G_UNIX
556 #define GCONFIG_HAVE_OPENSSL 1
557 #else
558 #define GCONFIG_HAVE_OPENSSL 0
559 #endif
560 #endif
561 #if !defined(GCONFIG_HAVE_OPENSSL_MIN_MAX)
562 #define GCONFIG_HAVE_OPENSSL_MIN_MAX 1
563 #endif
564 #if !defined(GCONFIG_HAVE_OPENSSL_SSLv23_METHOD)
565 #define GCONFIG_HAVE_OPENSSL_SSLv23_METHOD 0
566 #endif
567 #if !defined(GCONFIG_HAVE_OPENSSL_SSLv3_METHOD)
568 #define GCONFIG_HAVE_OPENSSL_SSLv3_METHOD 0
569 #endif
570 #if !defined(GCONFIG_HAVE_OPENSSL_TLSv1_1_METHOD)
571 #define GCONFIG_HAVE_OPENSSL_TLSv1_1_METHOD 1
572 #endif
573 #if !defined(GCONFIG_HAVE_OPENSSL_TLSv1_2_METHOD)
574 #define GCONFIG_HAVE_OPENSSL_TLSv1_2_METHOD 1
575 #endif
576 #if !defined(GCONFIG_HAVE_BOOST)
577 #ifdef G_UNIX_LINUX
578 #define GCONFIG_HAVE_BOOST 1
579 #else
580 #define GCONFIG_HAVE_BOOST 0
581 #endif
582 #endif
583 #if !defined(GCONFIG_HAVE_ALSA)
584 #ifdef G_UNIX_LINUX
585 #define GCONFIG_HAVE_ALSA 1
586 #else
587 #define GCONFIG_HAVE_ALSA 0
588 #endif
589 #endif
590 #if !defined(GCONFIG_HAVE_FMEMOPEN)
591 #if !defined(G_UNIX_OPENBSD)
592 #define GCONFIG_HAVE_FMEMOPEN 1
593 #else
594 #define GCONFIG_HAVE_FMEMOPEN 0
595 #endif
596 #endif
597 #if !defined(GCONFIG_HAVE_IP_MREQN)
598 #if defined(G_UNIX_LINUX) || defined(G_UNIX_FREEBSD)
599 #define GCONFIG_HAVE_IP_MREQN 1
600 #else
601 #define GCONFIG_HAVE_IP_MREQN 0
602 #endif
603 #endif
604 #if !defined(GCONFIG_HAVE_EXECVPE)
605 #ifdef G_UNIX_LINUX
606 #define GCONFIG_HAVE_EXECVPE 1
607 #else
608 #define GCONFIG_HAVE_EXECVPE 0
609 #endif
610 #endif
611 #if !defined(GCONFIG_HAVE_WINDOWS_CREATE_WAITABLE_TIMER_EX)
612 #if defined(G_WINDOWS) && !defined(G_MINGW)
613 #define GCONFIG_HAVE_WINDOWS_CREATE_WAITABLE_TIMER_EX 1
614 #else
615 #define GCONFIG_HAVE_WINDOWS_CREATE_WAITABLE_TIMER_EX 0
616 #endif
617 #endif
618 #if !defined(GCONFIG_HAVE_WINDOWS_CREATE_EVENT_EX)
619 #if defined(G_WINDOWS) && !defined(G_MINGW)
620 #define GCONFIG_HAVE_WINDOWS_CREATE_EVENT_EX 1
621 #else
622 #define GCONFIG_HAVE_WINDOWS_CREATE_EVENT_EX 0
623 #endif
624 #endif
625 #if !defined(GCONFIG_HAVE_WINDOWS_INIT_COMMON_CONTROLS_EX)
626 #if defined(G_WINDOWS) && !defined(G_MINGW)
627 #define GCONFIG_HAVE_WINDOWS_INIT_COMMON_CONTROLS_EX 1
628 #else
629 #define GCONFIG_HAVE_WINDOWS_INIT_COMMON_CONTROLS_EX 0
630 #endif
631 #endif
632 #if !defined(GCONFIG_HAVE_WINDOWS_VERSIONHELPERS_H)
633 #if defined(G_WINDOWS)
634 #define GCONFIG_HAVE_WINDOWS_VERSIONHELPERS_H 1
635 #else
636 #define GCONFIG_HAVE_WINDOWS_VERSIONHELPERS_H 0
637 #endif
638 #endif
639 #if !defined(GCONFIG_HAVE_WINDOWS_STARTUP_INFO_EX)
640 #if defined(G_WINDOWS) && !defined(G_MINGW)
641 #define GCONFIG_HAVE_WINDOWS_STARTUP_INFO_EX 1
642 #else
643 #define GCONFIG_HAVE_WINDOWS_STARTUP_INFO_EX 0
644 #endif
645 #endif
646 #if !defined(GCONFIG_HAVE_DLOPEN)
647 #ifdef G_UNIX
648 #define GCONFIG_HAVE_DLOPEN 1
649 #else
650 #define GCONFIG_HAVE_DLOPEN 0
651 #endif
652 #endif
653 #if !defined(GCONFIG_HAVE_FSOPEN)
654 #if defined(G_UNIX) || defined(G_MINGW)
655 #define GCONFIG_HAVE_FSOPEN 0
656 #else
657 #define GCONFIG_HAVE_FSOPEN 1
658 #endif
659 #endif
660 #if !defined(GCONFIG_HAVE_FOPEN_S)
661 #if defined(G_WINDOWS)
662 #define GCONFIG_HAVE_FOPEN_S 1
663 #else
664 #define GCONFIG_HAVE_FOPEN_S 0
665 #endif
666 #endif
667 #if !defined(GCONFIG_HAVE_SOPEN)
668 #if defined(G_UNIX) || defined(G_MINGW)
669 #define GCONFIG_HAVE_SOPEN 0
670 #else
671 #define GCONFIG_HAVE_SOPEN 1
672 #endif
673 #endif
674 #if !defined(GCONFIG_HAVE_SOPEN_S)
675 #if defined(G_UNIX) || defined(G_MINGW)
676 #define GCONFIG_HAVE_SOPEN_S 0
677 #else
678 #define GCONFIG_HAVE_SOPEN_S 1
679 #endif
680 #endif
681 #if !defined(GCONFIG_HAVE_EXTENDED_OPEN)
682 #if defined(G_UNIX) || defined(G_MINGW)
683 #define GCONFIG_HAVE_EXTENDED_OPEN 0
684 #else
685 #define GCONFIG_HAVE_EXTENDED_OPEN 1
686 #endif
687 #endif
688 #if !defined(GCONFIG_HAVE_SIGPROCMASK)
689 #if defined(G_UNIX)
690 #define GCONFIG_HAVE_SIGPROCMASK 1
691 #else
692 #define GCONFIG_HAVE_SIGPROCMASK 0
693 #endif
694 #endif
695 #if !defined(GCONFIG_HAVE_PTHREAD_SIGMASK)
696 #if defined(G_UNIX)
697 #define GCONFIG_HAVE_PTHREAD_SIGMASK 1
698 #else
699 #define GCONFIG_HAVE_PTHREAD_SIGMASK 0
700 #endif
701 #endif
702 #if !defined(GCONFIG_HAVE_DIRENT_D_TYPE)
703 #if defined(_DIRENT_HAVE_D_TYPE)
704 #define GCONFIG_HAVE_DIRENT_D_TYPE 1
705 #else
706 #define GCONFIG_HAVE_DIRENT_D_TYPE 0
707 #endif
708 #endif
709 #if !defined(GCONFIG_HAVE_IOVEC_SIMPLE)
710 #ifdef G_UNIX
711 #define GCONFIG_HAVE_IOVEC_SIMPLE 1
712 #else
713 #define GCONFIG_HAVE_IOVEC_SIMPLE 0
714 #endif
715 #endif
716 #if !defined(GCONFIG_HAVE_UDS)
717 #ifdef G_UNIX
718 #define GCONFIG_HAVE_UDS 1
719 #else
720 #define GCONFIG_HAVE_UDS 0
721 #endif
722 #endif
723 #if !defined(GCONFIG_HAVE_UDS_LEN)
724 #ifdef G_UNIX_BSD
725 #define GCONFIG_HAVE_UDS_LEN 1
726 #else
727 #define GCONFIG_HAVE_UDS_LEN 0
728 #endif
729 #endif
730
731 /* Include early o/s headers
732 */
733 #if defined(G_WINDOWS)
734 #ifndef WIN32_LEAN_AND_MEAN
735 #define WIN32_LEAN_AND_MEAN
736 #endif
737 #include <winsock2.h>
738 #include <windows.h>
739 #include <ws2tcpip.h>
740 #if GCONFIG_HAVE_WINDOWS_IPHLPAPI_H
741 #include <iphlpapi.h>
742 #endif
743 #if GCONFIG_HAVE_WINDOWS_VERSIONHELPERS_H
744 #include <versionhelpers.h>
745 #endif
746 #endif
747
748 /* Include commonly-used c++ headers
749 */
750 #ifdef __cplusplus
751 #include <cstddef>
752 #include <cstdlib>
753 #include <ios>
754 #include <iosfwd>
755 #else
756 #include <stddef.h>
757 #include <stdlib.h>
758 #endif
759
760 /* Include main o/s headers
761 */
762 #if defined(G_WINDOWS)
763 #include <shellapi.h>
764 #include <direct.h>
765 #include <share.h>
766 #endif
767 #if GCONFIG_HAVE_SYS_TYPES_H
768 #include <sys/types.h>
769 #endif
770 #if GCONFIG_HAVE_SYS_STAT_H
771 #include <sys/stat.h>
772 #endif
773 #if GCONFIG_HAVE_INTTYPES_H
774 #ifdef __cplusplus
775 #include <cinttypes>
776 #else
777 #include <inttypes.h>
778 #endif
779 #endif
780 #if GCONFIG_HAVE_STDINT_H
781 #ifdef __cplusplus
782 #include <cstdint>
783 #else
784 #include <stdint.h>
785 #endif
786 #endif
787 #if GCONFIG_HAVE_UNISTD_H
788 #include <unistd.h>
789 #endif
790 #if GCONFIG_HAVE_ERRNO_H
791 #ifdef __cplusplus
792 #include <cerrno>
793 #else
794 #include <errno.h>
795 #endif
796 #endif
797 #if GCONFIG_HAVE_SYS_WAIT_H
798 #include <sys/wait.h>
799 #endif
800 #if GCONFIG_HAVE_SYS_UTSNAME_H
801 #include <sys/utsname.h>
802 #endif
803 #if GCONFIG_HAVE_SYS_SELECT_H
804 #include <sys/select.h>
805 #endif
806 #if GCONFIG_HAVE_SYS_SOCKET_H
807 #include <sys/socket.h>
808 #endif
809 #ifndef MSG_NOSIGNAL
810 #define MSG_NOSIGNAL 0
811 #endif
812 #if GCONFIG_HAVE_SYS_MMAN_H
813 #include <sys/mman.h>
814 #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
815 #define MAP_ANONYMOUS MAP_ANON
816 #endif
817 #ifndef MREMAP_MAYMOVE
818 #define MREMAP_MAYMOVE 0
819 #endif
820 #endif
821 #if GCONFIG_HAVE_NETINET_IN_H
822 #include <netinet/in.h>
823 #endif
824 #if GCONFIG_HAVE_NETDB_H
825 #include <netdb.h>
826 #endif
827 #if GCONFIG_HAVE_ARPA_INET_H
828 #include <arpa/inet.h>
829 #endif
830 #if GCONFIG_HAVE_NET_IF_H
831 #include <net/if.h>
832 #endif
833 #if GCONFIG_HAVE_PWD_H
834 #include <pwd.h>
835 #endif
836 #if GCONFIG_HAVE_GRP_H
837 #include <grp.h>
838 #endif
839 #ifndef __cplusplus
840 #include <wchar.h>
841 #endif
842
843 #ifdef __cplusplus
844
845 /* Undefine some unwanted macros
846 */
847 #ifdef max
848 #undef max
849 #endif
850 #ifdef min
851 #undef min
852 #endif
853 #ifdef alignas
854 #undef alignas
855 #endif
856 #ifdef stdin
857 #undef stdin
858 #endif
859 #ifdef stdout
860 #undef stdout
861 #endif
862 #ifdef stderr
863 #undef stderr
864 #endif
865
866 /* Define a few Windows-style types under unix
867 */
868 #if ! defined(G_WINDOWS)
869 using BOOL = unsigned char ;
870 using HDC = unsigned int ;
871 using HWND = unsigned int ;
872 using HINSTANCE = unsigned int ;
873 using HANDLE = unsigned int ;
874 using TCHAR = wchar_t ;
875 using SOCKET = int ;
876 #endif
877
878 /* Define a null value for opaque pointer types that are
879 * never dereferenced
880 */
881 #define HNULL 0
882
883 /* Define fixed-size types - the underlying types should come
884 * from C99's stdint.h, but they are all optional
885 */
886 #if defined(G_WINDOWS)
887 #if GCONFIG_HAVE_INT64
888 using g_int64_t = INT64 ;
889 using g_uint64_t = UINT64 ;
890 #endif
891 #if GCONFIG_HAVE_INT32
892 using g_int32_t = INT32 ;
893 using g_uint32_t = UINT32 ;
894 #endif
895 #if GCONFIG_HAVE_INT16
896 using g_int16_t = INT16 ;
897 using g_uint16_t = UINT16 ;
898 #endif
899 #else
900 #if GCONFIG_HAVE_INT64
901 using g_int64_t = int64_t ;
902 using g_uint64_t = uint64_t ;
903 #endif
904 #if GCONFIG_HAVE_INT32
905 using g_int32_t = int32_t ;
906 using g_uint32_t = uint32_t ;
907 #endif
908 #if GCONFIG_HAVE_INT16
909 using g_int16_t = int16_t ;
910 using g_uint16_t = uint16_t ;
911 #endif
912 #endif
913 #if GCONFIG_HAVE_UINTPTR_T
914 using g_uintptr_t = uintptr_t ; // uintptr_t in C99 and C++2011
915 #else
916 using g_uintptr_t = std::size_t ; // assumes a non-segmented architecture - see also windows LONG_PTR
917 #endif
918 #if GCONFIG_HAVE_INT64
919 static_assert( sizeof(g_int64_t) == 8U , "uint64 wrong size" ) ;
920 static_assert( sizeof(g_uint64_t) == 8U , "int64 wrong size" ) ;
921 #endif
922 #if GCONFIG_HAVE_INT32
923 static_assert( sizeof(g_uint32_t) == 4U , "uint32 wrong size" ) ;
924 static_assert( sizeof(g_int32_t) == 4U , "int32 wrong size" ) ;
925 #endif
926 #if GCONFIG_HAVE_INT16
927 static_assert( sizeof(g_uint16_t) == 2U , "uint16 wrong size" ) ;
928 static_assert( sizeof(g_int16_t) == 2U , "int16 wrong size" ) ;
929 #endif
930 static_assert( sizeof(g_uintptr_t) >= sizeof(void*) , "" ) ; // try 'using g_uintptr_t = unsigned long'
931
932 /* Define missing standard types
933 */
934 #if ! GCONFIG_HAVE_UID_T
935 using uid_t = int ;
936 #endif
937 #if ! GCONFIG_HAVE_GID_T
938 using gid_t = int ;
939 #endif
940 #if ! GCONFIG_HAVE_SSIZE_T
941 #if defined(SSIZE_T)
942 using ssize_t = SSIZE_T ;
943 #else
944 /* read(2) return type -- 'int' on some unix systems */
945 using ssize_t = int ;
946 #endif
947 #endif
948 #if ! GCONFIG_HAVE_PID_T
949 using pid_t = unsigned int ;
950 #endif
951 #if ! GCONFIG_HAVE_SOCKLEN_T
952 using socklen_t = int ;
953 #endif
954 #if ! GCONFIG_HAVE_ERRNO_T
955 using errno_t = int ; // whatever_s() return type
956 #endif
957
958 /* Attributes
959 */
960 #if __cplusplus >= 201700L
961 #define GDEF_NORETURN_LHS [[noreturn]]
962 #define GDEF_UNUSED [[maybe_unused]]
963 #define GDEF_FALLTHROUGH [[fallthrough]];
964 #else
965 #if defined(__GNUC__) || defined(__clang__)
966 #define GDEF_NORETURN_RHS __attribute__((noreturn))
967 #define GDEF_UNUSED __attribute__((unused))
968 #if defined(__GNUC__) && __GNUC__ >= 7
969 #define GDEF_FALLTHROUGH __attribute__((fallthrough));
970 #endif
971 #if defined(__clang__) && __clang_major__ >= 10
972 #define GDEF_FALLTHROUGH __attribute__((fallthrough));
973 #endif
974 #endif
975 #if defined(_MSC_VER)
976 #define GDEF_NORETURN_LHS __declspec(noreturn)
977 #endif
978 #endif
979 #ifndef GDEF_NORETURN_LHS
980 #define GDEF_NORETURN_LHS
981 #endif
982 #ifndef GDEF_NORETURN_RHS
983 #define GDEF_NORETURN_RHS
984 #endif
985 #ifndef GDEF_UNUSED
986 #define GDEF_UNUSED
987 #endif
988 #ifndef GDEF_FALLTHROUGH
989 #define GDEF_FALLTHROUGH
990 #endif
991 #include <tuple>
992 namespace G { template <typename... T> inline void gdef_ignore( T&& ... ) {} }
993 #define GDEF_IGNORE_PARAMS(...) G::gdef_ignore(__VA_ARGS__)
994 #define GDEF_IGNORE_RETURN std::ignore =
995 #define GDEF_IGNORE_PARAM(name) std::ignore = name
996 #define GDEF_IGNORE_VARIABLE(name) std::ignore = name
997
998 /* C++ language backwards compatibility
999 */
1000 #if !GCONFIG_HAVE_CXX_STD_MAKE_UNIQUE
1001 #include <memory>
1002 #include <utility>
1003 namespace std // NOLINT
1004 {
1005 template <typename T, typename... Args>
1006 std::unique_ptr<T> make_unique( Args&&... args )
1007 {
1008 return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) ) ; // NOLINT
1009 }
1010 }
1011 #endif
1012
1013 /* Threading helper
1014 */
1015 #if GCONFIG_ENABLE_STD_THREAD
1016 #include <thread>
1017 #include <mutex>
1018 #include <cstring>
1019 namespace G
1020 {
1021 struct threading /// Helper class for std::thread capabilities.
1022 {
1023 static constexpr bool using_std_thread = true ;
1024 using thread_type = std::thread ;
1025 using mutex_type = std::mutex ;
1026 using lock_type = std::lock_guard<std::mutex> ;
1027 static bool works() ; // run-time test -- see gthread.cpp
1028 static void yield() noexcept { std::this_thread::yield() ; }
1029 } ;
1030 }
1031 #else
1032 namespace G
1033 {
1034 class dummy_thread
1035 {
1036 public:
1037 typedef int id ;
1038 template <typename T_fn> explicit dummy_thread( T_fn fn ) { fn() ; }
1039 template <typename T_fn,typename T_arg1> dummy_thread( T_fn fn , T_arg1 arg1 ) { fn(arg1) ; }
1040 template <typename T_fn,typename T_arg1,typename T_arg2> dummy_thread( T_fn fn , T_arg1 arg1 , T_arg2 arg2 ) { fn(arg1,arg2) ; }
1041 dummy_thread() {}
1042 bool joinable() const noexcept { return false ; }
1043 void detach() {}
1044 void join() {}
1045 id get_id() const { return 0 ; }
1046 } ;
1047 class dummy_mutex {} ;
1048 class dummy_lock { public: explicit dummy_lock( dummy_mutex & ) {} } ;
1049 struct threading
1050 {
1051 static constexpr bool using_std_thread = false ;
1052 using thread_type = G::dummy_thread ;
1053 using mutex_type = G::dummy_mutex ;
1054 using lock_type = G::dummy_lock ;
1055 static bool works() ;
1056 static void yield() noexcept {}
1057 } ;
1058 }
1059 #endif
1060
1061 /* Run-time o/s identification
1062 */
1063 namespace G
1064 {
1065 #ifdef G_WINDOWS
1066 inline constexpr bool is_windows() { return true ; }
1067 #else
1068 inline constexpr bool is_windows() { return false ; }
1069 #endif
1070 #ifdef G_MINGW
1071 inline constexpr bool is_wine() { return true ; }
1072 #else
1073 inline constexpr bool is_wine() { return false ; }
1074 #endif
1075 #ifdef G_UNIX_LINUX
1076 inline constexpr bool is_linux() { return true ; }
1077 #else
1078 inline constexpr bool is_linux() { return false ; }
1079 #endif
1080 #ifdef G_UNIX_FREEBSD
1081 inline constexpr bool is_free_bsd() { return true ; }
1082 #else
1083 inline constexpr bool is_free_bsd() { return false ; }
1084 #endif
1085 #ifdef G_UNIX_OPENBSD
1086 inline constexpr bool is_open_bsd() { return true ; }
1087 #else
1088 inline constexpr bool is_open_bsd() { return false ; }
1089 #endif
1090 #ifdef G_UNIX_BSD
1091 inline constexpr bool is_bsd() { return true ; }
1092 #else
1093 inline constexpr bool is_bsd() { return false ; }
1094 #endif
1095 }
1096
1097 /* Network code fix-ups
1098 */
1099
1100 using g_port_t = g_uint16_t ; /* since 'in_port_t' not always available */
1101
1102 #ifdef G_WINDOWS
1103 #ifdef G_MINGW
1104 #ifndef AI_NUMERICSERV
1105 #define AI_NUMERICSERV 0
1106 #endif
1107 #endif
1108 #ifndef MSG_NOSIGNAL
1109 #define MSG_NOSIGNAL 0
1110 #endif
1111 #endif
1112 #ifndef AI_ADDRCONFIG
1113 #define AI_ADDRCONFIG 0
1114 #endif
1115 #ifndef INADDR_NONE
1116 /* (should be in netinet/in.h) */
1117 #define INADDR_NONE 0xffffffff
1118 #endif
1119
1120 /* Inline portability shims
1121 */
1122
1123 #if GCONFIG_HAVE_IPV6
1124 inline void gdef_address6_init( sockaddr_in6 & s )
1125 {
1126 #if GCONFIG_HAVE_SIN6_LEN
1127 s.sin6_len = sizeof(s) ;
1128 #else
1129 (void) s ;
1130 #endif
1131 }
1132 #endif
1133
1134 /* Inline definitions of missing functions
1135 */
1136
1137 #if ! GCONFIG_HAVE_GAISTRERROR
1138 inline const char * gai_strerror( int ) // wrt getaddrinfo(3)
1139 {
1140 return nullptr ;
1141 }
1142 #endif
1143
1144 namespace GNet { int inet_pton_imp( int f , const char * p , void * result ) ; }
1145 #if ! GCONFIG_HAVE_INET_PTON
1146 inline int inet_pton( int f , const char * p , void * result )
1147 {
1148 return GNet::inet_pton_imp( f , p , result ) ;
1149 }
1150 #endif
1151
1152 namespace GNet { const char * inet_ntop_imp( int f , void * ap , char * buffer , std::size_t n ) ; }
1153 #if ! GCONFIG_HAVE_INET_NTOP
1154 inline const char * inet_ntop( int f , void * ap , char * buffer , std::size_t n )
1155 {
1156 return GNet::inet_ntop_imp( f , ap , buffer , n ) ;
1157 }
1158 #endif
1159
1160 #if GCONFIG_HAVE_PTHREAD_SIGMASK && GCONFIG_ENABLE_STD_THREAD
1161 #include <csignal>
1162 inline int gdef_pthread_sigmask( int how , const sigset_t * set_p , sigset_t * oldset_p ) noexcept
1163 {
1164 return pthread_sigmask( how , set_p , oldset_p ) ;
1165 }
1166 #else
1167 #if GCONFIG_HAVE_SIGPROCMASK
1168 #include <csignal>
1169 inline int gdef_pthread_sigmask( int how , const sigset_t * set_p , sigset_t * oldset_p ) noexcept
1170 {
1171 return sigprocmask( how , set_p , oldset_p ) ;
1172 }
1173 #else
1174 template <typename... T> int gdef_pthread_sigmask(T...) noexcept { return 0 ; }
1175 #endif
1176 #endif
1177
1178 #if GCONFIG_HAVE_IFNAMETOLUID
1179 #include <iphlpapi.h>
1180 inline unsigned long gdef_if_nametoindex( const char * p )
1181 {
1182 NET_LUID luid ;
1183 if( ConvertInterfaceNameToLuidA( p , &luid ) )
1184 {
1185 _set_errno( EINVAL ) ;
1186 return 0U ;
1187 }
1188 NET_IFINDEX result = 0 ;
1189 if( ConvertInterfaceLuidToIndex( &luid , &result ) != NO_ERROR )
1190 {
1191 _set_errno( EINVAL ) ;
1192 return 0U ;
1193 }
1194 _set_errno( 0 ) ;
1195 return result ;
1196 }
1197 #else
1198 #if GCONFIG_HAVE_IFNAMETOINDEX
1199 inline unsigned long gdef_if_nametoindex( const char * p )
1200 {
1201 #ifdef G_WINDOWS
1202 _set_errno( 0 ) ;
1203 #else
1204 errno = 0 ;
1205 #endif
1206 return if_nametoindex( p ) ; // int->long
1207 }
1208 #else
1209 inline unsigned long gdef_if_nametoindex( const char * )
1210 {
1211 #ifdef G_WINDOWS
1212 _set_errno( EINVAL ) ;
1213 #else
1214 errno = EINVAL ;
1215 #endif
1216 return 0UL ;
1217 }
1218 #endif
1219 #endif
1220 #if ! GCONFIG_HAVE_READLINK && !defined(readlink)
1221 inline ssize_t readlink( const char * , char * , std::size_t )
1222 {
1223 return -1 ;
1224 }
1225 #endif
1226 #if ! GCONFIG_HAVE_EXECVPE && !defined(execvpe) && defined(G_UNIX)
1227 inline int execvpe( const char * , char * [] , char * [] )
1228 {
1229 errno = EINVAL ;
1230 return -1 ;
1231 }
1232 #endif
1233
1234 #if GCONFIG_HAVE_GETPWNAM && ! GCONFIG_HAVE_GETPWNAM_R
1235 #include <pwd.h>
1236 inline int getpwnam_r( const char * name , struct passwd * pwd ,
1237 char * buf , std::size_t buflen , struct passwd ** result )
1238 {
1239 struct passwd * p = ::getpwnam( name ) ;
1240 if( p )
1241 {
1242 *pwd = *p ; /* string pointers still point into library storage */
1243 *result = pwd ;
1244 return 0 ;
1245 }
1246 else
1247 {
1248 *result = nullptr ;
1249 return 0 ;
1250 }
1251 }
1252 #endif
1253
1254 #if GCONFIG_HAVE_GETGRNAM && ! GCONFIG_HAVE_GETGRNAM_R
1255 #include <pwd.h>
1256 inline int getgrnam_r( const char * name , struct group * grp ,
1257 char * buf , std::size_t buflen , struct passwd ** result )
1258 {
1259 struct group * p = ::getgrnam( name ) ;
1260 if( p )
1261 {
1262 *grp = *p ; /* string pointers still point into library storage */
1263 *result = grp ;
1264 return 0 ;
1265 }
1266 else
1267 {
1268 *result = nullptr ;
1269 return 0 ;
1270 }
1271 }
1272 #endif
1273
1274 #if ! GCONFIG_HAVE_GMTIME_R && !defined(gmtime_r)
1275 #include <ctime>
1276 inline std::tm * gmtime_r( const std::time_t * tp , std::tm * tm_p )
1277 {
1278 #if GCONFIG_HAVE_GMTIME_S || defined(gmtime_s)
1279 errno_t e = gmtime_s( tm_p , tp ) ;
1280 if( e ) return nullptr ;
1281 return tm_p ;
1282 #else
1283 const struct std::tm * p = std::gmtime( tp ) ;
1284 if( p == 0 ) return nullptr ;
1285 *tm_p = *p ;
1286 return tm_p ;
1287 #endif
1288 }
1289 #endif
1290
1291 #if ! GCONFIG_HAVE_LOCALTIME_R && !defined(localtime_r)
1292 #include <ctime>
1293 inline struct std::tm * localtime_r( const std::time_t * tp , struct std::tm * tm_p )
1294 {
1295 #if GCONFIG_HAVE_LOCALTIME_S || defined(localtime_s)
1296 errno_t e = localtime_s( tm_p , tp ) ;
1297 if( e ) return nullptr ;
1298 return tm_p ;
1299 #else
1300 const struct std::tm * p = std::localtime( tp ) ;
1301 if( p == 0 ) return nullptr ;
1302 *tm_p = *p ;
1303 return tm_p ;
1304 #endif
1305 }
1306 #endif
1307
1308 #if ! GCONFIG_HAVE_LOCALTIME_S && !defined(localtime_s)
1309 #include <ctime>
1310 inline errno_t localtime_s( struct std::tm * tm_p , const std::time_t * tp )
1311 {
1312 const errno_t e_inval = 22 ;
1313 if( tm_p == nullptr ) return e_inval ;
1314 tm_p->tm_sec = tm_p->tm_min = tm_p->tm_hour = tm_p->tm_mday = tm_p->tm_mon =
1315 tm_p->tm_year = tm_p->tm_wday = tm_p->tm_yday = tm_p->tm_isdst = -1 ;
1316 if( tp == nullptr || *tp < 0 ) return e_inval ;
1317 const struct std::tm * p = std::localtime( tp ) ;
1318 if( p == nullptr ) return e_inval ;
1319 *tm_p = *p ;
1320 return 0 ;
1321 }
1322 #endif
1323
1324 #if ! GCONFIG_HAVE_GMTIME_S && !defined(gmtime_s)
1325 #include <ctime>
1326 inline errno_t gmtime_s( struct std::tm * tm_p , const std::time_t * tp )
1327 {
1328 const errno_t e_inval = 22 ;
1329 if( tm_p == nullptr ) return e_inval ;
1330 tm_p->tm_sec = tm_p->tm_min = tm_p->tm_hour = tm_p->tm_mday = tm_p->tm_mon =
1331 tm_p->tm_year = tm_p->tm_wday = tm_p->tm_yday = tm_p->tm_isdst = -1 ;
1332 if( tp == nullptr || *tp < 0 ) return e_inval ;
1333 const struct std::tm * p = std::gmtime( tp ) ;
1334 if( p == nullptr ) return e_inval ;
1335 *tm_p = *p ;
1336 return 0 ;
1337 }
1338 #endif
1339
1340 #if GCONFIG_HAVE_SETGROUPS
1341 #include <grp.h>
1342 #else
1343 inline int setgroups( std::size_t , const gid_t * )
1344 {
1345 return 0 ;
1346 }
1347 #endif
1348
1349 #if ! GCONFIG_HAVE_GET_WINDOW_LONG_PTR && defined(G_WINDOWS)
1350 static_assert( sizeof(void*) == 4U , "" ) ; // if this fails then we are on win64 so no need for this block at all
1351 const int GWLP_HINSTANCE = GWL_HINSTANCE ;
1352 const int GWLP_WNDPROC = GWL_WNDPROC ;
1353 const int DWLP_USER = DWL_USER ;
1354 inline LONG_PTR GetWindowLongPtr( HWND h , int id )
1355 {
1356 return static_cast<LONG_PTR>(::GetWindowLong(h,id)) ;
1357 }
1358 inline LONG_PTR SetWindowLongPtr( HWND h , int id , LONG_PTR value )
1359 {
1360 return static_cast<LONG_PTR>(::SetWindowLong(h,id,static_cast<LONG>(value))) ;
1361 }
1362 #endif
1363
1364 #if ! GCONFIG_HAVE_WINDOWS_VERSIONHELPERS_H && defined(G_WINDOWS)
1365 inline bool IsWindowsVistaOrGreater()
1366 {
1367 WORD major = HIBYTE( _WIN32_WINNT_VISTA ) ;
1368 WORD minor = LOBYTE( _WIN32_WINNT_VISTA ) ;
1369 OSVERSIONINFOEXW info {} ;
1370 info.dwOSVersionInfoSize = sizeof(info) ;
1371 info.dwMajorVersion = major ;
1372 info.dwMinorVersion = minor ;
1373 return !! VerifyVersionInfoW( &info , VER_MAJORVERSION | VER_MINORVERSION ,
1374 VerSetConditionMask( VerSetConditionMask(0,VER_MAJORVERSION,VER_GREATER_EQUAL) ,
1375 VER_MINORVERSION , VER_GREATER_EQUAL ) ) ;
1376 }
1377 #endif
1378
1379 #if ! GCONFIG_HAVE_MREMAP && defined(G_UNIX)
1380 inline void * mremap( void * , std::size_t , std::size_t , int )
1381 {
1382 errno = ENOSYS ;
1383 return (void*)(-1) ;
1384 }
1385 #endif
1386
1387 #if GCONFIG_HAVE_SETPGRP_BSD && defined(G_UNIX)
1388 inline int setpgrp()
1389 {
1390 return ::setpgrp( 0 , 0 ) ;
1391 }
1392 #endif
1393
1394 #if ! GCONFIG_HAVE_CXX_ALIGNMENT
1395 namespace std // NOLINT
1396 {
1397 // missing in gcc 4.8.4 -- original copyright 2001-2016 FSF Inc, GPLv3
1398 inline void * align( size_t align , size_t size , void * & ptr_inout , size_t & space ) noexcept
1399 {
1400 const auto ptr = reinterpret_cast<uintptr_t>( ptr_inout ) ;
1401 const auto aligned = ( ptr - 1U + align ) & -align ;
1402 const auto diff = aligned - ptr ;
1403 if( (size + diff) > space )
1404 {
1405 return nullptr ;
1406 }
1407 else
1408 {
1409 space -= diff ;
1410 ptr_inout = reinterpret_cast<void*>( aligned ) ;
1411 return ptr_inout ;
1412 }
1413 }
1414 }
1415 #endif
1416
1417 #endif
1418
1419#endif
Network classes.
Definition: gdef.h:1144
Low-level classes.
Definition: garg.h:30
STL namespace.
Helper class for std::thread capabilities.
Definition: gdef.h:1022