send_request(NULL, NULL, CRM_OPERATION_WELCOME, NULL, CRM_SYSTEM_CRMD, NULL);
do_send_welcome(long long action,		enum crmd_fsa_cause cause,		enum crmd_fsa_state cur_state,		enum crmd_fsa_input current_input,		void *data){	int num_sent = 0;	FNIN();	if(action & A_JOIN_WELCOME && data == NULL) {		cl_log(LOG_ERR,		       "Attempt to send welcome message "		       "without a message to reply to!");		FNRET(I_NULL);			} else if(action & A_JOIN_WELCOME) {		xmlNodePtr welcome = (xmlNodePtr)data;		const char *join_to = xmlGetProp(welcome, XML_ATTR_HOSTFROM);		if(join_to != NULL) {/*			xmlNodePtr update =				create_node_state(new_node, "active", "active", NULL);			xmlNodePtr tmp1 = create_cib_fragment(update, NULL);			send_request(NULL, tmp1, "update", NULL, CRM_SYSTEM_DCIB);*/						send_request(NULL, NULL, CRM_OPERATION_WELCOME,				     join_to, CRM_SYSTEM_CRMD, NULL);					} else {			cl_log(LOG_ERR, "No recipient for welcome message");		}						FNRET(I_NULL);	}// welcome everyone...	/* Give everyone a chance to join before invoking the PolicyEngine */	stopTimer(integration_timer);	startTimer(integration_timer);		if(joined_nodes != NULL) {		g_hash_table_destroy(joined_nodes);		joined_nodes = g_hash_table_new(&g_str_hash, &g_str_equal);			}	// reset everyones status back to down or in_ccm in the CIB	xmlNodePtr update     = NULL;	xmlNodePtr cib_copy   = get_cib_copy();	xmlNodePtr tmp1       = get_object_root(XML_CIB_TAG_STATUS, cib_copy);	xmlNodePtr node_entry = tmp1->children;	// catch any nodes that are active in the CIB but not in the CCM list 	while(node_entry != NULL){		const char *state   = "down";		const char *node_id = xmlGetProp(node_entry, "id");		gpointer a_node =			g_hash_table_lookup(fsa_membership_copy->members, node_id);		node_entry = node_entry->next;		if(a_node != NULL || (safe_str_eq(fsa_our_uname, node_id))) {			// handled by do_update_cib_nodes()			continue;		}		tmp1 = create_node_state(node_id, state, NULL, NULL);				if(update == NULL) {			update = tmp1;		} else {			update = xmlAddSibling(update, tmp1);		}	}	// now process the CCM data	free_xml(do_update_cib_nodes(update));	free_xml(cib_copy);		g_hash_table_foreach(fsa_membership_copy->members,				     ghash_send_welcome, &num_sent);/* No point hanging around in S_INTEGRATION if we're the only ones here! */	if(num_sent == 0) {		// that was the last outstanding join ack)		cl_log(LOG_INFO,"That was the last outstanding join ack");		FNRET(I_SUCCESS);	} else {		cl_log(LOG_DEBUG,		       "Still waiting on %d outstanding join acks",		       num_sent);		//dont waste time by invoking the pe yet;	}		FNRET(I_NULL);}