This source file includes following definitions.
- pcmk__ipc_sys_name
1
2
3
4
5
6
7
8
9
10 #ifndef PCMK__IPC_INTERNAL_H
11 #define PCMK__IPC_INTERNAL_H
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 #include <stdbool.h>
18 #include <stdint.h>
19 #include <sys/uio.h>
20 #include <sys/types.h>
21
22 #ifdef HAVE_GNUTLS_GNUTLS_H
23 # include <gnutls/gnutls.h>
24 #endif
25
26 #include <glib.h>
27 #include <libxml/tree.h>
28 #include <qb/qbipcs.h>
29
30 #include <crm_config.h>
31 #include <crm/common/ipc.h>
32 #include <crm/common/ipc_controld.h>
33 #include <crm/common/ipc_pacemakerd.h>
34 #include <crm/common/mainloop.h>
35
36
37
38
39
40 #define PCMK__XA_IPC_PROTO_VERSION "ipc-protocol-version"
41
42
43
44
45
46
47
48
49 #define PCMK__SPECIAL_PID 1
50
51
52 #define PCMK__IPC_TIMEOUT 120
53
54 #if defined(HAVE_GETPEEREID)
55
56
57
58
59 #define PCMK__SPECIAL_PID_AS_0(p) (((p) == PCMK__SPECIAL_PID) ? 0 : (p))
60 #else
61 #define PCMK__SPECIAL_PID_AS_0(p) (p)
62 #endif
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 int pcmk__ipc_is_authentic_process_active(const char *name, uid_t refuid,
97 gid_t refgid, pid_t *gotpid);
98
99
100
101
102
103
104 typedef struct pcmk__client_s pcmk__client_t;
105
106 struct pcmk__remote_s {
107
108 char *buffer;
109 size_t buffer_size;
110 size_t buffer_offset;
111 int auth_timeout;
112 int tcp_socket;
113 mainloop_io_t *source;
114 time_t uptime;
115
116
117 char *token;
118
119
120 # ifdef HAVE_GNUTLS_GNUTLS_H
121 gnutls_session_t *tls_session;
122 # endif
123 };
124
125 enum pcmk__client_flags {
126
127
128
129
130
131 pcmk__client_ipc = (UINT64_C(1) << 32),
132
133
134 pcmk__client_tcp = (UINT64_C(1) << 33),
135
136 # ifdef HAVE_GNUTLS_GNUTLS_H
137
138 pcmk__client_tls = (UINT64_C(1) << 34),
139 # endif
140
141
142
143
144 pcmk__client_proxied = (UINT64_C(1) << 40),
145
146
147 pcmk__client_privileged = (UINT64_C(1) << 41),
148
149
150 pcmk__client_to_proxy = (UINT64_C(1) << 42),
151
152
153
154
155
156
157 pcmk__client_authenticated = (UINT64_C(1) << 43),
158
159 # ifdef HAVE_GNUTLS_GNUTLS_H
160
161 pcmk__client_tls_handshake_complete = (UINT64_C(1) << 44),
162 # endif
163 };
164
165 #define PCMK__CLIENT_TYPE(client) ((client)->flags & UINT64_C(0xff00000000))
166
167 struct pcmk__client_s {
168 unsigned int pid;
169
170 char *id;
171 char *name;
172 char *user;
173 uint64_t flags;
174
175 int request_id;
176 void *userdata;
177
178 int event_timer;
179 GQueue *event_queue;
180
181
182
183
184
185 qb_ipcs_connection_t *ipcs;
186
187 struct pcmk__remote_s *remote;
188
189 unsigned int queue_backlog;
190 unsigned int queue_max;
191 };
192
193 #define pcmk__set_client_flags(client, flags_to_set) do { \
194 (client)->flags = pcmk__set_flags_as(__func__, __LINE__, \
195 LOG_TRACE, \
196 "Client", pcmk__client_name(client), \
197 (client)->flags, (flags_to_set), #flags_to_set); \
198 } while (0)
199
200 #define pcmk__clear_client_flags(client, flags_to_clear) do { \
201 (client)->flags = pcmk__clear_flags_as(__func__, __LINE__, \
202 LOG_TRACE, \
203 "Client", pcmk__client_name(client), \
204 (client)->flags, (flags_to_clear), #flags_to_clear); \
205 } while (0)
206
207 #define pcmk__set_ipc_flags(ipc_flags, ipc_name, flags_to_set) do { \
208 ipc_flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \
209 "IPC", (ipc_name), \
210 (ipc_flags), (flags_to_set), \
211 #flags_to_set); \
212 } while (0)
213
214 #define pcmk__clear_ipc_flags(ipc_flags, ipc_name, flags_to_clear) do { \
215 ipc_flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \
216 "IPC", (ipc_name), \
217 (ipc_flags), (flags_to_clear), \
218 #flags_to_clear); \
219 } while (0)
220
221 guint pcmk__ipc_client_count(void);
222 void pcmk__foreach_ipc_client(GHFunc func, gpointer user_data);
223
224 void pcmk__client_cleanup(void);
225
226 pcmk__client_t *pcmk__find_client(const qb_ipcs_connection_t *c);
227 pcmk__client_t *pcmk__find_client_by_id(const char *id);
228 const char *pcmk__client_name(const pcmk__client_t *c);
229 const char *pcmk__client_type_str(uint64_t client_type);
230
231 pcmk__client_t *pcmk__new_unauth_client(void *key);
232 pcmk__client_t *pcmk__new_client(qb_ipcs_connection_t *c, uid_t uid, gid_t gid);
233 void pcmk__free_client(pcmk__client_t *c);
234 void pcmk__drop_all_clients(qb_ipcs_service_t *s);
235 bool pcmk__set_client_queue_max(pcmk__client_t *client, const char *qmax);
236
237 xmlNode *pcmk__ipc_create_ack_as(const char *function, int line, uint32_t flags,
238 const char *tag, const char *ver, crm_exit_t status);
239 #define pcmk__ipc_create_ack(flags, tag, ver, st) \
240 pcmk__ipc_create_ack_as(__func__, __LINE__, (flags), (tag), (ver), (st))
241
242 int pcmk__ipc_send_ack_as(const char *function, int line, pcmk__client_t *c,
243 uint32_t request, uint32_t flags, const char *tag,
244 const char *ver, crm_exit_t status);
245 #define pcmk__ipc_send_ack(c, req, flags, tag, ver, st) \
246 pcmk__ipc_send_ack_as(__func__, __LINE__, (c), (req), (flags), (tag), (ver), (st))
247
248 int pcmk__ipc_prepare_iov(uint32_t request, xmlNode *message,
249 uint32_t max_send_size,
250 struct iovec **result, ssize_t *bytes);
251 int pcmk__ipc_send_xml(pcmk__client_t *c, uint32_t request, xmlNode *message,
252 uint32_t flags);
253 int pcmk__ipc_send_iov(pcmk__client_t *c, struct iovec *iov, uint32_t flags);
254 xmlNode *pcmk__client_data2xml(pcmk__client_t *c, void *data,
255 uint32_t *id, uint32_t *flags);
256
257 int pcmk__client_pid(qb_ipcs_connection_t *c);
258
259 void pcmk__serve_attrd_ipc(qb_ipcs_service_t **ipcs,
260 struct qb_ipcs_service_handlers *cb);
261 void pcmk__serve_fenced_ipc(qb_ipcs_service_t **ipcs,
262 struct qb_ipcs_service_handlers *cb);
263 void pcmk__serve_pacemakerd_ipc(qb_ipcs_service_t **ipcs,
264 struct qb_ipcs_service_handlers *cb);
265 qb_ipcs_service_t *pcmk__serve_schedulerd_ipc(struct qb_ipcs_service_handlers *cb);
266 qb_ipcs_service_t *pcmk__serve_controld_ipc(struct qb_ipcs_service_handlers *cb);
267
268 void pcmk__serve_based_ipc(qb_ipcs_service_t **ipcs_ro,
269 qb_ipcs_service_t **ipcs_rw,
270 qb_ipcs_service_t **ipcs_shm,
271 struct qb_ipcs_service_handlers *ro_cb,
272 struct qb_ipcs_service_handlers *rw_cb);
273
274 void pcmk__stop_based_ipc(qb_ipcs_service_t *ipcs_ro,
275 qb_ipcs_service_t *ipcs_rw,
276 qb_ipcs_service_t *ipcs_shm);
277
278 static inline const char *
279 pcmk__ipc_sys_name(const char *ipc_name, const char *fallback)
280 {
281 return ipc_name ? ipc_name : ((crm_system_name ? crm_system_name : fallback));
282 }
283
284 const char *pcmk__pcmkd_state_enum2friendly(enum pcmk_pacemakerd_state state);
285
286 const char *pcmk__controld_api_reply2str(enum pcmk_controld_api_reply reply);
287 const char *pcmk__pcmkd_api_reply2str(enum pcmk_pacemakerd_api_reply reply);
288
289 #ifdef __cplusplus
290 }
291 #endif
292
293 #endif