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 int pcmk__connect_generic_ipc(crm_ipc_t *ipc);
100 int pcmk__ipc_fd(crm_ipc_t *ipc, int *fd);
101 int pcmk__connect_ipc(pcmk_ipc_api_t *api, enum pcmk_ipc_dispatch dispatch_type,
102 int attempts);
103
104
105
106
107
108 typedef struct pcmk__client_s pcmk__client_t;
109
110 struct pcmk__remote_s {
111
112 char *buffer;
113 size_t buffer_size;
114 size_t buffer_offset;
115 int auth_timeout;
116 int tcp_socket;
117 mainloop_io_t *source;
118 time_t uptime;
119 char *start_state;
120
121
122 char *token;
123
124
125 #ifdef HAVE_GNUTLS_GNUTLS_H
126 gnutls_session_t *tls_session;
127 #endif
128 };
129
130 enum pcmk__client_flags {
131
132
133
134
135
136 pcmk__client_ipc = (UINT64_C(1) << 32),
137
138
139 pcmk__client_tcp = (UINT64_C(1) << 33),
140
141 #ifdef HAVE_GNUTLS_GNUTLS_H
142
143 pcmk__client_tls = (UINT64_C(1) << 34),
144 #endif
145
146
147
148
149 pcmk__client_proxied = (UINT64_C(1) << 40),
150
151
152 pcmk__client_privileged = (UINT64_C(1) << 41),
153
154
155 pcmk__client_to_proxy = (UINT64_C(1) << 42),
156
157
158
159
160
161
162 pcmk__client_authenticated = (UINT64_C(1) << 43),
163
164 #ifdef HAVE_GNUTLS_GNUTLS_H
165
166 pcmk__client_tls_handshake_complete = (UINT64_C(1) << 44),
167 #endif
168 };
169
170 #define PCMK__CLIENT_TYPE(client) ((client)->flags & UINT64_C(0xff00000000))
171
172 struct pcmk__client_s {
173 unsigned int pid;
174
175 char *id;
176 char *name;
177 char *user;
178 uint64_t flags;
179
180 int request_id;
181 void *userdata;
182
183 int event_timer;
184 GQueue *event_queue;
185
186
187
188
189
190 qb_ipcs_connection_t *ipcs;
191
192 struct pcmk__remote_s *remote;
193
194 unsigned int queue_backlog;
195 unsigned int queue_max;
196 };
197
198 #define pcmk__set_client_flags(client, flags_to_set) do { \
199 (client)->flags = pcmk__set_flags_as(__func__, __LINE__, \
200 LOG_TRACE, \
201 "Client", pcmk__client_name(client), \
202 (client)->flags, (flags_to_set), #flags_to_set); \
203 } while (0)
204
205 #define pcmk__clear_client_flags(client, flags_to_clear) do { \
206 (client)->flags = pcmk__clear_flags_as(__func__, __LINE__, \
207 LOG_TRACE, \
208 "Client", pcmk__client_name(client), \
209 (client)->flags, (flags_to_clear), #flags_to_clear); \
210 } while (0)
211
212 #define pcmk__set_ipc_flags(ipc_flags, ipc_name, flags_to_set) do { \
213 ipc_flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \
214 "IPC", (ipc_name), \
215 (ipc_flags), (flags_to_set), \
216 #flags_to_set); \
217 } while (0)
218
219 #define pcmk__clear_ipc_flags(ipc_flags, ipc_name, flags_to_clear) do { \
220 ipc_flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \
221 "IPC", (ipc_name), \
222 (ipc_flags), (flags_to_clear), \
223 #flags_to_clear); \
224 } while (0)
225
226 guint pcmk__ipc_client_count(void);
227 void pcmk__foreach_ipc_client(GHFunc func, gpointer user_data);
228
229 void pcmk__client_cleanup(void);
230
231 pcmk__client_t *pcmk__find_client(const qb_ipcs_connection_t *c);
232 pcmk__client_t *pcmk__find_client_by_id(const char *id);
233 const char *pcmk__client_name(const pcmk__client_t *c);
234 const char *pcmk__client_type_str(uint64_t client_type);
235
236 pcmk__client_t *pcmk__new_unauth_client(void *key);
237 pcmk__client_t *pcmk__new_client(qb_ipcs_connection_t *c, uid_t uid, gid_t gid);
238 void pcmk__free_client(pcmk__client_t *c);
239 void pcmk__drop_all_clients(qb_ipcs_service_t *s);
240 bool pcmk__set_client_queue_max(pcmk__client_t *client, const char *qmax);
241
242 xmlNode *pcmk__ipc_create_ack_as(const char *function, int line, uint32_t flags,
243 const char *tag, const char *ver, crm_exit_t status);
244 #define pcmk__ipc_create_ack(flags, tag, ver, st) \
245 pcmk__ipc_create_ack_as(__func__, __LINE__, (flags), (tag), (ver), (st))
246
247 int pcmk__ipc_send_ack_as(const char *function, int line, pcmk__client_t *c,
248 uint32_t request, uint32_t flags, const char *tag,
249 const char *ver, crm_exit_t status);
250 #define pcmk__ipc_send_ack(c, req, flags, tag, ver, st) \
251 pcmk__ipc_send_ack_as(__func__, __LINE__, (c), (req), (flags), (tag), (ver), (st))
252
253 int pcmk__ipc_prepare_iov(uint32_t request, const xmlNode *message,
254 uint32_t max_send_size,
255 struct iovec **result, ssize_t *bytes);
256 int pcmk__ipc_send_xml(pcmk__client_t *c, uint32_t request,
257 const xmlNode *message, uint32_t flags);
258 int pcmk__ipc_send_iov(pcmk__client_t *c, struct iovec *iov, uint32_t flags);
259 xmlNode *pcmk__client_data2xml(pcmk__client_t *c, void *data,
260 uint32_t *id, uint32_t *flags);
261
262 int pcmk__client_pid(qb_ipcs_connection_t *c);
263
264 void pcmk__serve_attrd_ipc(qb_ipcs_service_t **ipcs,
265 struct qb_ipcs_service_handlers *cb);
266 void pcmk__serve_fenced_ipc(qb_ipcs_service_t **ipcs,
267 struct qb_ipcs_service_handlers *cb);
268 void pcmk__serve_pacemakerd_ipc(qb_ipcs_service_t **ipcs,
269 struct qb_ipcs_service_handlers *cb);
270 qb_ipcs_service_t *pcmk__serve_schedulerd_ipc(struct qb_ipcs_service_handlers *cb);
271 qb_ipcs_service_t *pcmk__serve_controld_ipc(struct qb_ipcs_service_handlers *cb);
272
273 void pcmk__serve_based_ipc(qb_ipcs_service_t **ipcs_ro,
274 qb_ipcs_service_t **ipcs_rw,
275 qb_ipcs_service_t **ipcs_shm,
276 struct qb_ipcs_service_handlers *ro_cb,
277 struct qb_ipcs_service_handlers *rw_cb);
278
279 void pcmk__stop_based_ipc(qb_ipcs_service_t *ipcs_ro,
280 qb_ipcs_service_t *ipcs_rw,
281 qb_ipcs_service_t *ipcs_shm);
282
283 static inline const char *
284 pcmk__ipc_sys_name(const char *ipc_name, const char *fallback)
285 {
286 return ipc_name ? ipc_name : ((crm_system_name ? crm_system_name : fallback));
287 }
288
289 const char *pcmk__pcmkd_state_enum2friendly(enum pcmk_pacemakerd_state state);
290
291 const char *pcmk__controld_api_reply2str(enum pcmk_controld_api_reply reply);
292 const char *pcmk__pcmkd_api_reply2str(enum pcmk_pacemakerd_api_reply reply);
293
294 #ifdef __cplusplus
295 }
296 #endif
297
298 #endif