startTimer(election_trigger);
do_ccm_event(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 return_input = I_NULL;	const oc_ev_membership_t *oc = ((struct ccm_data *)data)->oc;	oc_ed_t event = *((struct ccm_data *)data)->event;	FNIN();	cl_log(LOG_INFO,"event=%s", 	       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");		if(CCM_EVENT_DETAIL) {		ccm_event_detail(oc, event);	}	if (OC_EV_MS_EVICTED == event) {		/* get out... NOW! */		return_input = I_SHUTDOWN;	}		if(return_input == I_SHUTDOWN) {		; /* ignore everything, the new DC will handle it */	} else {		/* My understanding is that we will never get both		 * node leaving *and* node joining callbacks at the		 * same time.		 *		 * This logic would need to change if this is not		 * the case		 */		if(oc->m_n_out !=0) {			return_input = I_NODE_LEFT;			/* set a time in which we expect to hear from the DC			 */			startTimer(election_trigger);		} else if(oc->m_n_in !=0) {			/* delay the I_NODE_JOIN until they acknowledge our			 * DC status and send us their CIB			 */			return_input = I_NULL;		} else {			;			/* so what happened??  why are we here? */		}	}	FNRET(return_input);}