This source file includes following definitions.
- pcmk__xml_attr_value
1
2
3
4
5
6
7
8
9
10 #ifndef CRMCOMMON_PRIVATE__H
11 # define CRMCOMMON_PRIVATE__H
12
13
14
15
16
17 #include <stdint.h>
18 #include <stdbool.h>
19 #include <sys/types.h>
20 #include <glib.h>
21 #include <libxml/tree.h>
22 #include <qb/qbipcc.h>
23
24
25 #define PCMK__BUFFER_SIZE 4096
26
27
28
29
30
31 enum xml_private_flags {
32 xpf_none = 0x0000,
33 xpf_dirty = 0x0001,
34 xpf_deleted = 0x0002,
35 xpf_created = 0x0004,
36 xpf_modified = 0x0008,
37
38 xpf_tracking = 0x0010,
39 xpf_processed = 0x0020,
40 xpf_skip = 0x0040,
41 xpf_moved = 0x0080,
42
43 xpf_acl_enabled = 0x0100,
44 xpf_acl_read = 0x0200,
45 xpf_acl_write = 0x0400,
46 xpf_acl_deny = 0x0800,
47
48 xpf_acl_create = 0x1000,
49 xpf_acl_denied = 0x2000,
50 xpf_lazy = 0x4000,
51 };
52
53
54
55
56 typedef struct pcmk__deleted_xml_s {
57 char *path;
58 int position;
59 } pcmk__deleted_xml_t;
60
61 typedef struct xml_private_s {
62 long check;
63 uint32_t flags;
64 char *user;
65 GList *acls;
66 GList *deleted_objs;
67 } xml_private_t;
68
69 #define pcmk__set_xml_flags(xml_priv, flags_to_set) do { \
70 (xml_priv)->flags = pcmk__set_flags_as(__func__, __LINE__, \
71 LOG_NEVER, "XML", "XML node", (xml_priv)->flags, \
72 (flags_to_set), #flags_to_set); \
73 } while (0)
74
75 #define pcmk__clear_xml_flags(xml_priv, flags_to_clear) do { \
76 (xml_priv)->flags = pcmk__clear_flags_as(__func__, __LINE__, \
77 LOG_NEVER, "XML", "XML node", (xml_priv)->flags, \
78 (flags_to_clear), #flags_to_clear); \
79 } while (0)
80
81 G_GNUC_INTERNAL
82 void pcmk__xml2text(xmlNode *data, int options, char **buffer, int *offset,
83 int *max, int depth);
84
85 G_GNUC_INTERNAL
86 void pcmk__buffer_add_char(char **buffer, int *offset, int *max, char c);
87
88 G_GNUC_INTERNAL
89 void pcmk__set_xml_doc_flag(xmlNode *xml, enum xml_private_flags flag);
90
91 G_GNUC_INTERNAL
92 bool pcmk__tracking_xml_changes(xmlNode *xml, bool lazy);
93
94 G_GNUC_INTERNAL
95 int pcmk__element_xpath(const char *prefix, xmlNode *xml, char *buffer,
96 int offset, size_t buffer_size);
97
98 G_GNUC_INTERNAL
99 void pcmk__mark_xml_created(xmlNode *xml);
100
101 G_GNUC_INTERNAL
102 int pcmk__xml_position(xmlNode *xml, enum xml_private_flags ignore_if_set);
103
104 G_GNUC_INTERNAL
105 xmlNode *pcmk__xml_match(xmlNode *haystack, xmlNode *needle, bool exact);
106
107 G_GNUC_INTERNAL
108 void pcmk__xe_log(int log_level, const char *file, const char *function,
109 int line, const char *prefix, xmlNode *data, int depth,
110 int options);
111
112 G_GNUC_INTERNAL
113 void pcmk__xml_update(xmlNode *parent, xmlNode *target, xmlNode *update,
114 bool as_diff);
115
116 G_GNUC_INTERNAL
117 xmlNode *pcmk__xc_match(xmlNode *root, xmlNode *search_comment, bool exact);
118
119 G_GNUC_INTERNAL
120 void pcmk__xc_update(xmlNode *parent, xmlNode *target, xmlNode *update);
121
122 G_GNUC_INTERNAL
123 void pcmk__free_acls(GList *acls);
124
125 G_GNUC_INTERNAL
126 void pcmk__unpack_acl(xmlNode *source, xmlNode *target, const char *user);
127
128 G_GNUC_INTERNAL
129 bool pcmk__check_acl(xmlNode *xml, const char *name,
130 enum xml_private_flags mode);
131
132 G_GNUC_INTERNAL
133 void pcmk__apply_acl(xmlNode *xml);
134
135 G_GNUC_INTERNAL
136 void pcmk__apply_creation_acl(xmlNode *xml, bool check_top);
137
138 G_GNUC_INTERNAL
139 void pcmk__mark_xml_attr_dirty(xmlAttr *a);
140
141 G_GNUC_INTERNAL
142 bool pcmk__xa_filterable(const char *name);
143
144 static inline const char *
145 pcmk__xml_attr_value(const xmlAttr *attr)
146 {
147 return ((attr == NULL) || (attr->children == NULL))? NULL
148 : (const char *) attr->children->content;
149 }
150
151
152
153
154
155 #define PCMK__IPC_VERSION 1
156
157 #define PCMK__CONTROLD_API_MAJOR "1"
158 #define PCMK__CONTROLD_API_MINOR "0"
159
160
161 typedef struct pcmk__ipc_methods_s {
162
163
164
165
166
167
168
169
170 int (*new_data)(pcmk_ipc_api_t *api);
171
172
173
174
175
176
177
178 void (*free_data)(void *api_data);
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194 int (*post_connect)(pcmk_ipc_api_t *api);
195
196
197
198
199
200
201
202
203
204
205 bool (*reply_expected)(pcmk_ipc_api_t *api, xmlNode *request);
206
207
208
209
210
211
212
213
214 void (*dispatch)(pcmk_ipc_api_t *api, xmlNode *msg);
215
216
217
218
219
220
221
222 void (*post_disconnect)(pcmk_ipc_api_t *api);
223 } pcmk__ipc_methods_t;
224
225
226 struct pcmk_ipc_api_s {
227 enum pcmk_ipc_server server;
228 enum pcmk_ipc_dispatch dispatch_type;
229 size_t ipc_size_max;
230 crm_ipc_t *ipc;
231 mainloop_io_t *mainloop_io;
232 bool free_on_disconnect;
233 pcmk_ipc_callback_t cb;
234 void *user_data;
235 void *api_data;
236 pcmk__ipc_methods_t *cmds;
237 };
238
239 typedef struct pcmk__ipc_header_s {
240 struct qb_ipc_response_header qb;
241 uint32_t size_uncompressed;
242 uint32_t size_compressed;
243 uint32_t flags;
244 uint8_t version;
245 } pcmk__ipc_header_t;
246
247 G_GNUC_INTERNAL
248 int pcmk__send_ipc_request(pcmk_ipc_api_t *api, xmlNode *request);
249
250 G_GNUC_INTERNAL
251 void pcmk__call_ipc_callback(pcmk_ipc_api_t *api,
252 enum pcmk_ipc_event event_type,
253 crm_exit_t status, void *event_data);
254
255 G_GNUC_INTERNAL
256 unsigned int pcmk__ipc_buffer_size(unsigned int max);
257
258 G_GNUC_INTERNAL
259 bool pcmk__valid_ipc_header(const pcmk__ipc_header_t *header);
260
261 G_GNUC_INTERNAL
262 pcmk__ipc_methods_t *pcmk__controld_api_methods(void);
263
264 G_GNUC_INTERNAL
265 pcmk__ipc_methods_t *pcmk__pacemakerd_api_methods(void);
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307 int pcmk__crm_ipc_is_authentic_process(qb_ipcc_connection_t *qb_ipc, int sock, uid_t refuid, gid_t refgid,
308 pid_t *gotpid, uid_t *gotuid, gid_t *gotgid);
309
310
311 #endif