1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
/* TODO: This ought to be broken up into several source files for easier
* reading and debugging. */
/* Debug oriented funtions */
static gboolean debug_level_adjust(int nsig, gpointer user_data);
static void dump_data_for_debug(void);
/* glib loop call back functions */
static gboolean on_connect_cmd(IPC_Channel* ch_cmd, gpointer user_data);
static gboolean on_connect_cbk(IPC_Channel* ch_cbk, gpointer user_data);
static int msg_type_cmp(const void *p1, const void *p2);
static gboolean on_receive_cmd(IPC_Channel* ch_cmd, gpointer user_data);
static gboolean on_repeat_op_readytorun(gpointer data);
static void on_remove_client(gpointer user_data);
static void destroy_pipe_ra_stderr(gpointer user_data);
static void destroy_pipe_ra_stdout(gpointer user_data);
/* message handlers */
static int on_msg_register(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_get_rsc_classes(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_get_rsc_types(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_get_rsc_providers(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_get_metadata(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_add_rsc(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_get_rsc(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_get_last_op(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_get_all(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_del_rsc(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_fail_rsc(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_cancel_op(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_flush_all(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_perform_op(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_get_state(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_set_lrmd_param(lrmd_client_t* client, struct ha_msg* msg);
static int on_msg_get_lrmd_param(lrmd_client_t* client, struct ha_msg* msg);
static int set_lrmd_param(const char *name, const char *value);
static int get_lrmd_param(const char *name, char *value, int maxstring);
static gboolean sigterm_action(int nsig, gpointer unused);
/* functions wrap the call to ra plugins */
static int perform_ra_op(lrmd_op_t* op);
/* Apphb related functions */
static int init_using_apphb(void);
static gboolean emit_apphb(gpointer data);
/* Utility functions */
static int flush_op(lrmd_op_t* op);
static gboolean rsc_execution_freeze_timeout(gpointer data);
static void add_op_to_runlist(lrmd_rsc_t* rsc, lrmd_op_t* op);
static int perform_op(lrmd_rsc_t* rsc);
static int unregister_client(lrmd_client_t* client);
static int on_op_done(lrmd_rsc_t* rsc, lrmd_op_t* op);
static int send_ret_msg ( IPC_Channel* ch, int rc);
static void send_cbk_msg(struct ha_msg* msg, lrmd_client_t* client);
static void send_msg(struct ha_msg* msg, lrmd_client_t* client);
static void notify_client(lrmd_op_t* op);
static lrmd_client_t* lookup_client (pid_t pid);
static lrmd_rsc_t* lookup_rsc (const char* rid);
static lrmd_rsc_t* lookup_rsc_by_msg (struct ha_msg* msg);
static int read_pipe(int fd, char ** data, gpointer user_data);
static gboolean handle_pipe_ra_stdout(int fd, gpointer user_data);
static gboolean handle_pipe_ra_stderr(int fd, gpointer user_data);
static struct ha_msg* op_to_msg(lrmd_op_t* op);
static int store_timestamps(lrmd_op_t* op);
static void reset_timestamps(lrmd_op_t* op);
static gboolean lrm_shutdown(void);
static gboolean can_shutdown(void);
static gboolean free_str_hash_pair(gpointer key
, gpointer value, gpointer user_data);
static gboolean free_str_op_pair(gpointer key
, gpointer value, gpointer user_data);
static lrmd_op_t* lrmd_op_copy(const lrmd_op_t* op);
static void send_last_op(gpointer key, gpointer value, gpointer user_data);
static void replace_last_op(lrmd_client_t* client, lrmd_rsc_t* rsc, lrmd_op_t* op);
static int record_op_completion(lrmd_rsc_t* rsc, lrmd_op_t* op);
static void to_repeatlist(lrmd_rsc_t* rsc, lrmd_op_t* op);
static void remove_op_history(lrmd_op_t* op);
static void hash_to_str(GHashTable * , GString *);
static void hash_to_str_foreach(gpointer key, gpointer value, gpointer userdata);
static void warning_on_active_rsc(gpointer key, gpointer value, gpointer user_data);
static void check_queue_duration(lrmd_op_t* op);
static gboolean flush_all(GList** listp, int client_pid);
static gboolean cancel_op(GList** listp,int cancel_op_id);
static int prepare_failmsg(struct ha_msg* msg,
int fail_rc, const char *fail_reason);
static void async_notify(gpointer key, gpointer val, gpointer data);
static gboolean client_cmp_name(gpointer key, gpointer val, gpointer app_name);
static lrmd_client_t* lookup_client_by_name(char *app_name);
static void calc_max_children(void);
/*
* following functions are used to monitor the exit of ra proc
*/
static void on_ra_proc_registered(ProcTrack* p);
static void on_ra_proc_finished(ProcTrack* p, int status
, int signo, int exitcode, int waslogged);
static const char* on_ra_proc_query_name(ProcTrack* p);
/*
* Daemon functions
*
* copy from the code of Andrew Beekhof <andrew@beekhof.net>
*/
static void usage(const char* cmd, int exit_status);
static int init_start(void);
static int init_stop(const char *pid_file);
static int init_status(const char *pid_file, const char *client_name);
static void lrmd_rsc_dump(char* rsc_id, const char * text);
|