1 /*
2 * Copyright 2001-2023 the Pacemaker project contributors
3 *
4 * The version control history for this file may have further details.
5 *
6 * This source code is licensed under the GNU Lesser General Public License
7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
8 */
9 #ifndef PCMK__PORTABILITY__H
10 # define PCMK__PORTABILITY__H
11
12 /* This header provides replacements for required definitions and declarations
13 * that certain supported build environments don't provide
14 */
15
16 /* This header *MUST* be included before any system headers, because the
17 * following definition can change the behavior of some of them.
18 */
19 # undef _GNU_SOURCE /* in case it was defined on the command line */
20 # define _GNU_SOURCE
21
22 /* Please leave this as the first #include - Solaris needs it there */
23 # ifdef HAVE_CONFIG_H
24 # ifndef PCMK__CONFIG_H
25 # define PCMK__CONFIG_H
26 # include <config.h>
27 # endif
28 # endif
29
30 # if HAVE_DBUS
31 # ifndef HAVE_DBUSBASICVALUE
32 # include <stdint.h>
33 # include <dbus/dbus.h>
34 /**
35 * An 8-byte struct you could use to access int64 without having
36 * int64 support
37 */
38 typedef struct
39 {
40 uint32_t first32; /**< first 32 bits in the 8 bytes (beware endian issues) */
41 uint32_t second32; /**< second 32 bits in the 8 bytes (beware endian issues) */
42 } DBus8ByteStruct;
43
44 /**
45 * A simple value union that lets you access bytes as if they
46 * were various types; useful when dealing with basic types via
47 * void pointers and varargs.
48 *
49 * This union also contains a pointer member (which can be used
50 * to retrieve a string from dbus_message_iter_get_basic(), for
51 * instance), so on future platforms it could conceivably be larger
52 * than 8 bytes.
53 */
54 typedef union
55 {
56 unsigned char bytes[8]; /**< as 8 individual bytes */
57 int16_t i16; /**< as int16 */
58 uint16_t u16; /**< as int16 */
59 int32_t i32; /**< as int32 */
60 uint32_t u32; /**< as int32 */
61 uint32_t bool_val; /**< as boolean */
62 # ifdef DBUS_HAVE_INT64
63 int64_t i64; /**< as int64 */
64 uint64_t u64; /**< as int64 */
65 # endif
66 DBus8ByteStruct eight; /**< as 8-byte struct */
67 double dbl; /**< as double */
68 unsigned char byt; /**< as byte */
69 char *str; /**< as char* (string, object path or signature) */
70 int fd; /**< as Unix file descriptor */
71 } DBusBasicValue;
72 # endif // !defined(HAVE_DBUSBASICVALUE)
73 # endif // !defined(HAVE_DBUS)
74
75 // Replacement constants for Linux-specific errno values
76
77 # include <errno.h>
78
79 # ifndef ENOTUNIQ
80 # define PCMK__ENOTUNIQ
81 # define ENOTUNIQ 190
82 # endif
83
84 # ifndef ECOMM
85 # define PCMK__ECOMM
86 # define ECOMM 191
87 # endif
88
89 # ifndef ELIBACC
90 # define PCMK__ELIBACC
91 # define ELIBACC 192
92 # endif
93
94 # ifndef EREMOTEIO
95 # define PCMK__EREMOTIO
96 # define EREMOTEIO 193
97 # endif
98
99 # ifndef ENOKEY
100 # define PCMK__ENOKEY
101 # define ENOKEY 195
102 # endif
103
104 # ifndef ENODATA
105 # define PCMK__ENODATA
106 # define ENODATA 196
107 # endif
108
109 # ifndef ETIME
110 # define PCMK__ETIME
111 # define ETIME 197
112 # endif
113
114 # ifndef EKEYREJECTED
115 # define PCMK__EKEYREJECTED
116 # define EKEYREJECTED 200
117 # endif
118
119 #endif // PCMK__PORTABILITY__H