set_xml_property_copy(update_list, XML_ATTR_ID, fsa_our_uname);
do_ccm_update_cache(long long action,		    enum crmd_fsa_cause cause,		    enum crmd_fsa_state cur_state,		    enum crmd_fsa_input current_input,		    void *data){	enum crmd_fsa_input next_input = I_NULL;	int lpc, offset;	oc_node_t *members = NULL;	oc_ed_t event = *((struct ccm_data *)data)->event;	const oc_ev_membership_t *oc = ((struct ccm_data *)data)->oc;	oc_node_list_t *tmp = NULL, *membership_copy = (oc_node_list_t *)		cl_malloc(sizeof(oc_node_list_t));	xmlNodePtr update_list = NULL;	xmlNodePtr tmp1 = NULL;	FNIN();	set_xml_property_copy(update_list, XML_ATTR_ID, fsa_our_uname);	cl_log(LOG_INFO,"Updating CCM cache after a \"%s\" event.", 	       event==OC_EV_MS_NEW_MEMBERSHIP?"NEW MEMBERSHIP":	       event==OC_EV_MS_NOT_PRIMARY?"NOT PRIMARY":	       event==OC_EV_MS_PRIMARY_RESTORED?"PRIMARY RESTORED":	       event==OC_EV_MS_EVICTED?"EVICTED":	       "NO QUORUM MEMBERSHIP");	/*--*-- All Member Nodes --*--*/	offset = oc->m_memb_idx;	membership_copy->members_size = oc->m_n_member;	if(membership_copy->members_size > 0) {		int size = membership_copy->members_size;		size = size * sizeof(oc_node_t);		membership_copy->members = (oc_node_t *)cl_malloc(size);		members = membership_copy->members;				for(lpc=0; lpc < membership_copy->members_size; lpc++) {			members[lpc].node_id =				oc->m_array[offset+lpc].node_id;						members[lpc].node_born_on =				oc->m_array[offset+lpc].node_born_on;						members[lpc].node_uname =				cl_strdup(oc->m_array[offset+lpc].node_uname);			tmp1 = create_node_state(members[lpc].node_uname, "in_ccm", NULL, NULL);			if(update_list == NULL) {				update_list = tmp1;			} else {				update_list = xmlAddSibling(update_list, tmp1);			}					}	} else {		membership_copy->members = NULL;	}		/*--*-- New Member Nodes --*--*/	offset = oc->m_in_idx;	membership_copy->new_members_size = oc->m_n_in;	if(membership_copy->new_members_size > 0) {		int size = membership_copy->new_members_size;		size = size * sizeof(oc_node_t);		membership_copy->new_members = (oc_node_t *)cl_malloc(size);				members = membership_copy->new_members;				for(lpc=0; lpc < membership_copy->new_members_size; lpc++) {			members[lpc].node_id =				oc->m_array[offset+lpc].node_id;						members[lpc].node_born_on =				oc->m_array[offset+lpc].node_born_on;			members[lpc].node_uname =				cl_strdup(oc->m_array[offset+lpc].node_uname);			tmp1 = create_node_state(members[lpc].node_uname, "in_ccm", NULL, NULL);			if(update_list == NULL) {				update_list = tmp1;			} else {				update_list = xmlAddSibling(update_list, tmp1);			}		}	} else {		membership_copy->new_members = NULL;	}		/*--*-- Recently Dead Member Nodes --*--*/	offset = oc->m_out_idx;	membership_copy->dead_members_size = oc->m_n_out;	if(membership_copy->dead_members_size > 0) {		int size = membership_copy->dead_members_size;		size = size * sizeof(oc_node_t);		membership_copy->dead_members = (oc_node_t *)cl_malloc(size);				members = membership_copy->dead_members;		for(lpc=0; lpc < membership_copy->dead_members_size; lpc++) {			members[lpc].node_id =				oc->m_array[offset+lpc].node_id;						members[lpc].node_born_on =				oc->m_array[offset+lpc].node_born_on;						members[lpc].node_uname =				cl_strdup(oc->m_array[offset+lpc].node_uname);			tmp1 = create_node_state(members[lpc].node_uname, "down", NULL, NULL);			if(update_list == NULL) {				update_list = tmp1;			} else {				update_list = xmlAddSibling(update_list, tmp1);			}		}	} else {		membership_copy->dead_members = NULL;	}	if(AM_I_DC) {		// should be sufficient for only the DC to do this		xmlNodePtr fragment = create_cib_fragment(update_list, NULL);				send_request(NULL, fragment, CRM_OPERATION_UPDATE,			     NULL, CRM_SYSTEM_DCIB);		free_xml(fragment);	}		tmp = fsa_membership_copy;	fsa_membership_copy = membership_copy;	/* Free the old copy */	if(tmp != NULL) {		if(tmp->members != NULL)			cl_free(tmp->members);		if(tmp->new_members != NULL)			cl_free(tmp->new_members);		if(tmp->dead_members != NULL)			cl_free(tmp->dead_members);		cl_free(tmp);	}		FNRET(next_input);}