This source file includes following definitions.
- pcmk__is_privileged
- pcmk__open_devnull
- pcmk__set_flags_as
- pcmk__clear_flags_as
- pcmk__realloc
- pcmk__getpid_s
- pcmk__list_of_1
- pcmk__list_of_multiple
- pcmk__fail_attr_name
- pcmk__failcount_name
- pcmk__lastfailure_name
1
2
3
4
5
6
7
8
9
10 #ifndef CRM_COMMON_INTERNAL__H
11 #define CRM_COMMON_INTERNAL__H
12
13 #include <unistd.h>
14 #include <stdbool.h>
15 #include <stdint.h>
16 #include <string.h>
17 #include <fcntl.h>
18 #include <sys/types.h>
19
20 #include <glib.h>
21 #include <libxml/tree.h>
22
23 #include <crm/common/util.h>
24 #include <crm/common/logging.h>
25 #include <crm/common/mainloop.h>
26 #include <crm/common/strings_internal.h>
27
28
29
30 char *pcmk__uid2username(uid_t uid);
31 const char *pcmk__update_acl_user(xmlNode *request, const char *field,
32 const char *peer_user);
33
34 #if ENABLE_ACL
35 # include <string.h>
36 static inline bool
37 pcmk__is_privileged(const char *user)
38 {
39 return user && (!strcmp(user, CRM_DAEMON_USER) || !strcmp(user, "root"));
40 }
41 #endif
42
43
44 #if SUPPORT_CIBSECRETS
45
46
47 int pcmk__substitute_secrets(const char *rsc_id, GHashTable *params);
48 #endif
49
50
51
52
53 bool pcmk__verify_digest(xmlNode *input, const char *expected);
54
55
56
57
58 int pcmk__real_path(const char *path, char **resolved_path);
59
60 char *pcmk__series_filename(const char *directory, const char *series,
61 int sequence, bool bzip);
62 int pcmk__read_series_sequence(const char *directory, const char *series,
63 unsigned int *seq);
64 void pcmk__write_series_sequence(const char *directory, const char *series,
65 unsigned int sequence, int max);
66 int pcmk__chown_series_sequence(const char *directory, const char *series,
67 uid_t uid, gid_t gid);
68
69 int pcmk__build_path(const char *path_c, mode_t mode);
70 bool pcmk__daemon_can_write(const char *dir, const char *file);
71 void pcmk__sync_directory(const char *name);
72
73 int pcmk__file_contents(const char *filename, char **contents);
74 int pcmk__write_sync(int fd, const char *contents);
75 int pcmk__set_nonblocking(int fd);
76 const char *pcmk__get_tmpdir(void);
77
78 void pcmk__close_fds_in_child(bool);
79
80
81
82
83
84
85
86
87
88
89 static inline void
90 pcmk__open_devnull(int flags)
91 {
92
93
94 (void) open("/dev/null", flags);
95 }
96
97
98
99
100
101
102
103
104
105
106
107 # define pcmk__config_err(fmt...) do { \
108 pcmk__config_error = true; \
109 crm_err(fmt); \
110 } while (0)
111
112
113
114
115
116
117
118
119 # define pcmk__config_warn(fmt...) do { \
120 pcmk__config_warning = true; \
121 crm_warn(fmt); \
122 } while (0)
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 # define pcmk__log_else(level, else_action) do { \
139 static struct qb_log_callsite *trace_cs = NULL; \
140 \
141 if (trace_cs == NULL) { \
142 trace_cs = qb_log_callsite_get(__func__, __FILE__, "log_else", \
143 level, __LINE__, 0); \
144 } \
145 if (!crm_is_callsite_active(trace_cs, level, 0)) { \
146 else_action; \
147 } \
148 } while(0)
149
150
151
152
153 int pcmk__add_mainloop_ipc(crm_ipc_t *ipc, int priority, void *userdata,
154 struct ipc_client_callbacks *callbacks,
155 mainloop_io_t **source);
156
157
158
159
160 const char *pcmk__message_name(const char *name);
161
162
163
164
165 pid_t pcmk__procfs_pid_of(const char *name);
166 unsigned int pcmk__procfs_num_cores(void);
167
168
169
170
171 void crm_schema_init(void);
172 void crm_schema_cleanup(void);
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193 int pcmk__pid_active(pid_t pid, const char *daemon);
194
195 int pcmk__read_pidfile(const char *filename, pid_t *pid);
196 int pcmk__pidfile_matches(const char *filename, pid_t expected_pid,
197 const char *expected_name, pid_t *pid);
198 int pcmk__lock_pidfile(const char *filename, const char *name);
199
200
201
202
203
204 #define PCMK__OP_FMT "%s_%s_%u"
205
206 char *pcmk__op_key(const char *rsc_id, const char *op_type, guint interval_ms);
207 char *pcmk__notify_key(const char *rsc_id, const char *notify_type,
208 const char *op_type);
209 char *pcmk__transition_key(int transition_id, int action_id, int target_rc,
210 const char *node);
211 void pcmk__filter_op_for_digest(xmlNode *param_set);
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231 static inline uint64_t
232 pcmk__set_flags_as(const char *function, int line, uint8_t log_level,
233 const char *flag_type, const char *target,
234 uint64_t flag_group, uint64_t flags, const char *flags_str)
235 {
236 uint64_t result = flag_group | flags;
237
238 if (result != flag_group) {
239 do_crm_log_unlikely(log_level,
240 "%s flags 0x%.8llx (%s) for %s set by %s:%d",
241 ((flag_type == NULL)? "Group of" : flag_type),
242 (unsigned long long) flags,
243 ((flags_str == NULL)? "flags" : flags_str),
244 ((target == NULL)? "target" : target),
245 function, line);
246 }
247 return result;
248 }
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265 static inline uint64_t
266 pcmk__clear_flags_as(const char *function, int line, uint8_t log_level,
267 const char *flag_type, const char *target,
268 uint64_t flag_group, uint64_t flags, const char *flags_str)
269 {
270 uint64_t result = flag_group & ~flags;
271
272 if (result != flag_group) {
273 do_crm_log_unlikely(log_level,
274 "%s flags 0x%.8llx (%s) for %s cleared by %s:%d",
275 ((flag_type == NULL)? "Group of" : flag_type),
276 (unsigned long long) flags,
277 ((flags_str == NULL)? "flags" : flags_str),
278 ((target == NULL)? "target" : target),
279 function, line);
280 }
281 return result;
282 }
283
284
285
286 void pcmk__daemonize(const char *name, const char *pidfile);
287 void pcmk__panic(const char *origin);
288 pid_t pcmk__locate_sbd(void);
289
290 extern int pcmk__score_red;
291 extern int pcmk__score_green;
292 extern int pcmk__score_yellow;
293
294
295
296
297
298
299
300
301
302
303
304
305
306 static inline void *
307 pcmk__realloc(void *ptr, size_t size)
308 {
309 void *new_ptr;
310
311
312 CRM_ASSERT(size > 0);
313
314 new_ptr = realloc(ptr, size);
315 if (new_ptr == NULL) {
316 free(ptr);
317 abort();
318 }
319 return new_ptr;
320 }
321
322
323
324
325 GQuark pcmk__rc_error_quark(void);
326 GQuark pcmk__exitc_error_quark(void);
327
328 #define PCMK__RC_ERROR pcmk__rc_error_quark()
329 #define PCMK__EXITC_ERROR pcmk__exitc_error_quark()
330
331 static inline char *
332 pcmk__getpid_s(void)
333 {
334 return crm_strdup_printf("%lu", (unsigned long) getpid());
335 }
336
337
338 static inline bool
339 pcmk__list_of_1(GList *list)
340 {
341 return list && (list->next == NULL);
342 }
343
344
345 static inline bool
346 pcmk__list_of_multiple(GList *list)
347 {
348 return list && (list->next != NULL);
349 }
350
351
352
353 #define PCMK__FAIL_COUNT_PREFIX "fail-count"
354 #define PCMK__LAST_FAILURE_PREFIX "last-failure"
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373 static inline char *
374 pcmk__fail_attr_name(const char *prefix, const char *rsc_id, const char *op,
375 guint interval_ms)
376 {
377 CRM_CHECK(prefix && rsc_id && op, return NULL);
378 return crm_strdup_printf("%s-%s#%s_%u", prefix, rsc_id, op, interval_ms);
379 }
380
381 static inline char *
382 pcmk__failcount_name(const char *rsc_id, const char *op, guint interval_ms)
383 {
384 return pcmk__fail_attr_name(PCMK__FAIL_COUNT_PREFIX, rsc_id, op,
385 interval_ms);
386 }
387
388 static inline char *
389 pcmk__lastfailure_name(const char *rsc_id, const char *op, guint interval_ms)
390 {
391 return pcmk__fail_attr_name(PCMK__LAST_FAILURE_PREFIX, rsc_id, op,
392 interval_ms);
393 }
394
395
396 int pcmk__effective_rc(int rc);
397
398 #endif