a_node = g_hash_table_lookup(join_offers, join_to); if(a_node != NULL) {
a_node = g_hash_table_lookup(join_requests, join_to); if(a_node != NULL && (cur_state == S_INTEGRATION || cur_state == S_FINALIZE_JOIN)) {
do_dc_join_offer_one(long long action,		     enum crmd_fsa_cause cause,		     enum crmd_fsa_state cur_state,		     enum crmd_fsa_input current_input,		     fsa_data_t *msg_data){	gpointer a_node = NULL;	xmlNodePtr welcome = NULL;	const char *join_to = NULL;	if(msg_data->data == NULL) {		crm_err("Attempt to send welcome message "			"without a message to reply to!");		return I_NULL;	}	welcome = (xmlNodePtr)msg_data->data;		join_to = xmlGetProp(welcome, XML_ATTR_HOSTFROM);	a_node = g_hash_table_lookup(join_offers, join_to);	if(a_node != NULL) {		/* note: it _is_ possible that a node will have been		 *  sick or starting up when the original offer was made.		 *  however, it will either re-announce itself in due course		 *  _or_ we can re-store the original offer on the client.		 */		crm_warn("Already offered membership to %s... discarding",			 join_to);		/* Make sure we end up in the correct state again */		if(g_hash_table_size(join_requests)		   >= fsa_membership_copy->members_size) {			crm_info("False alarm, returning to %s",				 fsa_state2string(S_FINALIZE_JOIN));						register_fsa_input(C_FSA_INTERNAL, I_INTEGRATED, NULL);			return I_NULL;		}					crm_debug("Still waiting on %d outstanding join acks",			  fsa_membership_copy->members_size			  - g_hash_table_size(join_requests));					} else {		oc_node_t member;		member.node_uname = crm_strdup(join_to);		join_send_offer(NULL, &member, NULL);		crm_free(member.node_uname);		/* this was a genuine join request, cancel any existing		 * transition and invoke the PE		 */		register_fsa_input_w_actions(			msg_data->fsa_cause, I_NULL, NULL, A_TE_CANCEL);	}		return I_NULL;}