g_hash_table_insert(joined_nodes, strdup(join_from),strdup(join_from));
do_process_welcome_ack(long long action,		    enum crmd_fsa_cause cause,		    enum crmd_fsa_state cur_state,		    enum crmd_fsa_input current_input,		    void *data){	int lpc = 0, size = 0;	oc_node_t *members;	gboolean is_a_member = FALSE;	xmlNodePtr join_ack = (xmlNodePtr)data;	const char *join_from = xmlGetProp(join_ack, XML_ATTR_HOSTFROM);	FNIN();		FNIN();	members = fsa_membership_copy->members;	size = fsa_membership_copy->members_size;		for(; lpc < size; lpc++) {		const char *new_node = members[lpc].node_uname;		if(strcmp(join_from, new_node) == 0) {			is_a_member = TRUE;		}	}		if(is_a_member == FALSE) {		cl_log(LOG_ERR, "Node %s is not known to us", join_from);		FNRET(I_FAIL);	}		CRM_DEBUG2("Forwarding CIB to %s", join_from);		// add them to our list of "active" nodes		g_hash_table_insert(joined_nodes, strdup(join_from),strdup(join_from));			// TODO: clear their "block" in the CIB	/*	 * Send a message to the CIB asking what the contents are.	 *	 * Forward the ack so that the reply will be directed appropriatly	 */	xmlNodePtr cib_copy = get_cib_copy();	xmlNodePtr frag = create_cib_fragment(cib_copy, "all");	xmlNodePtr msg_options = create_xml_node(NULL, XML_TAG_OPTIONS);	set_xml_property_copy(msg_options, XML_ATTR_VERBOSE, "true");	send_request(msg_options, frag, CRM_OPERATION_STORE,		     join_from, CRM_SYSTEM_CIB);	free_xml(msg_options);		if(g_hash_table_size(joined_nodes)	   == fsa_membership_copy->members_size) {		// 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",		       size);		//dont waste time by invoking the pe yet;	}	FNRET(I_NULL);}