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/mainloop.h>
33
34
35
36
37
38
39
40
41 #define PCMK__SPECIAL_PID 1
42
43
44 #define PCMK__IPC_TIMEOUT 120
45
46 #if defined(US_AUTH_GETPEEREID)
47
48
49
50
51 #define PCMK__SPECIAL_PID_AS_0(p) (((p) == PCMK__SPECIAL_PID) ? 0 : (p))
52 #else
53 #define PCMK__SPECIAL_PID_AS_0(p) (p)
54 #endif
55
56
57
58
59
60
61
62
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 int pcmk__ipc_is_authentic_process_active(const char *name, uid_t refuid,
89 gid_t refgid, pid_t *gotpid);
90
91
92
93
94
95
96 typedef struct pcmk__client_s pcmk__client_t;
97
98 struct pcmk__remote_s {
99
100 char *buffer;
101 size_t buffer_size;
102 size_t buffer_offset;
103 int auth_timeout;
104 int tcp_socket;
105 mainloop_io_t *source;
106
107
108 bool authenticated;
109 char *token;
110
111
112 # ifdef HAVE_GNUTLS_GNUTLS_H
113 gnutls_session_t *tls_session;
114 bool tls_handshake_complete;
115 # endif
116 };
117
118 enum pcmk__client_flags {
119
120
121
122 pcmk__client_ipc = (UINT64_C(1) << 32),
123 pcmk__client_tcp = (UINT64_C(1) << 33),
124 # ifdef HAVE_GNUTLS_GNUTLS_H
125 pcmk__client_tls = (UINT64_C(1) << 34),
126 # endif
127
128
129 pcmk__client_proxied = (UINT64_C(1) << 40),
130 pcmk__client_privileged = (UINT64_C(1) << 41),
131 pcmk__client_to_proxy = (UINT64_C(1) << 42),
132 };
133
134 #define PCMK__CLIENT_TYPE(client) ((client)->flags & UINT64_C(0xff00000000))
135
136 struct pcmk__client_s {
137 unsigned int pid;
138
139 char *id;
140 char *name;
141 char *user;
142 uint64_t flags;
143
144 int request_id;
145 void *userdata;
146
147 int event_timer;
148 GQueue *event_queue;
149
150
151
152
153
154 qb_ipcs_connection_t *ipcs;
155
156 struct pcmk__remote_s *remote;
157
158 unsigned int queue_backlog;
159 unsigned int queue_max;
160 };
161
162 #define pcmk__set_client_flags(client, flags_to_set) do { \
163 (client)->flags = pcmk__set_flags_as(__func__, __LINE__, \
164 LOG_TRACE, \
165 "Client", pcmk__client_name(client), \
166 (client)->flags, (flags_to_set), #flags_to_set); \
167 } while (0)
168
169 #define pcmk__clear_client_flags(client, flags_to_clear) do { \
170 (client)->flags = pcmk__clear_flags_as(__func__, __LINE__, \
171 LOG_TRACE, \
172 "Client", pcmk__client_name(client), \
173 (client)->flags, (flags_to_clear), #flags_to_clear); \
174 } while (0)
175
176 #define pcmk__set_ipc_flags(ipc_flags, ipc_name, flags_to_set) do { \
177 ipc_flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE, \
178 "IPC", (ipc_name), \
179 (ipc_flags), (flags_to_set), \
180 #flags_to_set); \
181 } while (0)
182
183 #define pcmk__clear_ipc_flags(ipc_flags, ipc_name, flags_to_clear) do { \
184 ipc_flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE, \
185 "IPC", (ipc_name), \
186 (ipc_flags), (flags_to_clear), \
187 #flags_to_clear); \
188 } while (0)
189
190 guint pcmk__ipc_client_count(void);
191 void pcmk__foreach_ipc_client(GHFunc func, gpointer user_data);
192
193 void pcmk__client_cleanup(void);
194
195 pcmk__client_t *pcmk__find_client(qb_ipcs_connection_t *c);
196 pcmk__client_t *pcmk__find_client_by_id(const char *id);
197 const char *pcmk__client_name(pcmk__client_t *c);
198 const char *pcmk__client_type_str(uint64_t client_type);
199
200 pcmk__client_t *pcmk__new_unauth_client(void *key);
201 pcmk__client_t *pcmk__new_client(qb_ipcs_connection_t *c, uid_t uid, gid_t gid);
202 void pcmk__free_client(pcmk__client_t *c);
203 void pcmk__drop_all_clients(qb_ipcs_service_t *s);
204 bool pcmk__set_client_queue_max(pcmk__client_t *client, const char *qmax);
205
206 int pcmk__ipc_send_ack_as(const char *function, int line, pcmk__client_t *c,
207 uint32_t request, uint32_t flags, const char *tag,
208 crm_exit_t status);
209 #define pcmk__ipc_send_ack(c, req, flags, tag, st) \
210 pcmk__ipc_send_ack_as(__func__, __LINE__, (c), (req), (flags), (tag), (st))
211
212 int pcmk__ipc_prepare_iov(uint32_t request, xmlNode *message,
213 uint32_t max_send_size,
214 struct iovec **result, ssize_t *bytes);
215 int pcmk__ipc_send_xml(pcmk__client_t *c, uint32_t request, xmlNode *message,
216 uint32_t flags);
217 int pcmk__ipc_send_iov(pcmk__client_t *c, struct iovec *iov, uint32_t flags);
218 xmlNode *pcmk__client_data2xml(pcmk__client_t *c, void *data,
219 uint32_t *id, uint32_t *flags);
220
221 int pcmk__client_pid(qb_ipcs_connection_t *c);
222
223 void pcmk__serve_attrd_ipc(qb_ipcs_service_t **ipcs,
224 struct qb_ipcs_service_handlers *cb);
225 void pcmk__serve_fenced_ipc(qb_ipcs_service_t **ipcs,
226 struct qb_ipcs_service_handlers *cb);
227 void pcmk__serve_pacemakerd_ipc(qb_ipcs_service_t **ipcs,
228 struct qb_ipcs_service_handlers *cb);
229 qb_ipcs_service_t *pcmk__serve_controld_ipc(struct qb_ipcs_service_handlers *cb);
230
231 void pcmk__serve_based_ipc(qb_ipcs_service_t **ipcs_ro,
232 qb_ipcs_service_t **ipcs_rw,
233 qb_ipcs_service_t **ipcs_shm,
234 struct qb_ipcs_service_handlers *ro_cb,
235 struct qb_ipcs_service_handlers *rw_cb);
236
237 void pcmk__stop_based_ipc(qb_ipcs_service_t *ipcs_ro,
238 qb_ipcs_service_t *ipcs_rw,
239 qb_ipcs_service_t *ipcs_shm);
240
241 #ifdef __cplusplus
242 }
243 #endif
244
245 #endif