xmlNodePtr options = find_xml_node(join_ack, XML_TAG_OPTIONS);
xmlNodePtr options = find_xml_node(join_ack, XML_TAG_OPTIONS, TRUE);
do_dc_join_req(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){	xmlNodePtr generation;	xmlNodePtr join_ack = (xmlNodePtr)msg_data->data;	const char *ack_nack = CRMD_JOINSTATE_MEMBER;	gboolean is_a_member  = FALSE;	const char *join_from = xmlGetProp(join_ack, XML_ATTR_HOSTFROM);	const char *ref       = xmlGetProp(join_ack, XML_ATTR_REFERENCE);	xmlNodePtr options = find_xml_node(join_ack, XML_TAG_OPTIONS);	const char *op	   = xmlGetProp(options, XML_ATTR_OP);	gpointer join_node =		g_hash_table_lookup(fsa_membership_copy->members, join_from);	if(safe_str_neq(op, CRM_OP_WELCOME)) {		crm_warn("Ignoring op=%s message", op);		return I_NULL;	}	crm_debug("Processing req from %s", join_from);		if(join_node != NULL) {		is_a_member = TRUE;	}		generation = find_xml_node(join_ack, XML_CIB_TAG_GENERATION_TUPPLE);	if(cib_compare_generation(our_generation, generation) < 0) {		clear_bit_inplace(fsa_input_register, R_HAVE_CIB);		crm_debug("%s has a better generation number than us",			  join_from);		crm_xml_debug(our_generation, "Our generation");		crm_xml_debug(generation, "Their generation");		max_generation_from = join_from;	}		crm_debug("Welcoming node %s after ACK (ref %s)", join_from, ref);		if(is_a_member == FALSE) {		/* nack them now so they are not counted towards the		 * expected responses		 */		char *local_from = crm_strdup(join_from);		char *local_down = crm_strdup(CRMD_JOINSTATE_DOWN);		crm_err("Node %s is not known to us (ref %s)", join_from, ref);		finalize_join_for(local_from, local_down, NULL);		crm_free(local_from);		crm_free(local_down);				return I_FAIL;	} else if(/* some reason */ 0) {		/* NACK this client */		ack_nack = CRMD_JOINSTATE_DOWN;	}		/* add them to our list of CRMD_STATE_ACTIVE nodes	   TODO: check its not already there	*/	g_hash_table_insert(		join_requests, crm_strdup(join_from), crm_strdup(ack_nack));	if(g_hash_table_size(join_requests)	   >= fsa_membership_copy->members_size) {		crm_info("That was the last outstanding join ack");		register_fsa_input(C_FSA_INTERNAL, I_INTEGRATED, NULL);		return I_NULL;	}	/* dont waste time by invoking the PE yet; */	crm_debug("Still waiting on %d (of %d) outstanding join acks",		  fsa_membership_copy->members_size		  - g_hash_table_size(join_requests),		  fsa_membership_copy->members_size);		return I_NULL;}