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 #if defined(US_AUTH_GETPEEREID)
44
45
46
47
48 #define PCMK__SPECIAL_PID_AS_0(p) (((p) == PCMK__SPECIAL_PID) ? 0 : (p))
49 #else
50 #define PCMK__SPECIAL_PID_AS_0(p) (p)
51 #endif
52
53
54
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 int pcmk__ipc_is_authentic_process_active(const char *name, uid_t refuid,
86 gid_t refgid, pid_t *gotpid);
87
88
89
90
91
92
93 typedef struct pcmk__client_s pcmk__client_t;
94
95 struct pcmk__remote_s {
96
97 char *buffer;
98 size_t buffer_size;
99 size_t buffer_offset;
100 int auth_timeout;
101 int tcp_socket;
102 mainloop_io_t *source;
103
104
105 bool authenticated;
106 char *token;
107
108
109 # ifdef HAVE_GNUTLS_GNUTLS_H
110 gnutls_session_t *tls_session;
111 bool tls_handshake_complete;
112 # endif
113 };
114
115 enum pcmk__client_flags {
116
117
118
119 pcmk__client_ipc = (UINT64_C(1) << 32),
120 pcmk__client_tcp = (UINT64_C(1) << 33),
121 # ifdef HAVE_GNUTLS_GNUTLS_H
122 pcmk__client_tls = (UINT64_C(1) << 34),
123 # endif
124
125
126 pcmk__client_proxied = (UINT64_C(1) << 40),
127 pcmk__client_privileged = (UINT64_C(1) << 41),
128 pcmk__client_to_proxy = (UINT64_C(1) << 42),
129 };
130
131 #define PCMK__CLIENT_TYPE(client) ((client)->flags & UINT64_C(0xff00000000))
132
133 struct pcmk__client_s {
134 unsigned int pid;
135
136 uid_t uid;
137 gid_t gid;
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", ((client)->name? (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", ((client)->name? (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 qb_ipcs_service_t *pcmk__serve_controld_ipc(struct qb_ipcs_service_handlers *cb);
228
229 void pcmk__serve_based_ipc(qb_ipcs_service_t **ipcs_ro,
230 qb_ipcs_service_t **ipcs_rw,
231 qb_ipcs_service_t **ipcs_shm,
232 struct qb_ipcs_service_handlers *ro_cb,
233 struct qb_ipcs_service_handlers *rw_cb);
234
235 void pcmk__stop_based_ipc(qb_ipcs_service_t *ipcs_ro,
236 qb_ipcs_service_t *ipcs_rw,
237 qb_ipcs_service_t *ipcs_shm);
238
239 #ifdef __cplusplus
240 }
241 #endif
242
243 #endif