fsa_lrm_conn, rid, class, type, NULL, NULL);
fsa_lrm_conn, rid, class, type, provider, params);
do_lrm_rsc_op(	lrm_rsc_t *rsc, char *rid, const char *operation, crm_data_t *msg){	lrm_op_t* op        = NULL;	int call_id         = 0;	fsa_data_t *msg_data = NULL;	const char *type = NULL;	const char *class = NULL;	if(rsc != NULL) {		class = rsc->class;		type = rsc->type;			} else if(msg != NULL) {		class = get_xml_attr_nested(			msg, rsc_path, DIMOF(rsc_path) -2, XML_AGENT_ATTR_CLASS, TRUE);				type = get_xml_attr_nested(			msg, rsc_path, DIMOF(rsc_path) -2, XML_ATTR_TYPE, TRUE);	}		if(rsc == NULL) {		/* check if its already there */		CRM_DEV_ASSERT(rid != NULL);		rsc = fsa_lrm_conn->lrm_ops->get_rsc(fsa_lrm_conn, rid);	}	if(rsc == NULL) {		/* add it to the list */		crm_verbose("adding rsc %s before operation", rid);		fsa_lrm_conn->lrm_ops->add_rsc(			fsa_lrm_conn, rid, class, type, NULL, NULL);				rsc = fsa_lrm_conn->lrm_ops->get_rsc(fsa_lrm_conn, rid);	}		if(rsc == NULL) {		crm_err("Could not add resource %s to LRM", rid);		register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL);		return I_NULL;	}	/* stop the monitor before stopping the resource */	if(safe_str_eq(operation, CRMD_RSCSTATE_STOP)) {		g_hash_table_foreach(monitors, stop_recurring_action, rsc);		g_hash_table_foreach_remove(			monitors, remove_recurring_action, rsc);	}	/* now do the op */	crm_info("Performing op %s on %s", operation, rid);	crm_malloc(op, sizeof(lrm_op_t));	op->op_type   = crm_strdup(operation);	op->user_data = NULL;	if(msg != NULL) {		op->params = xml2list(msg);	} else {		CRM_DEV_ASSERT(safe_str_eq(CRMD_RSCSTATE_STOP, operation));	}	op->interval = crm_atoi(g_hash_table_lookup(op->params,"interval"),"0");	op->timeout  = crm_get_msec(g_hash_table_lookup(op->params, "timeout"));	if(op->interval < 0) {		op->interval = 0;	}	if(op->timeout < 0) {		op->timeout = 0;	}	if(safe_str_eq(operation, CRMD_RSCSTATE_MON)) {		op->target_rc = CHANGED;	} else {		op->target_rc = EVERYTIME;	}			if(safe_str_eq(CRMD_RSCSTATE_START, operation)) {		op->user_data = crm_strdup(CRMD_RSCSTATE_START_OK);			} else if(safe_str_eq(CRMD_RSCSTATE_STOP, operation)) {		op->user_data = crm_strdup(CRMD_RSCSTATE_STOP_OK);			} else if(safe_str_eq(CRMD_RSCSTATE_MON, operation)) {		op->user_data = crm_strdup(CRMD_RSCSTATE_MON_OK);			} else {		crm_warn("Using status \"complete\" for op \"%s\""			 "... this is still in the experimental stage.",			operation);		op->user_data = crm_strdup(CRMD_RSCSTATE_GENERIC_OK);	}		op->user_data_len = 1+strlen(op->user_data);	call_id = rsc->ops->perform_op(rsc, op);	if(call_id <= 0) {		crm_err("Operation %s on %s failed: %d",			operation, rid, call_id);		register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL);	} else if(call_id > 0 && op->interval > 0) {		crm_debug("Adding recurring %s op for %s", operation, rsc->id);		g_hash_table_insert(			monitors, GINT_TO_POINTER(call_id), crm_strdup(rsc->id));	}	free_lrm_op(op);			return I_NULL;}