register_fsa_input_adv(msg_data->fsa_cause, I_NULL, NULL, A_TE_CANCEL, FALSE, __FUNCTION__);
if(need_transition(fsa_state)) { register_fsa_action(A_TE_CANCEL); }
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){	oc_node_t member;	gpointer a_node = NULL;	ha_msg_input_t *welcome = fsa_typed_data(fsa_dt_ha_msg);	const char *join_to = NULL;	if(welcome == NULL) {		crm_err("Attempt to send welcome message "			"without a message to reply to!");		return I_NULL;	}		join_to = cl_get_string(welcome->msg, F_CRM_HOST_FROM);	if(a_node != NULL	   && (cur_state == S_INTEGRATION || cur_state == S_FINALIZE_JOIN)) {		/* 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_info("Re-offering membership to %s...", join_to);	}	crm_debug("Processing annouce request from %s in state %s",		  join_to, fsa_state2string(cur_state));	/* always offer to the DC (ourselves)	 * this ensures the correct value for max_generation_from	 */	member.node_uname = crm_strdup(fsa_our_uname);	join_send_offer(NULL, &member, NULL);	crm_free(member.node_uname);		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_adv(msg_data->fsa_cause, I_NULL, NULL,			       A_TE_CANCEL, FALSE, __FUNCTION__);	/* dont waste time by invoking the pe yet; */	crm_debug("1) Waiting on %d outstanding join acks",		  g_hash_table_size(welcomed_nodes));		return I_NULL;}