blob: 5cc4ecaf273a9f97ddc9143c4d2f43a786e1a079 [file] [log] [blame] [edit]
/*
* Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AIS_CRM_UTILS__H
# define AIS_CRM_UTILS__H
# include <syslog.h>
# ifdef AIS_WHITETANK
# include <openais/service/objdb.h>
# include <openais/service/print.h>
# define OPENAIS_EXTERNAL_SERVICE insane_ais_header_hack_in__totem_h
# include <openais/saAis.h>
# include <openais/service/swab.h>
# include <openais/totem/totempg.h>
# include <openais/service/service.h>
# include <openais/lcr/lcr_comp.h>
# include <openais/lcr/lcr_ifact.h>
# include <openais/service/config.h>
# define COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED OPENAIS_FLOW_CONTROL_NOT_REQUIRED
/* New names for old things */
typedef unsigned int hdb_handle_t;
# define corosync_api_v1 objdb_iface_ver0
# define corosync_lib_handler openais_lib_handler
# define corosync_exec_handler openais_exec_handler
# define corosync_service_engine openais_service_handler
extern int openais_response_send(void *conn, void *msg, int mlen);
extern int openais_dispatch_send(void *conn, void *msg, int mlen);
# endif
# ifdef SUPPORT_COROSYNC
# include <corosync/corodefs.h>
# include <corosync/swab.h>
# include <corosync/hdb.h>
# include <corosync/engine/objdb.h>
# include <corosync/engine/coroapi.h>
# include <corosync/engine/logsys.h>
# include <corosync/lcr/lcr_comp.h>
LOGSYS_DECLARE_SUBSYS("pcmk");
# endif
/* #include "plugin.h" */
# define SIZEOF(a) (sizeof(a) / sizeof(a[0]))
typedef struct crm_child_s {
int pid;
long flag;
long flags;
int start_seq;
int respawn_count;
gboolean respawn;
const char *name;
const char *uid;
const char *command;
void *conn;
void *async_conn;
} crm_child_t;
extern void destroy_ais_node(gpointer data);
extern void delete_member(uint32_t id, const char *uname);
extern int update_member(unsigned int id, uint64_t born, uint64_t seq, int32_t votes,
uint32_t procs, const char *uname, const char *state, const char *version);
extern const char *member_uname(uint32_t id);
extern char *append_member(char *data, crm_node_t * node);
extern void member_loop_fn(gpointer key, gpointer value, gpointer user_data);
extern gboolean stop_child(crm_child_t * child, int signal);
extern gboolean spawn_child(crm_child_t * child);
extern void swap_sender(AIS_Message * msg);
extern char *get_ais_data(const AIS_Message * msg);
extern gboolean route_ais_message(const AIS_Message * msg, gboolean local);
extern gboolean process_ais_message(const AIS_Message * msg);
extern int send_plugin_msg(enum crm_ais_msg_types type, const char *host, const char *data);
extern int send_client_msg(void *conn, enum crm_ais_msg_class class,
enum crm_ais_msg_types type, const char *data);
extern void send_member_notification(void);
extern void log_ais_message(int level, const AIS_Message * msg);
extern hdb_handle_t config_find_init(struct corosync_api_v1 *config, char *name);
extern hdb_handle_t config_find_next(struct corosync_api_v1 *config, char *name,
hdb_handle_t top_handle);
extern void config_find_done(struct corosync_api_v1 *config, hdb_handle_t local_handle);
extern int get_config_opt(struct corosync_api_v1 *config,
hdb_handle_t object_service_handle,
char *key, char **value, const char *fallback);
extern int ais_get_boolean(const char *s);
extern long long ais_get_int(const char *text, char **end_text);
extern char *ais_concat(const char *prefix, const char *suffix, char join);
extern int send_client_ipc(void *conn, const AIS_Message * ais_msg);
extern GHashTable *membership_list;
extern pthread_t crm_wait_thread;
extern int plugin_log_level;
extern char *local_uname;
extern int local_uname_len;
extern unsigned int local_nodeid;
static inline const char *
level2char(int level)
{
switch (level) {
case LOG_CRIT:
return "CRIT";
case LOG_ERR:
return "ERROR";
case LOG_WARNING:
return "WARN";
case LOG_NOTICE:
return "notice";
case LOG_INFO:
return "info";
}
return "debug";
}
# define do_ais_log(level, fmt, args...) do { \
if(plugin_log_level < (level)) { \
continue; \
} else if((level) > LOG_DEBUG) { \
log_printf(LOG_DEBUG, "debug%d: %s: " fmt, \
level-LOG_INFO, __FUNCTION__ , ##args); \
} else { \
log_printf(level, "%s: %s: " fmt, level2char(level), \
__FUNCTION__ , ##args); \
} \
} while(0)
# define ais_perror(fmt, args...) log_printf( \
LOG_ERR, "%s: " fmt ": (%d) %s", \
__FUNCTION__ , ##args, errno, strerror(errno))
# define ais_crit(fmt, args...) do_ais_log(LOG_CRIT, fmt , ##args)
# define ais_err(fmt, args...) do_ais_log(LOG_ERR, fmt , ##args)
# define ais_warn(fmt, args...) do_ais_log(LOG_WARNING, fmt , ##args)
# define ais_notice(fmt, args...) do_ais_log(LOG_NOTICE, fmt , ##args)
# define ais_info(fmt, args...) do_ais_log(LOG_INFO, fmt , ##args)
# define ais_debug(fmt, args...) do_ais_log(LOG_DEBUG, fmt , ##args)
# define ais_trace(fmt, args...) do_ais_log(LOG_DEBUG+1, fmt , ##args)
# define ais_malloc0(malloc_obj, length) do { \
malloc_obj = malloc(length); \
if(malloc_obj == NULL) { \
abort(); \
} \
memset(malloc_obj, 0, length); \
} while(0)
# define ais_free(obj) do { \
if(obj) { \
free(obj); \
obj = NULL; \
} \
} while(0)
# define AIS_ASSERT(expr) if((expr) == FALSE) { \
ais_crit("Assertion failure line %d: %s", __LINE__, #expr); \
abort(); \
}
# define AIS_CHECK(expr, failure_action) if((expr) == FALSE) { \
int p = fork(); \
if(p == 0) { abort(); } \
ais_err("Child %d spawned to record non-fatal assertion failure line %d: %s", p, __LINE__, #expr); \
failure_action; \
}
static inline char *
ais_strdup(const char *src)
{
char *dup = NULL;
if (src == NULL) {
return NULL;
}
ais_malloc0(dup, strlen(src) + 1);
return strcpy(dup, src);
}
static inline gboolean
ais_str_eq(const char *a, const char *b)
{
if (a == NULL || b == NULL) {
return FALSE;
} else if (a == b) {
return TRUE;
} else if (strcasecmp(a, b) == 0) {
return TRUE;
}
return FALSE;
}
static inline int
libais_connection_active(void *conn)
{
if (conn != NULL) {
return TRUE;
}
return FALSE;
}
struct pcmk_env_s {
const char *debug;
const char *syslog;
const char *logfile;
const char *use_logd;
const char *quorum;
};
extern struct pcmk_env_s pcmk_env;
extern int pcmk_user_lookup(const char *name, uid_t * uid, gid_t * gid);
#endif