13#include <sys/utsname.h>
36#include <libxml/parser.h>
37#include <libxml2/libxml/relaxng.h>
76 if (user == NULL || group == NULL) {
81 while ((grent = getgrent()) != NULL) {
82 if (grent->gr_mem == NULL) {
86 if(strcmp(group, grent->gr_name) != 0) {
90 gr_mem = grent->gr_mem;
91 while (*gr_mem != NULL) {
92 if (!strcmp(user, *gr_mem++)) {
108 struct passwd *pwentry = NULL;
111 if (buffer == NULL) {
118 *uid = pwentry->pw_uid;
121 *gid = pwentry->pw_gid;
123 crm_trace(
"User %s has uid=%d gid=%d",
name, pwentry->pw_uid, pwentry->pw_gid);
126 rc = rc? -rc : -EINVAL;
145 static uid_t daemon_uid;
146 static gid_t daemon_gid;
147 static bool found =
false;
175version_helper(
const char *text,
const char **end_text)
177 int atoi_result = -1;
183 if (text != NULL && text[0] != 0) {
190 atoi_result = (int) strtol(text, (
char **) end_text, 10);
192 if (errno == EINVAL) {
193 crm_err(
"Conversion of '%s' %c failed", text, text[0]);
210 const char *ver1_iter, *ver2_iter;
212 if (version1 == NULL && version2 == NULL) {
214 }
else if (version1 == NULL) {
216 }
else if (version2 == NULL) {
220 ver1_iter = version1;
221 ver2_iter = version2;
229 if (ver1_iter == ver2_iter) {
233 if (ver1_iter != NULL) {
234 digit1 = version_helper(ver1_iter, &ver1_iter);
237 if (ver2_iter != NULL) {
238 digit2 = version_helper(ver2_iter, &ver2_iter);
241 if (digit1 < digit2) {
245 }
else if (digit1 > digit2) {
250 if (ver1_iter != NULL && *ver1_iter ==
'.') {
253 if (ver1_iter != NULL && *ver1_iter ==
'\0') {
257 if (ver2_iter != NULL && *ver2_iter ==
'.') {
260 if (ver2_iter != NULL && *ver2_iter == 0) {
266 crm_trace(
"%s == %s (%d)", version1, version2, lpc);
268 crm_trace(
"%s < %s (%d)", version1, version2, lpc);
270 crm_trace(
"%s > %s (%d)", version1, version2, lpc);
296 crm_err(
"%s: already running [pid %lld in %s]",
297 name, (
long long)
pid, pidfile);
298 printf(
"%s: already running [pid %lld in %s]\n",
299 name, (
long long)
pid, pidfile);
305 fprintf(stderr,
"%s: could not start daemon\n",
name);
309 }
else if (
pid > 0) {
315 crm_err(
"Could not lock '%s' for %s: %s " QB_XS
" rc=%d",
317 printf(
"Could not lock '%s' for %s: %s (%d)\n",
322 umask(S_IWGRP | S_IWOTH | S_IROTH);
325 pcmk__open_devnull(O_RDONLY);
327 close(STDOUT_FILENO);
328 pcmk__open_devnull(O_WRONLY);
330 close(STDERR_FILENO);
331 pcmk__open_devnull(O_WRONLY);
334#ifdef HAVE_UUID_UUID_H
335# include <uuid/uuid.h>
341 unsigned char uuid[16];
342 char *buffer = malloc(37);
346 uuid_unparse(uuid, buffer);
374#if defined(HAVE_NANOSLEEP)
377 struct timespec req = { .tv_sec = 0, .tv_nsec = (long) (ms * 1000000) };
379 nanosleep(&req, NULL);
381#elif defined(HAVE_USLEEP)
383 usleep((useconds_t) ms);
387 struct timeval tv = { .tv_sec = 0, .tv_usec = (suseconds_t) ms };
389 select(0, NULL, NULL, NULL, &tv);
409 if (interval_ms % 1000 == 0) {
415 return g_timeout_add(interval_ms, fn,
data);
433 if (timeout_ms == 0) {
435 }
else if (timeout_ms < 1000) {
439 quot = timeout_ms / 1000;
440 rem = timeout_ms % 1000;
455_gnutls_log_func(
int level,
const char *msg)
463 signal(SIGPIPE, SIG_IGN);
464 gnutls_global_init();
465 gnutls_global_set_log_level(8);
466 gnutls_global_set_log_function(_gnutls_log_func);
493 "pacemaker-controld",
497 "pacemaker-schedulerd",
int pcmk__pidfile_matches(const char *filename, pid_t expected_pid, const char *expected_name, pid_t *pid)
int pcmk__lock_pidfile(const char *filename, const char *name)
guint pcmk__timeout_ms2s(guint timeout_ms)
guint pcmk__create_timer(guint interval_ms, GSourceFunc fn, gpointer data)
void pcmk_common_cleanup(void)
Free all memory used by libcrmcommon.
int pcmk_daemon_user(uid_t *uid, gid_t *gid)
Get user and group IDs of pacemaker daemon user.
char * crm_generate_uuid(void)
bool pcmk__config_has_error
void pcmk__daemonize(const char *name, const char *pidfile)
bool pcmk__is_user_in_group(const char *user, const char *group)
int crm_user_lookup(const char *name, uid_t *uid, gid_t *gid)
void crm_gnutls_global_init(void)
int compare_version(const char *version1, const char *version2)
bool crm_is_daemon_name(const char *name)
Check whether string represents a client name used by cluster daemons.
void pcmk__sleep_ms(unsigned int ms)
bool pcmk__config_has_warning
#define CRM_SYSTEM_TENGINE
#define CRM_SYSTEM_PENGINE
#define PCMK__PW_BUFFER_LEN
IPC interface to Pacemaker daemons.
#define CRM_TRACE_INIT_DATA(name)
#define crm_info(fmt, args...)
#define crm_perror(level, fmt, args...)
Send a system error message to both the log and stderr.
#define crm_err(fmt, args...)
#define crm_trace(fmt, args...)
void pcmk__free_common_logger(void)
Wrappers for and extensions to glib mainloop.
void mainloop_cleanup(void)
const char * pcmk_strerror(int rc)
const char * pcmk_rc_str(int rc)
Get a user-friendly description of a return code.
@ CRM_EX_ERROR
Unspecified error.
@ CRM_EX_OSERR
External (OS/environmental) problem.
_Noreturn crm_exit_t crm_exit(crm_exit_t rc)
#define pcmk__assert(expr)
#define pcmk__mem_assert(ptr)
void pcmk__schema_cleanup(void)
bool pcmk__str_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
Deprecated Pacemaker utilities.
Wrappers for and extensions to libxml2.